在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无法解析依赖项iIdsId,因为在调用您的API方法之前无法绑定它们,但是到那时绑定链为时已晚。当您收到该方法的帖子时,实例化SyncProductController的实例,然后Ninject尝试实例化SyncProductsHelper,但这不能,因为它当时不知道在哪里或如何找到其依赖项。

我建议以下两种选择之一:


重构实现,以使SyncProductsHelper以其他某种方式作用于iIdsId,这将允许您具有无参数构造函数。也许创建一个表示iIdsId的新类,它充当ChangeSomething的另一个参数。 SyncProductsHelper是否需要记住这些字段的状态?
考虑完全不为此特定类使用依赖项注入。从您的代码看来,SyncProductsHelper纯粹是在使用原语,因此您可以直接从Web API方法中创建一个新实例。您仍然可以轻松地对该类进行单元测试,因为它本身没有任何外部依赖关系。

关于c# - 动态注入(inject)构造函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26060768/

10-10 16:14