Asp.net mvc 3 构造函数DI+Unity 2.0+解决依赖性问题

Asp.net mvc 3 构造函数DI+Unity 2.0+解决依赖性问题,asp.net-mvc-3,dependency-injection,unity-container,ioc-container,Asp.net Mvc 3,Dependency Injection,Unity Container,Ioc Container,控制器: 现在,我使用了Unity2.0应用程序块。尝试使用unity解决控制器的依赖关系,而不使用自定义控制器工厂。 我被下面的错误所困扰 当前类型DataProviderInfrastructure.IEEmployeeTask是一个 接口,无法构造。是否缺少类型映射 我不使用Unity,但我猜它会尝试使用无参数构造函数来解析依赖关系。创建这个构造函数是非常错误的。首先,它破坏了依赖项注入的目的;其次,您在其中创建了新的容器,该容器将为空,因此它显然无法解析任何依赖项。尝试从代码中删除此项:

控制器:

现在,我使用了Unity2.0应用程序块。尝试使用unity解决控制器的依赖关系,而不使用自定义控制器工厂。 我被下面的错误所困扰

当前类型DataProviderInfrastructure.IEEmployeeTask是一个 接口,无法构造。是否缺少类型映射


我不使用Unity,但我猜它会尝试使用无参数构造函数来解析依赖关系。创建这个构造函数是非常错误的。首先,它破坏了依赖项注入的目的;其次,您在其中创建了新的容器,该容器将为空,因此它显然无法解析任何依赖项。尝试从代码中删除此项:

public HomeController()
{
    _employeeTask = new UnityContainer().Resolve<IEmployeeTask>();
}

为什么会被否决?当我使用提供的代码创建了一个快速应用程序时,它工作得很好,而且从未碰到无参数构造函数。当我强迫它使用无参数构造函数时,它崩溃了,因为正如Lukas所说的,控制器中的容器实例与global.asax.cs中注册所有依赖项的容器实例不同。如果删除无参数构造函数不能解决问题,则可能是我们没有看到的原因导致了问题。Unity选择参数数量最多的构造函数,如果有其他选择,则不会选择默认构造函数。
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    var container = new UnityContainer();
    container.RegisterType<IEmployeeModelMap, EmployeeModelMap>();
    container.RegisterType<IEmployeeService, EmployeeService>();
    container.RegisterType<IEmployeeTask, EmployeeTask>();
    container.RegisterType<IEmployee, Employee>();
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
 public class UnityDependencyResolver : IDependencyResolver
 {
     readonly IUnityContainer _container;
     public UnityDependencyResolver(IUnityContainer container)
     {
         this._container = container;
     }
     public object GetService(Type serviceType)
     {
         try
         {
             return _container.Resolve(serviceType);
         }
         catch
         {
             return null;
         }
     }
     public IEnumerable<object> GetServices(Type serviceType)
     {
         try
         {
             return _container.ResolveAll(serviceType);
         }
         catch
         {
             return new List<object>();
         }
     }
 }
 public class EmployeeTask: IEmployeeTask
 {        
     IEmployeeService _employeeService;        
     IEmployeeModelMap _employeeModelMap;

     public EmployeeTask(IEmployeeService employeeService, IEmployeeModelMap employeeModelMap)
     {
         _employeeService = employeeService;
         _employeeModelMap = employeeModelMap;
     }

     public EmployeeViewModel GetEmployeeModelFromService(int empId)
     {
         return _employeeModelMap.ToModel(_employeeService.GetEmployeeFromEntities(empId));
     }
}
public HomeController()
{
    _employeeTask = new UnityContainer().Resolve<IEmployeeTask>();
}