我使用的是具有工作单元设计模式的实体框架,我的类结构如下:
public interface IUnitOfWork
{
void Save();
}
public class MyContext : ObjectContext, IUnitOfWork
{
public void Save()
{
SaveChanges();
}
}
然后我将MyContext类型映射注册为:
IUnityContainer unityContainer = new UnityContainer()
.RegisterType<MyContext>(new ContainerControlledLifetimeManager());
我知道如果我做了以下事情:
unityContainer.RegisterType<IUnitOfWork, MyContext>();
IUnitOfWork unitOfWork1 = unityContainer.Resolve<IUnitOfWork>();
IUnitOfWork unitOfWork2 = unityContainer.Resolve<IUnitOfWork>();
然后unitOfWork1
与[{1}}实例相同MyContext
,因为unitOfWork2
映射到IUnitOfWork
,这是一个容器控制的实例。
但是,如果我这样做:
MyContext
然后unityContainer.RegisterType<IUnitOfWork, MyContext>("MyUnitOfWork");
IUnitOfWork unitOfWork1 = unityContainer.Resolve<IUnitOfWork>("MyUnitOfWork");
IUnitOfWork unitOfWork2 = unityContainer.Resolve<IUnitOfWork>("MyUnitOfWork");
和unitOfWork1
解析为unitOfWork2
的两个不同实例,这对我没有任何意义,因为它们都映射到MyContext,它仍然是容器控制的实例。看起来,当命名映射时,它们不会以相同的方式解析第二个类型参数。
我需要命名类型映射的原因是因为我有多个不同的MyContext
,所有这些都实现ObjectContext
,因此定义全局IUnitOfWork
类型映射是错误的。 / p>
我的问题很简单,我如何使用命名类型映射但仍保留第一个实现的功能。
N.B。我实际上在实际实现中使用了IUnitOfWork
,但PerResolveLifetimeManager
突出显示了更少代码中的重点。
修改
根据我与Daniel Hilgarth的谈话。
我通过使用ContainerControlledLifetimeManager
的依赖项属性更改类的注册来修复我的问题。
以前它是:
IUnitOfWork
但是,我采用了不同的方法,而不是解析名为unityContainer.RegisterType<Service>(new InjectionConstructor(new ResolvedParameter<IUnitOfWork>("MyUnitOfWork")));
的方法,而是直接解决了实施问题:
IUnitOfWork
感谢Daniel和TheCodeKing解释命名注册的目的:)
答案 0 :(得分:1)
只需通过终身经理:
unityContainer.RegisterType<IUnitOfWork, MyContext>(
"MyUnitOfWork", new ContainerControlledLifetimeManager());
原因:
您已将MyContext
的未命名实例注册为容器控制的实例,而非命名为实例。
答案 1 :(得分:1)
ContainerControlledLifetimeManager
强制执行单例,因此您始终可以获得相同的实例。要使用解析单例的命名实例,您需要。
unityContainer.RegisterType<IUnitOfWork, MyContext>
("MyUnitOfWork", new ContainerControlledLifetimeManager());
IUnitOfWork unitOfWork1 = unityContainer.Resolve<IUnitOfWork>("MyUnitOfWork");
IUnitOfWork unitOfWork2 = unityContainer.Resolve<IUnitOfWork>("MyUnitOfWork");