类构造函数需注入原始值时,如何实现依赖注入?
构造函数含原始类型参数的依赖注入注册方案
当类的构造函数需要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
相关产品推荐
相关产品推荐

