【.NET Core开发实战学习笔记】依赖注入框架:管理服务的依赖与生命周期 第二节 依赖注入框架:管理服务的依赖与生命周期

为什么要使用依赖注入框架?

1. 借助依赖注入框架,我们可以轻松的管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性

2. ASP.NET Core 的整个架构中,依赖注入框架提供了对象创建和生命周期管理的核心功能,各个组件之间的互相协作,也是由依赖注入框架来实现的

ASP.NET Core中实现依赖注入框架的核心包:

Microsoft.Extensions.DependencyInjection.Abstractions 

Microsoft.Extensions.DependencyInjection

实现的核心类型:

IServiceCollection

ServiceDescriptor

IServiceProvider

IServiceScope

依赖注入的生命周期有三种,分别是:

单例Singleton:根容器生命周期内获取唯一对象

作用域Scoped:当前容器生命周期内获取唯一对象 如一个http请求生命周期内获取的是同一个对象

瞬时Transient:每次获取都获取一个新对象

依赖注入的注册方式有很多种

可以使用AddXXX系列方法,注入不同生命周期的服务,如:

泛型注入

services.AddSingleton<IMySingletonService, MySingletonService>();

//直接注入实例

services.AddSingleton<IOrderService>(new OrderService());  

//工厂方法注入 适用于组装对象或者包装对象

services.AddSingleton<IOrderService>(serviceProvider =>
{
  return new OrderServiceEx();
});

也可以使用TryAddXXX的系列方法进行尝试注入,即如果容器中已经存在某中类型的注入,则不再进行重复注入,否则进行注入,如:

services.TryAddSingleton<IOrderService, OrderServiceEx>();

services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrderService>(new OrderServiceEx()));

services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrderService>(p =>
{
  return new OrderServiceEx();
}));

还可以对已注入的服务进行替换和移除,如:

services.Replace(ServiceDescriptor.Singleton<IOrderService, OrderServiceEx>());
services.RemoveAll<IOrderService>();

依赖注入框架也支持泛型模板的方式进行注入,如:

services.AddSingleton(typeof(IGenericService<>), typeof(GenericService<>));

在使用依赖注入框架时,需要注意以下几点

1.避免通过静态属性的方式访问容器对象

2.避免在服务内部使用GetService方式来获得实例

3.避免使用静态属性存储单例,应该使用容器来管理单例对象

4.避免在服务中实例化依赖对象,应该使用依赖注入来获得依赖对象

5.避免向单例的类型注入范围的类型