Ninject动态构造函数参数

时间:2014-09-26 13:27:39

标签: c# dependency-injection ninject

在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方法设置它们 - 或者做什么。

1 个答案:

答案 0 :(得分:4)

Ninject无法解析依赖项iIdsId,因为在调用API方法之前它们无法绑定,但到那时它在绑定链中已经太晚了。当您收到该方法的帖子时,实例化了SyncProductController的实例,然后Ninject尝试实例化SyncProductsHelper,但它不能,因为它不知道在哪里或如何找到它的依赖项那时候。

我建议使用以下两个选项之一:

  1. 重构您的实现,使SyncProductsHelperiIdsId以其他方式行事,以便您拥有无参数构造函数。也许创建一个代表iIdsId的新类,它作为ChangeSomething的另一个参数。 SyncProductsHelper是否需要记住这些字段的状态?

  2. 考虑不为此特定类使用依赖注入。从您的代码看起来SyncProductsHelper纯粹只是使用原语,因此您可以直接从Web API方法创建一个新实例。您仍然可以轻松地对此类进行单元测试,因为它没有自己的任何外部依赖项。