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