目的:讲解DependencyInjection组件实现IOC的步骤
1、添加Nuget包:Micosoft.Extensions.DependencyInjection
2、创建容器:
//创建容器 ServiceCollection services = new ServiceCollection();
3、注册:把服务注册进容器的过程
有两个概念需要说明下:
服务类型(service type):指用户根据什么类型来获取,服务类型可以时接口,也可以是类,建议使用接口,面向接口编程,更灵活
实现类型(implementation type):指真正实现服务的类到底是什么
注册时,可以服务类型和实现类型一致(两个一样的类),也可以服务类型是接口,实现类型是继承于接口的类
如下:IInterfaceA是一个接口,ImplementA是继承于接口IInterfaceA的类
//服务类型和实现类型一致 services.AddTransient<ImplementA,ImplementA>(); //服务类型和实现类型不一致 services.AddTransient<IInterfaceA, ImplementA>();
当然,注册时还有很多重载方法,比如:AddTransient(Type serviceType,implementationType),AddTransient(Type serviceType),AddTransient<Type serviceType>()等等,自己查看文档就可以了
我上面演示的注册都用了AddTransient只是为了方便说明注册的过程,实际上注册还要关注注册对象的生命周期,有以下三种:
Transient:瞬态,每次获取容器相当与new一个新的对象
Scoped:范围,在一个scope范围内是同个对象
Singleton:单例,在整个应用程序中都是同个对象
public interface IInterfaceA { string Name { get; set; } void DoSomething(); } public class ImplementA : IInterfaceA { string IInterfaceA.Name { get; set; } void IInterfaceA.DoSomething() { Console.WriteLine("我是 ImplementA,继承于IInterfaceA"); } }
static void Main(string[] args) { //创建容器 ServiceCollection services = new ServiceCollection(); //注册 //services.AddTransient<ImplementA>();//注册方式1:直接注册实现类 services.AddTransient<IInterfaceA,ImplementA>();//注册方式2:注册服务类型和对应的实现类,推荐使用 }
4、获取容器中的对象,有两种方式:
1)使用服务定位器(ServiceLocator),使用容器的BuildServiceProvider()方法获取ServiceProvider,通过ServiceProvider以下方法获取服务
T GetService<T>():如果获取不到服务,则返回null
Object GetService(Type serviceType):返回的是Object类型,使用时还需要进行类型转换,一般不用,除了在写框架时,通过反射拿到类型
T GetRequiredService<T>():Required,必须的,如果获取不到服务,则抛异常,
object GetRequiredService(Type serviceType):
IEnumerable<T> GetServices<T>():适用于可能有很多满足条件的服务
IEnumerable<object> GetServices(Type serviceType):
注意,如果容器中注册了同个服务的多个实现类型,那么使用 GetService、GetRequiredService获取服务时,都是获取到最后注入容器的实现类型
//使用服务定位方式获取容器对象 using (ServiceProvider service = services.BuildServiceProvider()) { service.GetRequiredService<IInterfaceA>(); IInterfaceA a= service.GetService<IInterfaceA>(); a.DoSomething(); }
2)通过依赖注入的方式:一般是使用构造函数注入
标签:容器,IInterfaceA,services,服务类型,注册,AddTransient,组件,DependencyInjection,IOC From: https://www.cnblogs.com/luohualiushui1173/p/17904626.html