如何在主容器中注册类型,但在子容器中解析?

时间:2009-02-09 22:44:08

标签: c# dependency-injection unity-container

我有一个统一容器并使用RegisterType使用ContainerControlledLifetimeManager注册以下存储库和实现者。

public interface IPersonRepository
{
  Person GetByID(ObjectSpace objectSpace, int id);
}

使用此模式我可以同时使用同一个存储库实例的多个线程(它是一个Web应用程序),尽管每个线程使用不同的ObjectSpace(这是一个本地缓存+从DB +工作单元等获取对象的机制。但这让我感到“肮脏”,而不是好的: - )

我真正想要的是:

public interface IPersonRepository
{
  Person GetByID(int id);
}

要实现这一点,我必须创建一个子容器并使用RegisterInstance注册我的ObjectSpace。只要我这样做,这就可以正常工作:

  1. 在子容器中注册IPersonRepository
  2. 将终身经理更改为TransientLifetimeManager
  3. 我也不想这样做。 (1)只是工作太多,我想在父容器中注册一次,然后不再注册。 (2)可以工作但是如果有很多依赖项,那么所有这些都必须是瞬态的,这将导致每次我需要人员存储库时都会创建很多实例。

    所以我的问题是:有没有办法在父级中注册类型,但是要解决容器生存期实例并将其存储在子容器而不是父容器中?也许有一种使用自定义生命周期管理器的方法?

    我想要达到的目的是:

    UnityContainer unityContainer = new UnityContainer();
    //Might be a custom manager or something
    unityContainer.RegisterType<IPersonRepository, PersonRepository>
      (new ContainerControlledLifetimeManager()); 
    using (var childContainer = unityContainer.CreateChildContainer())
    {
        childContainer.RegisterInstance<ObjectSpace>(new MyObjectSpace());
        //01 Resolves a new instance inside the child container
        var repository = childContainer.Resolve<IPersonRepository>();
        //02 resolves same instance as 01
        repository = childContainer.Resolve<IPersonRepository>();
    }
    
    using (var childContainer = unityContainer.CreateChildContainer())
    {
        childContainer.RegisterInstance<ObjectSpace>(new MyObjectSpace());
        //03 Resolves a new instance inside the child container
        var repository = childContainer.Resolve<IPersonRepository>();
        //04 resolves same instance as 03
        repository = childContainer.Resolve<IPersonRepository>(); //Resolves the same instance
    }
    

1 个答案:

答案 0 :(得分:1)

自从问到一个新的HierarchicalLifetimeManager被添加到Unity后,这应该在注册类型时使用。

相关问题