我如何告诉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。
如果您不打算使用构造函数注入,那么您不妨将其从构造函数参数列表中删除,并按您的方式手动初始化它。换句话说,只需传递两个参数而不是三个。
UPDATE:你可以做的是注入null
值。据我所知,你必须做如下的事情:
_kernel.Settings.AllowNullInjection = true;
如果第三个参数存在,你可以删除它的绑定。
通过这样配置绑定,可以避免全局设置AllowNullInjection
,同时只在绑定存在时才注入参数:
Kernel.Bind<IMyClass>()
.To<MyClass>()
.WithConstructorArgument(typeof(IServiceThree), c => c.Kernel.TryGet<IServiceThree>());
为了可测试性,您需要模拟您希望表现为空的接口(在调用其方法时不做任何事情),并将其作为构造函数参数传递。
你这样做是错误的,你把测试代码依赖添加到你的生产代码中。