猿问

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

我过去使用过很多不同的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在域层上工作?


三国纷争
浏览 103回答 1
1回答

ABOUTYOU

尝试在控制器中注入服务而不是注入IUnitOfWork. 然后在控制器方法中使用服务实例:public HomeController(CustomerService service){&nbsp; _service = service}public ActionResult Index(){&nbsp; var model = _service.GetAllCustomers();&nbsp; return View(model);}这应该可行,但让你的类依赖于另一个类并不是一个好主意。依赖关系应该是一个契约(接口)。您应该重构CustomerService以提取接口ICustomerService并将其注入控制器中。然后你需要在方法中将其注册到容器中RegisterDependencies:container.RegisterType<ICustomerService, CustomerService>();
随时随地看视频慕课网APP
我要回答