欢迎光临
个人技术文档整理

IOC容器以及对象的生命周期设置

C# Unity IOC容器以及对象的生命周期设置

1、NuGet引入Unity和Unity.Configuration

2、

//默认注册方式:每次都构造一个新对象。
container.RegisterType<IStudentService, StudentService>();

//单例生命周期 : 通过容器构造对象,都是同一个。
container.RegisterType<IStudentService, StudentService>(new SingletonLifetimeManager());

//单线程单例  :同一个线程下同一个实例,不同线程就不同实例。
 container.RegisterType<IStudentService, StudentService>(new PerThreadLifetimeManager());  

 

默认注册方式:

        /// <summary>
        /// 默认
        /// </summary>
        private static void defaultIOC()
        {
            IUnityContainer container = new UnityContainer();//实例化容器 
            container.RegisterType<IStudentService, StudentService>();//容器注册    //默认 每次都构造一个新对象。(是瞬时生命周期 ) 

            var service = container.Resolve<IStudentService>(); //获取实例1
            var service2 = container.Resolve<IStudentService>(); //获取实例2 
            var isSame = object.ReferenceEquals(service, service2);//返回false
            Console.WriteLine($"实例对比结果={isSame}");

        }

单例生命周期

        /// <summary>
        /// 单例生命周期
        /// using Unity.Lifetime; 
        /// 一般来说:当使用单例时候,不建议自己升级单例逻辑,直接用容器单例
        /// </summary>
        private static void SingletonIOC()
        {
            IUnityContainer container = new UnityContainer();//实例化容器 
            container.RegisterType<IStudentService, StudentService>(new SingletonLifetimeManager());//容器注册  单例生命周期  
            //单例生命周期 通过容器构造对象,都是同一个。
            var service = container.Resolve<IStudentService>(); //获取实例1
            var service2 = container.Resolve<IStudentService>(); //获取实例2 
            var isSame = object.ReferenceEquals(service, service2);//返回true
            Console.WriteLine($"实例对比结果={isSame}");

        }

 单线程单例 :同一个线程下同一个实例,不同线程就不同实例。

        /// <summary>
        /// 单线程单例 :同一个线程下同一个实例,不同线程就不同实例。
        /// </summary>
        private static void PerThreadIOC()
        {
            IUnityContainer container = new UnityContainer();//实例化容器 
            container.RegisterType<IStudentService, StudentService>(new PerThreadLifetimeManager());//容器注册   单线程 单例 
            //单例生命周期 通过容器构造对象,都是同一个。

            IStudentService service = container.Resolve<IStudentService>(); //获取实例1
            IStudentService service2 = container.Resolve<IStudentService>(); //获取实例2  
            IStudentService service3 = null;
            IStudentService service4 = null;


            new Thread(o =>
            {
                Console.WriteLine($"线程={Thread.CurrentThread.ManagedThreadId},构造 service3");
                service3 = container.Resolve<IStudentService>(); //获取实例3


                new Thread(o =>
                {
                    Console.WriteLine($"线程={Thread.CurrentThread.ManagedThreadId},构造 service4");
                    service4 = container.Resolve<IStudentService>(); //获取实例4

                }).Start();


            }).Start();

 
            Thread.Sleep(200);

            //输出结果
            Console.WriteLine($"实例对比结果={object.ReferenceEquals(service, service2)}");//True
            Console.WriteLine($"实例对比结果={object.ReferenceEquals(service, service3)}"); //false
            Console.WriteLine($"实例对比结果={object.ReferenceEquals(service, service4)}"); //false
            Console.WriteLine($"实例对比结果={object.ReferenceEquals(service3, service4)}");//false

        }

 

赞(1)