我如何告诉Ninject不要注入我的构造函数参数

本文关键字:注入 我的 构造函数 参数 何告诉 Ninject | 更新日期: 2023-09-27 18:01:38

如果我有以下内容:

public MyClass(IServiceOne serviceOne, IServiceTwo serviceTwo, IServiceThree serviceThree = null)
{
  this.serviceOne = serviceOne;
  this.serviceTwo = serviceTwo;
  this.serviceThree = serviceThree ?? new ServiceThree("some-info");
}

我如何告诉Ninject绑定前两个参数,而不是IServiceThree类型的参数?这可能吗?

我想要serviceThree作为构造函数参数的原因是为了可测试性——我需要能够从我的测试中注入一个mock。

我如何告诉Ninject不要注入我的构造函数参数

如果您不打算使用构造函数注入,那么您不妨将其从构造函数参数列表中删除,并按您的方式手动初始化它。换句话说,只需传递两个参数而不是三个。

UPDATE:你可以做的是注入null值。据我所知,你必须做如下的事情:

_kernel.Settings.AllowNullInjection = true;

如果第三个参数存在,你可以删除它的绑定。

通过这样配置绑定,可以避免全局设置AllowNullInjection,同时只在绑定存在时才注入参数:

Kernel.Bind<IMyClass>()
      .To<MyClass>()
      .WithConstructorArgument(typeof(IServiceThree), c => c.Kernel.TryGet<IServiceThree>());

为了可测试性,您需要模拟您希望表现为空的接口(在调用其方法时不做任何事情),并将其作为构造函数参数传递。

你这样做是错误的,你把测试代码依赖添加到你的生产代码中。