一旦我尝试解决我的unitOfWork,我就会收到此错误:
“IUnitOfWork类型没有可访问的构造函数。”
但是,只有当我将unitOfWork的LifetimeManager设置为PerResolveLifetimeManager时才会发生这种情况。如果我只是使用默认的,一切正常。 我的unitOfWork,有一个公共无参数构造函数。 这是我的代码:
//Global asax
IUnityContainer unity = new UnityContainer();
unity.RegisterType<HomeController>();
unity.RegisterInstance<IUnitOfWork>(new UnitOfWork(), new PerResolveLifetimeManager());
ControllerBuilder.Current.SetControllerFactory(new IocControllerFactory(unity));
//IocControllerFactory
public class IocControllerFactory : DefaultControllerFactory
{
private readonly IUnityContainer _container;
public IocControllerFactory(IUnityContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType != null)
return _container.Resolve(controllerType) as IController;
else
return base.GetControllerInstance(requestContext, controllerType);
}
}
//Home controller constructor
public HomeController(IUnitOfWork unitOfWork)
{
}
答案 0 :(得分:3)
您可以指定以下Unity内置生命周期管理器之一 您调用
RegisterInstance
方法时的类型或自定义类型:
- ContainerControlledLifetimeManager
- ExternallyControlledLifetimeManager
- HierarchicalLifetimeManager
醇>注意:使用
PerResolveLifetimeManager
或TransientLifetimeManager
不合适RegisterInstance
因为他们都在每次通话时创建一个新实例 解决。
从Unity 2.0上的official documentation获取,请查看使用RegisterInstance方法使用Lifetime Manager的部分。
答案 1 :(得分:3)
如果要使用unity Container注册现有对象,则使用RegisterInstance。每当有此类型的请求时,将返回相同的对象实例(而不是新对象)。默认情况下,RegisterInstance方法具有ContainerControlledLifetimeManager,它在Container的生命周期内管理一个实例。
对于PerResolveLifetimeManager,每次请求解析时,都会创建一个新的对象实例。
因此,当您尝试将PerResolveLifetimeManager与RegisterInstance方法一起使用时。错误会被抛回给您。