3

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

2 回答 2

3

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

  1. ContainerControlledLifetimeManager
  2. 外部控制的LifetimeManager
  3. 分层LifetimeManager

注意:PerResolveLifetimeManager使用 any或TransientLifetimeManagerwith 是不合适的,RegisterInstance因为它们都会在每次调用 resolve 时创建一个新实例。

取自 Unity 2.0 的官方文档,查看使用带有 RegisterInstance 方法的 Lifetime Manager 部分。

于 2013-07-27T14:01:26.777 回答
3

当您想向统一容器注册现有对象时使用 RegisterInstance。每次有对该类型的请求时,都会返回相同的对象实例(而不是新对象)。默认情况下,RegisterInstance 方法具有 ContainerControlledLifetimeManager,它在 Container 的整个生命周期内管理一个实例。

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

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

于 2014-09-10T11:12:57.507 回答