Ninject动态构造函数参数
本文关键字:参数 构造函数 动态 Ninject | 更新日期: 2023-09-27 18:24:34
在WebApi项目中,我有一个类SyncProductsHelper
。这个类有两个属性,一个构造函数和一些方法:
public class SyncProductsHelper
{
public int iId { get; set; }
public string sId { get; set; }
public SyncProductsHelper(int iId, string sId)
{
this.iId = iId;
this.sId = sId;;
}
public ind ChangeSomething(int a)
{
iId = a;
}
}
现在我正试图在我的项目中启用DI,所以我安装了Ninject并进行了设置。我写了一个接口ISyncProductsHelper
:
public interface ISyncProductsHelper
{
void ChangeSomething(int a);
}
并在我的解析器中进行绑定:
_kernel.Bind<ISyncProductsHelper>().To<SyncProductsHelper>();
在使用SyncProductsHelper的控制器中,我设置了一个构造函数和一个字段:
private readonly ISyncProductsHelper _syncHelper;
public SyncProductController(ISyncProductsHelper syncHelper)
{
this._syncHelper = syncHelper;
}
问题是,我不知道在哪里设置iId和sId参数,这是我当前实现的ISyncProductsHelper所需要的。它们是由用户通过Post动态提供给ApiController的,所以显然我不能像在其他地方看到的那样使用WithConstructorArgument
。参数对类来说是必不可少的,但我应该用setter方法来设置它们吗?或者该怎么做。
Ninject无法解析依赖项iId
和sId
,因为在调用API方法之前无法绑定它们,但此时在绑定链中为时已晚。当您收到方法的帖子时,SyncProductController
的实例会被实例化,然后Ninject尝试实例化SyncProductsHelper
,但它不能,因为它不知道在哪里或如何找到它的依赖项。
我建议两种选择之一:
-
重构您的实现,使
SyncProductsHelper
以某种其他方式作用于iId
和sId
,从而允许您拥有一个无参数构造函数。也许创建一个表示iId
和sId
的新类,作为ChangeSomething
的另一个参数。SyncProductsHelper
是否需要记住这些字段的状态? -
请考虑对这个特定类根本不使用依赖项注入。从您的代码来看,
SyncProductsHelper
纯粹是在处理基元,所以您可以直接从Web API方法创建一个新实例。您仍然可以轻松地对这个类进行单元测试,因为它本身没有任何外部依赖关系。