依赖注入 DI
大约 1 分钟
依赖注入 DI
基本概念
- 如何设计能够进行依赖关系注入的服务:
- 避免有状态的、静态类和成员,改用单一实例服务,避免创建全局状态
- 避免在服务中直接实例化依赖类
- 不在服务中包含过多内容
- 如果一个类有过多注入依赖项,这可能表明该类拥有过多的责任并且违反了单一责任原则 (SRP)。
- 框架会为每个请求创建一个范围
- 建议:
- 避免使用服务定位器模式,需要的服务应该进行注入,而不是调用 GetService 来获取
- 避免注入需在运行时解析依赖项的工厂
- 避免静态访问
HttpContext
- 避免采用静态/全局对象,DI 是静态/全局对象访问模式的替代方法
服务注册与注入
- 使用
builder.Services
注册服务 - 服务注入:
- 通常在
Controller
中通过构造方法注入服务 - 对于低使用频率且创建比较消耗资源的服务可以在
Action
的参数中使用[FromServices]
特性注入服务
- 通常在
由各自项目负责其服务注册
所有项目中实现统一的接口用于负责服务注册,比如
IModuleServicesRegiter
IModuleServicesRegiter
中定义方法用于注册,比如Regiter(IServiceCollection services)
主程序中使用反射获取指定程序集中的
IModuleServicesRegiter
类并调用其注册方法foreach (var implType in assemblies.SelectMany(asm => asm.GetTypes()) .Where(t => !t.IsAbstract && typeof(IModuleInitializer).IsAssignableFrom(t))) { implType.Regiter(services); }