如何配置默认将未注册的实现类型以Transient实例注入
解决方案
.NET 自带的依赖注入容器未提供全局开关直接实现「未注册类型自动按Transient生命周期注入」的能力,你可以通过以下两种方案避免漏注册的问题:
方案一:原生反射实现批量注册
无需引入第三方依赖,通过反射扫描业务程序集,批量将所有需要的实现类按Transient注册,仅当类型未手动注册时生效,不会覆盖原有配置:
using System.Reflection; using Microsoft.Extensions.DependencyInjection.Extensions; public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { // 原有手动注册逻辑保留 services.AddTransient<SqlHelper, SqlHelper>(); services.AddTransient<Helper, Helper>(); services.AddTransient<CacheHandler, CacheHandler>(); // 新增自动批量注册逻辑 // 替换为你业务代码所在的程序集,可指定多个 var businessAssembly = Assembly.GetExecutingAssembly(); // 可根据需要增加过滤条件,比如仅注册指定命名空间下的类 var implementTypes = businessAssembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.Namespace != null && t.Namespace.StartsWith("你的业务代码命名空间前缀")); foreach (var type in implementTypes) { // 仅未注册时添加Transient注册 services.TryAddTransient(type); // 如果需要同时注册对应的默认接口(比如IMyType对应MyType),可补充以下逻辑 var defaultInterface = type.GetInterface($"I{type.Name}"); if (defaultInterface != null) { services.TryAddTransient(defaultInterface, type); } } }); }
方案二:使用Scrutor扩展库简化实现
Scrutor是微软官方推荐的依赖注入扩展库,专门用于简化批量注册逻辑,代码更简洁易维护:
- 首先安装NuGet包:
Scrutor - 修改配置代码如下:
public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { // 原有手动注册逻辑保留 services.AddTransient<SqlHelper, SqlHelper>(); services.AddTransient<Helper, Helper>(); services.AddTransient<CacheHandler, CacheHandler>(); // 批量自动注册 services.Scan(scan => scan // 指定要扫描的业务程序集,可传入多个类型定位程序集 .FromAssembliesOf(typeof(SqlHelper), typeof(Helper)) // 筛选符合条件的类,可自定义过滤规则 .AddClasses(filter => filter.InNamespaces("你的业务代码命名空间前缀")) .AsSelf() // 注册为自身类型 .AsMatchingInterface() // 自动注册对应的默认接口(IMyType -> MyType) .WithTransientLifetime() // 指定生命周期为Transient .OnlyIfUnregistered() // 不覆盖手动注册的配置 ); }); }
注意事项
- 建议添加明确的过滤规则,仅注册业务逻辑相关的类,避免把DTO、实体模型、系统类等无关类型注入容器,引发不可预期的问题
- 如果你的项目对启动速度敏感,可以缩小扫描的程序集范围,避免扫描大量无关程序集导致启动变慢
内容的提问来源于stack exchange,提问作者Imran Rizvi
相关产品推荐
相关产品推荐

