.NET Core 3.1控制台如何实现构造函数DI注入与手动传参混合使用?
基于Ninject实现构造函数混合传参的解决方案
步骤1:修正基础代码与绑定配置
首先修正拼写错误(你之前代码里的IConfiguraiton为拼写错误,应为IConfiguration),同时调整类定义和DI绑定逻辑:
// MyClass定义,保留双参数构造函数 public class MyClass { public MyClass(IConfiguration config, int myVal) { // 业务逻辑实现 } } // Ninject绑定模块修正 public class Bindings : NinjectModule { // 配置初始化逻辑 private IConfiguration SetupConfiguration() { return new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); } public override void Load() { // 绑定IConfiguration为单例 Bind<IConfiguration>().ToMethod(ctx => SetupConfiguration()).InSingletonScope(); // MyClass绑定到自身,生命周期保持瞬态 Bind<MyClass>().ToSelf().InTransientScope(); } }
步骤2:实例化时传入自定义参数
Ninject提供ConstructorArgument类用来指定手动传入的构造参数,你只需要在调用Get<MyClass>()时传入对应的参数即可,剩下的参数会自动从DI容器中解析:
static void Main() { var kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); // 手动传入myVal参数,IConfiguration由容器自动注入 var myObj1 = kernel.Get<MyClass>(new ConstructorArgument("myVal", 1)); var myObj2 = kernel.Get<MyClass>(new ConstructorArgument("myVal", 2)); }
可选优化:使用工厂模式解耦(推荐)
如果不想在业务代码中直接依赖IKernel,可以通过抽象工厂的方式封装传参逻辑,更符合依赖倒置原则:
// 定义工厂接口 public interface IMyClassFactory { MyClass Create(int myVal); } // 绑定逻辑新增工厂绑定 Bind<IMyClassFactory>().ToFactory().InSingletonScope(); // 业务代码使用方式 public class YourBusinessService { private readonly IMyClassFactory _factory; // 注入工厂 public YourBusinessService(IMyClassFactory factory) { _factory = factory; } public void Test() { // 直接调用Create方法传自定义参数即可 var myObj1 = _factory.Create(1); var myObj2 = _factory.Create(2); } }
注:使用
ToFactory()方法需要提前安装Ninject.Extensions.FactoryNuGet包,Ninject会自动生成工厂的实现类,无需手动编码。
内容的提问来源于stack exchange,提问作者Fjalee
相关产品推荐
相关产品推荐

