我有以下方法:
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在其构造函数中获得的相同实例吗?
答案 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(对于数组)的一部分返回。