Unity:如何跨UnityContainer类的实例确保有状态类的单例实例?

时间:2010-06-20 19:07:58

标签: dependency-injection unity-container ioc-container

我正在处理的应用程序需要动态创建对象,其中一些还使用单例实例(当然是基于生命周期管理器),因为涉及到状态(想想WCF服务会话等...... )。

只要我通过UnityContainer类的相同实例解析,一切都很好,但我想在这里蛇正在咬它自己的尾巴:

a)每个人都讨厌提供UnityContainer的单个实例的最直观的想法 -

b)同时这似乎是唯一合乎逻辑的解决方案

我的意思是,严肃地说,如果对ServiceLocator模式有如此多的仇恨,那你还有什么建议?

编辑:

好的,我找到了一个非常好的解决方案。 UnityContainer - 类可以将自身注入单例。这是一个例子(它以非常丑陋的方式编写,但它证明了我的观点):

    static void Main(string[] args)
    {
        var container = new UnityContainer().LoadConfiguration();
        var test = container.Resolve<MyDependant>();
        test.TestTheDependency();

        foreach (var registration in container.Registrations)
        {
            Console.WriteLine(registration.RegisteredType.Name);
        }

        var container2 = container.Resolve<IUnityContainer>();

        Console.WriteLine(container.GetHashCode());
        Console.WriteLine(container2.GetHashCode());
        test.ShowUnityContainerHashCode();

        var testD1 = container.Resolve<ITestDependency>();
        var testD2 = container2.Resolve<ITestDependency>();

        Console.WriteLine(testD1.GetHashCode());
        Console.WriteLine(testD2.GetHashCode());
        test.ShowTestDependencyHashCode();
    }

如果

,则显示2个块,相同哈希码的3倍
  <register type="ITestDependency" mapTo="TestDependency">
    <lifetime type="singleton"/>
  </register>
  <register type="MyDependant" />

在app.config中设置。

非常好。我认真地爱Unity。这很热门。

1 个答案:

答案 0 :(得分:1)

如果您真正必须在多个UnityContainer实例之间共享相同的实例,最好的解决方案可能是简单地解析一次,然后在所有其他UnityContainer实例中注册实例:

var f = container1.Resolve<IFoo>();
// ..
container42.RegisterInstance<IFoo>(f);
// ..

另一个替代方案是使实现成为真正的 Singleton ,但仍然在每个容器实例中注册实例。这使得它成为一个实现细节,它有一个Singleton正在运行,它消除了Singleton模式的许多缺点,因为消费者永远不会知道它。

但是,最佳解决方案仅使用单个容器。虽然我可以想到一些相当奇特的场景,其中任意数量的容器实例是合适的,但在绝大多数情况下,单个容器实例是正确的配置。