是否有任何配置告诉Unity为每个解析共享相同的实例?
class A:IA {
A(Iref @ref,IB x) {
@ref.Exec(() => x.Foo());
}
...
}
class B:IB {
IC c;
B(IC c) {
c=c
}
void Foo() { c.Bar(); }
}
class C:IC {
C(Iref @ref) // I need Unity to give me the same instance that is resolved in Class A
{
@ref....
}
void Bar() {}
...
}
我试图通过Iref
注册PerResolveLifetimeManager
,但我遇到的问题是它为所有依赖项共享相同的实例,而不是每个依赖项。
问题看起来像这样
Class FooController:Controller
{
FooController(IA test1 , IA test2)
{
// Unity resolves Iref one time so it is shared between test1 and also test2!
// but what i need is Iref instance for each IA, basically a singleton
// scoped just inside IA in order to be shared between Class A and C
}
FooController()
{
//so the only solution that resolve it properly is by forcing the resolve manually,
// the Unity container instantiates Iref for each instance (test1 and test2)
// and of course it's shared between class A and also C for each instance of IA
IA test1 = container.Resolve<IA>();
IA test2 = container.Resolve<IA>();
}
}
我的问题是有任何解决方案可以使用依赖注入来解决这个问题吗?
答案 0 :(得分:0)
您只需使用TransientLifetimeManager
和所有其他依赖类型注册IA类型,并使用它们自己的生命周期。这意味着IA可以具有单例依赖性,并且它们将被解析为单例(ContainerControlledLifetimeManager
),而IA将在每次注入时被解析。
TransientLifetimeManager。对于这个终身经理Unity创造和 为每次调用返回一个新请求类型的实例 解决或解决所有方法。默认情况下使用此生命周期管理器 对于使用RegisterType注册的所有类型,方法除非你 指定不同的终身经理。
ContainerControlledLifetimeManager,用于注册现有对象 作为单例实例。对于这个终生经理Unity返回 每次调用时注册类型或对象的相同实例 Resolve或ResolveAll方法或依赖机制注入时 实例到其他类。这个终身经理有效 实现对象的单例行为。 Unity使用这一生 默认情况下,管理器为RegisterInstance方法,如果不这样做 指定不同的终身经理。如果你想要单身行为 对于Unity在指定类型映射时将创建的对象 在配置中或使用RegisterType方法时,您必须 明确指定此生命周期管理器如果您注册了一个类型 使用配置或使用RegisterType方法进行映射,Unity 在第一次调用期间创建已注册类型的新实例 Resolve或ResolveAll方法或者当依赖机制时 将实例注入其他类。后续请求返回 同样的例子。
在这里阅读更多内容。