第二节 依赖注入框架:管理服务的依赖与生命周期
为什么要使用依赖注入框架?
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.避免向单例的类型注入范围的类型