c#-依赖注入-利用容器(DependencyInjection)创建依赖服务的生命周期

1 概要说明 

1.1  AddSingleton<IA, A>();//创建单实例对象
1.2  AddTransient<IB, B>();//创建临时对象

2 应用举例

2.1 例1

2.1.1 代码

using System;
using Microsoft.Extensions.DependencyInjection;

namespace 依赖注入的生命周期
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            ServiceProvider RegisterServices()
            {
                IServiceCollection services = new ServiceCollection();
                services.AddSingleton<IA, A>();
                services.AddTransient<IB, B>();
                return services.BuildServiceProvider();
            }
            using (ServiceProvider container = RegisterServices())
            {
                Console.WriteLine($"requesting {nameof(ControllerX)}");
                IA a = container.GetRequiredService<IA>();
                IA a2 = container.GetRequiredService<IA>();
                IB b = container.GetRequiredService<IB>();
                IB b2 = container.GetRequiredService<IB>();
            }

            Console.ReadLine();
        }
    }
    interface IA
    {
        void fun();
    }
    interface IB
    {
        void fun();
    }
    public class A: IA
    {
        static int createNo = 0;
        public A()
        {
            createNo++;
            Console.WriteLine("A构造:" + createNo);
        }
    }
    public class B: IB
    {
        static int createNo = 0;
        public B()
        {
            createNo++;
            Console.WriteLine("B构造:" + createNo);
        }
    }
}

2.1.2 运行结果及代码分析 

2.2 例2

2.2.1 代码

using System;
using Microsoft.Extensions.DependencyInjection;

namespace 依赖注入的生命周期
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            ServiceProvider RegisterServices()
            {
                IServiceCollection services = new ServiceCollection();
                services.AddSingleton<IA, A>();
                services.AddTransient<IB, B>();
                services.AddTransient<ControllerX>();
                //services.Add(new ServiceDescriptor(typeof(ControllerX), typeof(ControllerX), ServiceLifetime.Transient));
                return services.BuildServiceProvider();
            }
            using (ServiceProvider container = RegisterServices())
            {
                Console.WriteLine($"requesting {nameof(ControllerX)}");
                ControllerX x = container.GetRequiredService<ControllerX>();
                x.fun();

                Console.WriteLine($"requesting {nameof(ControllerX)}");
                ControllerX x2 = container.GetRequiredService<ControllerX>();
                x2.fun();

                /*
                IA a = container.GetRequiredService<IA>();
                IA a2 = container.GetRequiredService<IA>();
                IB b = container.GetRequiredService<IB>();
                IB b2 = container.GetRequiredService<IB>();
                */


            }

            Console.ReadLine();
        }
    }
    public interface IA
    {
        void fun();
    }
    public interface IB
    {
        void fun();
    }
    public class A: IA
    {
        static int createNo = 0;
        public A()
        {
            createNo++;
            Console.WriteLine("A构造:" + createNo);
        }
        public void fun()
        {
            Console.WriteLine("A调用:"+ createNo);    
        }
    }
    public class B: IB
    {
        static int createNo = 0;
        public B()
        {
            createNo++;
            Console.WriteLine("B构造:" + createNo);
        }
        public void fun()
        {
            Console.WriteLine("B调用:" + createNo);
        }
    }
    public class ControllerX
    {
        static int createNo = 0;
        private readonly IA mA;
        private readonly IB mB;
        public ControllerX(IA a, IB b)
        {
            createNo++;
            Console.WriteLine("C构造:" + createNo);
            mA = a;
            mB = b;
        }
        public void fun()
        {
            Console.WriteLine("C调用:" + createNo);
            mA.fun();
            mB.fun();
        }
    }
}

2.2.2 运行结果和代码分析 

 

2.3 例3 

2.3.1 代码 

using System;
using Microsoft.Extensions.DependencyInjection;

