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动态构造函数参数

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

我建议两种选择之一:

  1. 重构您的实现,使SyncProductsHelper以某种其他方式作用于iIdsId,从而允许您拥有一个无参数构造函数。也许创建一个表示iIdsId的新类,作为ChangeSomething的另一个参数。SyncProductsHelper是否需要记住这些字段的状态?

  2. 请考虑对这个特定类根本不使用依赖项注入。从您的代码来看,SyncProductsHelper纯粹是在处理基元,所以您可以直接从Web API方法创建一个新实例。您仍然可以轻松地对这个类进行单元测试,因为它本身没有任何外部依赖关系。