问题解决与Unity的依赖关系

时间:2013-07-27 13:38:24

标签: c# asp.net-mvc dependency-injection unity-container

一旦我尝试解决我的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)
{
}

2 个答案:

答案 0 :(得分:3)

  

您可以指定以下Unity内置生命周期管理器之一   您调用RegisterInstance方法时的类型或自定义类型:

     
      
  1. ContainerControlledLifetimeManager
  2.   
  3. ExternallyControlledLifetimeManager
  4.   
  5. HierarchicalLifetimeManager
  6.         

    注意:使用PerResolveLifetimeManagerTransientLifetimeManager不合适   RegisterInstance因为他们都在每次通话时创建一个新实例   解决。

从Unity 2.0上的official documentation获取,请查看使用RegisterInstance方法使用Lifetime Manager的部分。

答案 1 :(得分:3)

如果要使用unity Container注册现有对象,则使用RegisterInstance。每当有此类型的请求时,将返回相同的对象实例(而不是新对象)。默认情况下,RegisterInstance方法具有ContainerControlledLifetimeManager,它在Container的生命周期内管理一个实例。

对于PerResolveLifetimeManager,每次请求解析时,都会创建一个新的对象实例。

因此,当您尝试将PerResolveLifetimeManager与RegisterInstance方法一起使用时。错误会被抛回给您。