为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Unity (DI) 在控制器中工作,但在我的服务层中不起作用?

为什么 Unity (DI) 在控制器中工作,但在我的服务层中不起作用?

C#
三国纷争 2023-07-22 16:39:13
我过去使用过很多不同的DI容器,但从未使用过 Unity(特别是Unity 4.0.1)。我正在使用一个.NET MVC具有典型三层架构的普通旧应用程序。Repository -> Domain -> WebUI。我需要知道我做错了什么,以便我可以让我注册的依赖项在域层上工作。这是我的global.asax.protected void Application_Start(){    // ...    IUnityContainer container = new UnityContainer();    RegisterDependencies(container);    DependencyResolver.SetResolver(new WebApplicationDependencyResolver(container));}protected void RegisterDependencies(IUnityContainer container){    container.RegisterType<IUnitOfWork, UnitOfWork>();}这是WebApplicationDependencyResolver上面使用的:namespace WebApplication1.Infrastructure{    public class WebApplicationDependencyResolver : IDependencyResolver    {        private IUnityContainer _container;        public WebApplicationDependencyResolver(IUnityContainer container)        {            _container = container;        }        public object GetService(Type serviceType)        {            try            {                return _container.Resolve(serviceType);            }            catch (Exception)            {                return null;            }        }        public IEnumerable<object> GetServices(Type serviceType)        {            try            {                return _container.ResolveAll(serviceType);            }            catch (Exception)            {                return null;            }        }    }}我的Domain Layer类CustomerService.cs(我在它自己的项目和主项目的文件夹中使用):namespace WebApplication1.Services{    public class CustomerService    {        private readonly IUnitOfWork _uow;        public CustomerService(IUnitOfWork uow)        {            _uow = uow;        }    }}现在,当我尝试CustomerService像这样调用控制器中的类时,它不起作用:public ActionResult Index(){    var service = new CustomerService();    return View();}谁能指导我正确的方向,开始DI在域层上工作?
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

尝试在控制器中注入服务而不是注入IUnitOfWork. 然后在控制器方法中使用服务实例:


public HomeController(CustomerService service)

{

  _service = service

}


public ActionResult Index()

{

  var model = _service.GetAllCustomers();

  return View(model);

}

这应该可行,但让你的类依赖于另一个类并不是一个好主意。依赖关系应该是一个契约(接口)。您应该重构CustomerService以提取接口ICustomerService并将其注入控制器中。然后你需要在方法中将其注册到容器中RegisterDependencies:


container.RegisterType<ICustomerService, CustomerService>();


查看完整回答
反对 回复 2023-07-22
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信