如何注册命名类型映射以解析为未命名的类型映射

时间:2011-09-02 11:14:15

标签: c# unity-container

我使用的是具有工作单元设计模式的实体框架,我的类结构如下:

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解释命名注册的目的:)

2 个答案:

答案 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");