0

我有以下方法:

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 在其构造函数中获得的相同实例?

4

1 回答 1

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 的一部分(对于数组)。

于 2013-10-22T06:08:41.053 回答