当Service Interface是Array时,Unity Container和ContainerControlledLifetimeManager

时间:2013-10-22 03:37:02

标签: c# dependency-injection unity-container

我有以下方法:

public void RegisterPlugin<T1>() where T1 : IWebrolePlugin
{
    try
    {
        _container.RegisterType<T1>(new ContainerControlledLifetimeManager());
        _container.RegisterType<IWebrolePlugin, T1>(typeof(T1).Name,new ContainerControlledLifetimeManager());

    }catch(Exception e)
    {
        Trace.TraceError(e.ToString());
    }
}

我的问题是,当我执行_container.Resolve()时,我得到了SomePlugin的相同实例,但是当使用以下注入构造函数时,它会解析新实例。

我还有以下注册:

  _container.RegisterType<WebsiteManager>(new InjectionConstructor(typeof(IDirectoryManager), typeof(IStore), typeof(IWebrolePlugin[])));

我的问题是IWebrolePlugin []数组是新实例。我可以做任何我的方法吗

public T GetPlugin<T>() where T : IWebrolePlugin
{
    return _container.Resolve<T>();
}

将返回WebsiteManager在其构造函数中获得的相同实例吗?

1 个答案:

答案 0 :(得分:1)

解析时,Unity首先按名称将接口映射到具体类型,并使用具体类型和名称作为BuildKey。此BuildKey用于构造和注入依赖项的所有方面(包括查找生命周期管理器)。这就是默认注册(空名称)和相同类型的命名注册导致返回不同实例的原因。

使用同一实例的最简单方法是在接口和具体类型之间对齐注册名称:

public void RegisterPlugin<T1>() where T1 : IWebrolePlugin
{
    try
    {
        _container.RegisterType<T1>(typeof(T1).Name, 
            new ContainerControlledLifetimeManager());
        _container.RegisterType<IWebrolePlugin, T1>(typeof(T1).Name);
    }
    catch (Exception e)
    {
        Trace.TraceError(e.ToString());
    }
}

public T GetPlugin<T>() where T : IWebrolePlugin
{
    return _container.Resolve<T>(typeof(T).Name);
}

这将导致为直接Resolve返回相同的实例,并作为ResolveAll(对于数组)的一部分返回。