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