在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;
}
问题是,我不知道在哪里设置我当前实现的ISyncProductsHelper需要的iId和sId参数。它们是由用户通过Post动态提供给ApiController的,所以显然我不能像其他地方一样使用WithConstructorArgument
。
这些参数对于课程来说是必不可少的,但我应该用setter方法设置它们 - 或者做什么。
答案 0 :(得分:4)
Ninject无法解析依赖项iId
和sId
,因为在调用API方法之前它们无法绑定,但到那时它在绑定链中已经太晚了。当您收到该方法的帖子时,实例化了SyncProductController
的实例,然后Ninject尝试实例化SyncProductsHelper
,但它不能,因为它不知道在哪里或如何找到它的依赖项那时候。
我建议使用以下两个选项之一:
重构您的实现,使SyncProductsHelper
以iId
和sId
以其他方式行事,以便您拥有无参数构造函数。也许创建一个代表iId
和sId
的新类,它作为ChangeSomething
的另一个参数。 SyncProductsHelper
是否需要记住这些字段的状态?
考虑不为此特定类使用依赖注入。从您的代码看起来SyncProductsHelper
纯粹只是使用原语,因此您可以直接从Web API方法创建一个新实例。您仍然可以轻松地对此类进行单元测试,因为它没有自己的任何外部依赖项。