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

类构造函数需注入原始值时,如何实现依赖注入?

构造函数含原始类型参数的依赖注入注册方案

当类的构造函数需要int这类原始类型依赖(值来自配置、需用户设置生效且不同场景可能不同)时,可通过以下几种方式完成.NET依赖注入注册:

1. 直接读取配置注册(单一固定场景)

从配置文件中读取目标值,通过工厂方法手动解析依赖并传入参数:

// 从配置获取int值,假设配置键为"MySettings:MyIntParam"
var myIntParam = builder.Configuration.GetValue<int>("MySettings:MyIntParam");

// 注册IMainClass,手动注入依赖和int参数
builder.Services.AddSingleton<IMainClass>(serviceProvider => 
    new MyMainClass(
        serviceProvider.GetRequiredService<ISecondClass>(), 
        myIntParam
    )
);

// 其他接口注册保持不变
builder.Services.AddSingleton<ISecondClass, MySecondClass>();
builder.Services.AddSingleton<IThirdClass, MyThirdClass>();

2. 配置类封装(多配置项场景)

用强类型配置类封装配置项,通过IOptions获取配置值,更符合.NET配置规范:

// 定义配置类
public class MySettings
{
    public int MyIntParam { get; set; }
}

// 绑定配置节到配置类
builder.Services.Configure<MySettings>(builder.Configuration.GetSection("MySettings"));

// 注册IMainClass时从IOptions读取配置
builder.Services.AddSingleton<IMainClass>(serviceProvider => 
{
    var secondClass = serviceProvider.GetRequiredService<ISecondClass>();
    var settings = serviceProvider.GetRequiredService<IOptions<MySettings>>().Value;
    return new MyMainClass(secondClass, settings.MyIntParam);
});

// 其他依赖注册不变
builder.Services.AddSingleton<ISecondClass, MySecondClass>();
builder.Services.AddSingleton<IThirdClass, MyThirdClass>();

3. 工厂模式(动态多场景)

如果不同场景需要不同的int值,通过工厂模式动态生成实例,灵活度最高:

// 定义工厂接口
public interface IMainClassFactory
{
    IMainClass Create(int myIntParam);
}

// 实现工厂类,注入依赖接口
public class MainClassFactory : IMainClassFactory
{
    private readonly ISecondClass _secondClass;

    public MainClassFactory(ISecondClass secondClass)
    {
        _secondClass = secondClass;
    }

    public IMainClass Create(int myIntParam)
    {
        return new MyMainClass(_secondClass, myIntParam);
    }
}

// 注册工厂及基础依赖
builder.Services.AddSingleton<ISecondClass, MySecondClass>();
builder.Services.AddSingleton<IThirdClass, MyThirdClass>();
builder.Services.AddSingleton<IMainClassFactory, MainClassFactory>();

// 使用时通过工厂生成不同实例
// var factory = serviceProvider.GetRequiredService<IMainClassFactory>();
// var instance1 = factory.Create(100);
// var instance2 = factory.Create(200);

内容的提问来源于stack exchange,提问作者Álvaro García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:55:20