【问题标题】:Unity: How to ensure singleton instances for stateful classes across instances of the UnityContainer class?Unity:如何跨 UnityContainer 类的实例确保有状态类的单例实例?
【发布时间】:2010-06-20 19:07:58
【问题描述】:

我正在处理的应用程序需要动态创建对象,其中一些还使用单例实例(当然,基于生命周期管理器),因为涉及状态(想想 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,说真的。这是热门的东西。

【问题讨论】:

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


    【解决方案1】:

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

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

    另一种表现形式是使实现成为真正的单例,但仍然在每个容器实例中注册实例。这使得它成为一个实现细节,有一个单例在起作用,它消除了单例模式的许多缺点,因为消费者永远不会知道它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多