.netcore中的依赖注入
IOC、DI相关概念的理解
1、依赖:简单的讲就是“引用到”。例如AccountController.cs引用到IAccountService.cs,那么AccountController依赖IAccountService。
2、依赖倒置:依赖倒置是指程序要依赖于抽象或者接口,不要依赖于具体实现(高层模块不依赖于底层模块,不依赖于具体实现,而应该依赖接口)。是六大设置原则之一。它的优势在于当高层模块变化时,底层模块无需改动,达到解耦的目的。
3、反转控制(IOC):是一种设计思想,相对于“正转控制”;所谓的“正转控制”是指类内部自行创建其依赖的类。而反转控制则是谁调用谁创建。例如类A依赖类B,那么不应该A自己创建B,而是应该由A的调用者C创建B给A使用。
4、依赖注入(DI):其实就是IOC思想的实践。就是依赖的注入。依赖注入的方式:1、构造函数注入,2、属性注入、3、方法注入
5、IOC容器:无论是反转控制还是“正转控制”,都免不了创建对象,只是改变了创建对象的时机和传递。为了优化这种对象的创建,引入了IOC容器,它相当于对象的工厂,我们只需要注册(绑定)服务与市里的关系,在需要使用时,容器自动帮我们创建,并维护对象的生命周期(创建销毁)
.netcore的依赖注入
.netcore依赖注入的实现是在Microsoft.Extensions.DependencyInjection这个程序集中。
IServiceCollection 负责注册
IServiceProvider 负责提供实例
容器中获取的实例的生命周期分为三种:
1、Transient: 每一次GetService都会创建一个新的实例(瞬时的)
2、Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)(一次请求过程)
3、Singleton :整个应用程序生命周期以内只创建一个实例(单例的)
简要代码说明
/// <summary> /// 注册容器 /// </summary> public void RegisterService() { IServiceCollection services = new ServiceCollection(); services.AddScoped<IUserManagement, UserManagement>(); //注入会话范围的 services.AddSingleton<IShippingService, CustomerShippingService>(); //注入单例 services.AddTransient<IBaseMongoRepository<EmailAccount>, EmailAccountRepository>(); //注入瞬时的,每次从service中获取都是新的一个对象 serviceProvider = services.BuildServiceProvider(); } /// <summary> /// 从容器中获取对象执行 /// </summary> public void UseService() { var userManagement = serviceProvider.GetService<IUserManagement>(); var user = userManagement.GetCurrentUser(); }
上面的代码仅仅是说明.netcore中的依赖注入容器的注册和对象获取。在WebApi项目或者web项目中,我们基本上是不需要编写从容器中获取对象来执行的,一般都是直接在controller的构造函数中声明依赖的服务接口,在startup类中注入服务。在Controller被初始化时,.netcore自动帮我们完成了注入,很方便使用。