namespace 依赖注入的生命周期
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            ServiceProvider RegisterServices()
            {
                IServiceCollection services = new ServiceCollection();
                services.AddSingleton<IA, A>();
                //services.AddTransient<IB, B>();
                services.AddScoped<IB, B>();
                return services.BuildServiceProvider();
            }
            using (ServiceProvider container = RegisterServices())
            {
                using (IServiceScope scope1 = container.CreateScope())
                {
                    Console.WriteLine("start of scope1");
                    IA a1 = scope1.ServiceProvider.GetService<IA>();
                    IA a2 = scope1.ServiceProvider.GetService<IA>();
                    IB b = scope1.ServiceProvider.GetService<IB>();
                    IB b2 = scope1.ServiceProvider.GetService<IB>();
                }
                using (IServiceScope scope2 = container.CreateScope())
                {
                    Console.WriteLine("start of scope1");
                    IA a1 = scope2.ServiceProvider.GetService<IA>();
                    IA a2 = scope2.ServiceProvider.GetService<IA>();
                    IB b = scope2.ServiceProvider.GetService<IB>();
                    IB b2 = scope2.ServiceProvider.GetService<IB>();
                }
            }

            Console.ReadLine();
        }
    }
    public interface IA
    {
        void fun();
    }
    public interface IB
    {
        void fun();
    }
    public class A: IA
    {
        static int createNo = 0;
        public A()
        {
            createNo++;
            Console.WriteLine("A构造:" + createNo);
        }
        public void fun()
        {
            Console.WriteLine("A调用:"+ createNo);    
        }
    }
    public class B: IB
    {
        static int createNo = 0;
        public B()
        {
            createNo++;
            Console.WriteLine("B构造:" + createNo);
        }
        public void fun()
        {
            Console.WriteLine("B调用:" + createNo);
        }
    }
}

2.3.2 运行结果和代码分析 

2.4 实例4

2.4.1 代码

using System;
using Microsoft.Extensions.DependencyInjection;

namespace 依赖注入的生命周期
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            ServiceProvider RegisterServices()
            {
                IServiceCollection services = new ServiceCollection();
                services.AddSingleton<IA, A>();
                services.AddScoped<IB, B>();
                services.AddTransient<ControllerX>();
                //services.Add(new ServiceDescriptor(typeof(ControllerX), typeof(ControllerX), ServiceLifetime.Transient));
                return services.BuildServiceProvider();
            }
            using (ServiceProvider container = RegisterServices())
            {
                using (IServiceScope scope1 = container.CreateScope())
                {
                    Console.WriteLine("start of scope1");
                    ControllerX x = scope1.ServiceProvider.GetService<ControllerX>();
                    x.fun();
                }
                using (IServiceScope scope2 = container.CreateScope())
                {
                    Console.WriteLine("start of scope2");
                    ControllerX x2 = scope2.ServiceProvider.GetService<ControllerX>();
                    x2.fun();
                }

            }

            Console.ReadLine();
        }
    }
    public interface IA
    {
        void fun();
    }
    public interface IB
    {
        void fun();
    }
    public class A: IA
    {
        static int createNo = 0;
        public A()
        {
            createNo++;
            Console.WriteLine("A构造:" + createNo);
        }
        public void fun()
        {
            Console.WriteLine("A调用:"+ createNo);    
        }
    }
    public class B: IB
    {
        static int createNo = 0;
        public B()
        {
            createNo++;
            Console.WriteLine("B构造:" + createNo);
        }
        public void fun()
        {
            Console.WriteLine("B调用:" + createNo);
        }
    }
    public class ControllerX
    {
        static int createNo = 0;
        private readonly IA mA;
        private readonly IB mB;
        public ControllerX(IA a, IB b)
        {
            createNo++;
            Console.WriteLine("C构造:" + createNo);
            mA = a;
            mB = b;
        }
        public void fun()
        {
            Console.WriteLine("C调用:" + createNo);
            mA.fun();
            mB.fun();
        }
    }
}

2.4.2 运行结果和代码分析

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值