依赖注入


依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的实现方式。

两种实现方式:

1)服务定位器(ServiceLoccator);

2)依赖注入(Dependency Injection,DI)

DI相关概念

1)服务(Service):对象 即使用者需要的内容;

2)注册服务:服务与其实现的关系;

3)服务容器:负责管理注册的服务;

4)查询服务:创建对象;

5)对象声明周期:Transient(瞬态);Scoped(范围);Singleton(单例);

.Net中使用DI(概念)

1)根据类型来注册和获取服务,可以分别指定服务类型(Service Type)和实现类型(Implementation Type)。这两者可能相同,也可能不同。服务类型可以是具体的实现类,也可以是接口,建议面向接口编程。

2).NET控制反转组件名称为:DependencyInjection,它包含ServiceLocator的功能。

.Net中使用DI(实现)

1)安装对应包并引用,Install-Package Microsoft.Extensions.DependencyInjection

2)ServiceCollection用来构造容器对象IServiceProvider。 具体调用ServiceCollection的BuildServiceProvider方法。可以用来获取调用BuildServiceProvider之前已注册的服务。

using System;
using Microsoft.Extensions.DependencyInjection;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var services = new ServiceCollection();//创建服务集合
            services.AddScoped();//注册一个瞬态服务
            services.AddScoped();//以接口、服务类型的方式注册 方式1
            //services.AddScoped(typeof(ITestService), typeof(TestServiceImp2));//以接口、服务类型的方式注册 方式2
            using (var serviceProvider = services.BuildServiceProvider())//创建一个服务提供者
            {
                var testservice = serviceProvider.GetService();
                testservice.SayHi();
            }
        }    
    }
    public interface ITestService
    {
        public string Name { get; set; }

        public void SayHi();
    }
    public class TestServiceImp1 : ITestService
    {
        public string Name { set; get; }

        public void SayHi()
        {
            Console.WriteLine($"hi,I am {Name}");
        }
    }
    public class TestServiceImp2 : ITestService
    {
        public string Name { set; get; }

        public void SayHi()
        {
            Console.WriteLine($"你好,我是{Name}");
        }
    }   
}
依赖注入例子(服务定位器)

IServiceProvider的服务定位器常用方法

1)T T? GetService() 如获取不到对象,则返回Null

2)objcet GetService(Type serviceType)  一般搭配反射使用

3)T GetRequiredService() 如果获取不到对象,则抛出异常

4)objcet GetRequiredService(Type serviceType)

5)IEnumerable GetServices() 适用于一个服务类型有多个实现对象

6)IEnumerable GetServices(Type serviceType)