代码之家  ›  专栏  ›  技术社区  ›  Jannik

RealStaseTimes和TrimeListTimeMaGER,它甚至可能吗?

  •  1
  • Jannik  · 技术社区  · 6 年前

    最近我们的一个开发团队开始使用依赖注入。

    我注意到的一件事是(初始化容器时)代码有很多地方,在这里使用 TransientLifetimeManager 一个例子。这个实例是由开发人员在几行之前显式创建的。

    KalenderView kalenderView = new KalenderView(new KalenderViewModel());
    unityContainer.RegisterInstance(kalenderView, new TransientLifetimeManager());
    

    就我个人而言,我会将它重写为两个registerType调用,一个用于viewmodel,一个用于view,但这引起了我的注意。

    我的问题是:代码还能做吗,我希望它能做什么? 看起来每次需要解决一个实例时,都会创建一个新的对象(粗略解释)。但那不可能是对的,不是吗?这对我来说是“魔法”,我不认为,统一可以“分析”并在注册过程中保存一个对象的状态,对吧?

    我没有发现在RealStaseTimes上是否可以使用TurrimeLIFTimeMeMaGER。因此,它会忽略给定的管理器,而使用容器控件LIFE TimeManager吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Backs    6 年前

    让我们编写一个简单的测试:

    namespace UnityTest
    {
        using System;
        using Unity;
    
        class Program
        {
            public class TestClass
            {
                public static int Version = 0;
    
                public TestClass()
                {
                    Version++;
                    Console.WriteLine(Version);
                }
            }
    
            static void Main(string[] args)
            {
                var container = new UnityContainer();
    
                var obj = new TestClass();
    
                container.RegisterInstance(obj, new TransientLifetimeManager());
    
                container.Resolve<TestClass>();
                container.Resolve<TestClass>();
                container.Resolve<TestClass>();
            }
        }
    }
    

    将输出:

    1
    2
    3
    4
    

    因此,container为每个解析创建新实例。

    您甚至可以删除注册,它将工作:

    namespace UnityTest
    {
        using System;
        using Unity;
    
        class Program
        {
            public class TestClass
            {
                public static int Version = 0;
    
                public TestClass()
                {
                    Version++;
                    Console.WriteLine(Version);
                }
            }
    
            static void Main(string[] args)
            {
                var container = new UnityContainer();
    
                container.Resolve<TestClass>();
                container.Resolve<TestClass>();
                container.Resolve<TestClass>();
            }
        }
    }
    

    将输出:

    1
    2
    3