Unity IoC配置

时间:2018-02-08 00:11:00

标签: c# .net dependency-injection inversion-of-control unity-container

是否有任何配置告诉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>();

    }
}

我的问题是有任何解决方案可以使用依赖注入来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您只需使用TransientLifetimeManager和所有其他依赖类型注册IA类型,并使用它们自己的生命周期。这意味着IA可以具有单例依赖性,并且它们将被解析为单例(ContainerControlledLifetimeManager),而IA将在每次注入时被解析。

  

TransientLifetimeManager。对于这个终身经理Unity创造和   为每次调用返回一个新请求类型的实例   解决或解决所有方法。默认情况下使用此生命周期管理器   对于使用RegisterType注册的所有类型,方法除非你   指定不同的终身经理。

  

ContainerControlledLifetimeManager,用于注册现有对象   作为单例实例。对于这个终生经理Unity返回   每次调用时注册类型或对象的相同实例   Resolve或ResolveAll方法或依赖机制注入时   实例到其他类。这个终身经理有效   实现对象的单例行为。 Unity使用这一生   默认情况下,管理器为RegisterInstance方法,如果不这样做   指定不同的终身经理。如果你想要单身行为   对于Unity在指定类型映射时将创建的对象   在配置中或使用RegisterType方法时,您必须   明确指定此生命周期管理器如果您注册了一个类型   使用配置或使用RegisterType方法进行映射,Unity   在第一次调用期间创建已注册类型的新实例   Resolve或ResolveAll方法或者当依赖机制时   将实例注入其他类。后续请求返回   同样的例子。

在这里阅读更多内容。