在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
,就像我在其他地方看到的那样。这些参数对于该课程至关重要,但我应该改为使用设置方法或设置方法来设置它们。
最佳答案
Ninject无法解析依赖项iId
和sId
,因为在调用您的API方法之前无法绑定它们,但是到那时绑定链为时已晚。当您收到该方法的帖子时,实例化SyncProductController
的实例,然后Ninject尝试实例化SyncProductsHelper
,但这不能,因为它当时不知道在哪里或如何找到其依赖项。
我建议以下两种选择之一:
重构实现,以使SyncProductsHelper
以其他某种方式作用于iId
和sId
,这将允许您具有无参数构造函数。也许创建一个表示iId
和sId
的新类,它充当ChangeSomething
的另一个参数。 SyncProductsHelper
是否需要记住这些字段的状态?
考虑完全不为此特定类使用依赖项注入。从您的代码看来,SyncProductsHelper
纯粹是在使用原语,因此您可以直接从Web API方法中创建一个新实例。您仍然可以轻松地对该类进行单元测试,因为它本身没有任何外部依赖关系。
关于c# - 动态注入(inject)构造函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26060768/