C# 为什么Unity(DI)在控制器中工作,而不是在我的服务层中工作?

C# 为什么Unity(DI)在控制器中工作,而不是在我的服务层中工作?,c#,.net,inversion-of-control,unity-container,C#,.net,Inversion Of Control,Unity Container,过去我使用过很多不同的DI容器,但从未使用过Unity(特别是Unity 4.0.1) 我正在使用一个普通的老式.NETMVC应用程序,它具有典型的三层体系结构存储库->域->WebUI 我需要知道我做错了什么,这样我才能让我注册的依赖项在域层上工作。这是我的global.asax中的内容 protected void Application_Start() { // ... IUnityContainer container = new UnityContainer();

过去我使用过很多不同的
DI
容器,但从未使用过Unity(特别是
Unity 4.0.1

我正在使用一个普通的老式
.NETMVC
应用程序,它具有典型的三层体系结构<代码>存储库->域->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>();
}
我的
域层
class
CustomerService.cs
(我在它自己的项目和主项目的文件夹中都使用了它):

现在,当我尝试像这样调用控制器中的
CustomerService
类时,它不起作用:

public ActionResult Index()
{
    var service = new CustomerService();
    return View();
}
但如果我在控制器本身上使用解析器,它可以工作:

public class HomeController : Controller
{
    private IUnitOfWork _unitOfWork;

    public HomeController(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public ActionResult Index()
    {
        var service = new CustomerService(_unitOfWork);
        return View();
    }
}

有谁能告诉我正确的方向,让
DI
在域层工作吗?

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

公共家庭控制器(客户服务)
{
_服务=服务
}
公共行动结果索引()
{
var模型=_service.GetAllCustomers();
返回视图(模型);
}
这应该是可行的,但是让你的类依赖于另一个类不是一个好主意依赖项应该是契约(接口)。您应该重构
CustomerService
以提取接口
ICCustomerService
,并将该接口插入控制器中。然后您需要在方法
RegisterDependencies
中向容器注册它:

container.RegisterType<ICustomerService, CustomerService>();
container.RegisterType();

没有接受0个参数的构造函数?虽然这没有直接回答我的问题,但它确实导致了我的答案!实际上,这是我的错,因为我没有说我试图将依赖关系从存储库层解析到服务层。但解决我的问题的是,我实现了服务层到webui层的DI容器解决方案,并解决了repo->service injection的后期注入问题。谢谢你的帮助!很高兴我能帮忙。只要不在代码中的任何地方使用
dependencysolver.Current.GetService
,就可以了。要回答你的问题。。。我怀疑这就是MVC创建新控制器实例的方式。工作流中的某些位置在幕后使用冲突解决程序。这称为服务位置。如果您想正确地执行DI,请尝试避免它。
public class HomeController : Controller
{
    private IUnitOfWork _unitOfWork;

    public HomeController(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public ActionResult Index()
    {
        var service = new CustomerService(_unitOfWork);
        return View();
    }
}
container.RegisterType<ICustomerService, CustomerService>();