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

如何在带有基类的C#类中使用依赖注入(DI)?

针对基类+接口场景的DI优化方案

你的代码结构本身是可行的,同时实现接口+继承基类完全符合C#和DI的设计逻辑。针对你的场景,有几个实用的优化方向:

1. 用强类型配置替代直接注入IConfiguration

你现在每个子类都要手动传递IConfiguration给基类,不仅冗余,还会让代码依赖松散的配置字符串,容易出错。可以把配置绑定到强类型模型,再注入给基类:

步骤示例:

首先定义对应配置的强类型类:

public class SetupSettings
{
    // 对应你配置文件里的字段,比如appsettings.json里的Setup节点
    public string ServiceEndpoint { get; set; }
    public int RetryCount { get; set; }
}

修改基类,注入强类型配置:

public abstract class BaseSetupClass
{
    protected readonly SetupSettings _settings;

    protected BaseSetupClass(SetupSettings settings)
    {
        _settings = settings;
        // 这里用强类型配置完成初始化逻辑,不用再解析字符串
    }
}

子类实现接口时,只需要注入自己的业务依赖+强类型配置(不用再传IConfiguration):

public interface ISomeActor
{
    void ExecuteTask();
}

public class SomeActor(ILogger<SomeActor> logger, SetupSettings settings) 
    : BaseSetupClass(settings), ISomeActor
{
    public void ExecuteTask()
    {
        logger.LogInformation($"使用配置端点:{_settings.ServiceEndpoint}");
        // 业务逻辑
    }
}

在Program.cs里绑定配置并注册:

// 绑定配置文件的Setup节点到强类型类
var setupSettings = new SetupSettings();
builder.Configuration.GetSection("Setup").Bind(setupSettings);
builder.Services.AddSingleton(setupSettings);

// 正常注册接口和实现类
builder.Services.AddTransient<ISomeActor, SomeActor>();

这样做的好处是:类型安全、减少重复代码、基类和子类的职责更清晰。

2. 批量注册子类(子类数量较多时)

如果有十几个甚至更多继承自BaseSetupClass且对应接口的类,一个个写AddTransient会很繁琐。可以用反射批量扫描并注册:

// Program.cs中添加批量注册逻辑
using System.Reflection;

var currentAssembly = Assembly.GetExecutingAssembly();
// 筛选所有非抽象、继承自BaseSetupClass且实现了至少一个接口的类
var setupServiceTypes = currentAssembly.GetTypes()
    .Where(t => !t.IsAbstract 
                && t.IsSubclassOf(typeof(BaseSetupClass))
                && t.GetInterfaces().Any());

foreach (var type in setupServiceTypes)
{
    // 取类实现的第一个接口(如果一个类实现多个接口,可根据需求调整逻辑)
    var targetInterface = type.GetInterfaces().First();
    builder.Services.AddTransient(targetInterface, type);
}

注意:如果你的类实现了多个接口,需要调整筛选逻辑,比如只注册命名符合IXXX规则的业务接口。

3. 修正小错误:AddTransient拼写

你的示例里写的AddTransiant是拼写错误,正确的方法名是AddTransient,这个要注意,否则会编译报错。


总结:你的原始写法本身是有效的,这些优化是根据实际场景选择的——如果子类数量少,手动注册+直接传IConfiguration完全够用;如果追求类型安全和代码整洁,强类型配置更合适;子类多的话,批量注册能节省大量重复代码。

内容的提问来源于stack exchange,提问作者CrystalBlue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:20:22