You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置默认将未注册的实现类型以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是微软官方推荐的依赖注入扩展库,专门用于简化批量注册逻辑,代码更简洁易维护:

  1. 首先安装NuGet包:Scrutor
  2. 修改配置代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:15:03