我有一个统一容器并使用RegisterType
使用ContainerControlledLifetimeManager
注册以下存储库和实现者。
public interface IPersonRepository
{
Person GetByID(ObjectSpace objectSpace, int id);
}
使用此模式我可以同时使用同一个存储库实例的多个线程(它是一个Web应用程序),尽管每个线程使用不同的ObjectSpace
(这是一个本地缓存+从DB +工作单元等获取对象的机制。但这让我感到“肮脏”,而不是好的: - )
我真正想要的是:
public interface IPersonRepository
{
Person GetByID(int id);
}
要实现这一点,我必须创建一个子容器并使用RegisterInstance
注册我的ObjectSpace
。只要我这样做,这就可以正常工作:
IPersonRepository
TransientLifetimeManager
我也不想这样做。 (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
}
答案 0 :(得分:1)
自从问到一个新的HierarchicalLifetimeManager
被添加到Unity后,这应该在注册类型时使用。