Asp.Net Core 控制反转生命周期 学习

using System;
using Microsoft.Extensions.DependencyInjection;//导入控制反转中间件
namespace IOC
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();//服务集合

            //添加服务 *************************
            /// services.AddTransient<TestService1>();   //1.瞬态 拿到2个对象
            ///services.AddSingleton<TestService1>();//2.单例  同一个对象
            services.AddScoped<TestService1>(); //3.范围  

            //实现IDisposable接口  using 防止资源泄露
            //ServiceProvider==服务定位器 ****************************************
            using ( ServiceProvider provider = services.BuildServiceProvider())
                {
                /* TestService1 t1= provider.GetService<TestService1>();//向 服务定位器要服务
                  t1.Name = "sasa";
                  t1.SayHi();

                  TestService1 t2 = provider.GetService<TestService1>();//向 服务定位器要服务
                  Console.WriteLine(object.ReferenceEquals(t1,t2));
                  t2.Name = "okok";
                  t2.SayHi();

                  t1.SayHi();*/
                TestService1 f1;
                using (IServiceScope scope = provider.CreateScope()) //3.范围  
                {
                    //在scope中获取Scope相关的对象, scope.ServiceProvider 而不是provider
                   // scope.ServiceProvider.GetRequiredService

                           TestService1 t1= scope.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
                            t1.Name = "sasa";
                                 t1.SayHi();
                          TestService1 t2 = scope.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
                    Console.WriteLine(object.ReferenceEquals(t1, t2));
                    f1 = t1;
                }
                using (IServiceScope scope2 = provider.CreateScope()) //3.范围  范围内是同对象  出就不是一个对象
                {
                    //在scope中获取Scope相关的对象, scope2.ServiceProvider 而不是provider
                    // scope.ServiceProvider.GetRequiredService

                    TestService1 t1 = scope2.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
                    t1.Name = "sasa";
                    t1.SayHi();
                    TestService1 t2 = scope2.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
                    Console.WriteLine(object.ReferenceEquals(t1, t2));
                    Console.WriteLine(object.ReferenceEquals(f1, t2));
                }

                Console.Read(); 
            }
        }
        public interface ITestService
        {
            public string Name { get; set; }
            public void SayHi();
        }

        //如果类实现IDisposable接口离开作用域会自动调用 
        public class TestService1 : ITestService,IDisposable
        {

            public string Name { get; set; }

            public void Dispose()
            {
                Console.WriteLine("*********");
            }

            public void SayHi() 
            {
                Console.WriteLine($"Hello {Name}");
            }
        }

        public class TestService2 : ITestService
        {
            public string Name { get; set; }
            public void SayHi()
            {
                Console.WriteLine($"Hello World!{Name}");
            }

        }
    }
} 

 

posted @ 2021-08-04 16:46  不科学的烤面筋  阅读(118)  评论(0)    收藏  举报