我有一个统一容器并使用RegisterType
使用以下方法注册以下存储库和实现者ContainerControlledLifetimeManager
.
public interface IPersonRepository
{
Person GetByID(ObjectSpace objectSpace, int id);
}
使用这种模式,我可以让多个线程(它是一个 Web 应用程序)同时使用同一个存储库实例,尽管每个线程都使用不同的存储库实例ObjectSpace
(这是一种本地缓存+用于从数据库获取对象的机制+工作单元等)。但这让我感觉“肮脏”,而不是好的感觉:-)
我真正想要的是:
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
}
自从提出新问题以来HierarchicalLifetimeManager
已经添加到Unity中,注册类型时应该使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)