2014-09-26 121 views
2

在WebApi项目中,我有一个类SyncProductsHelper。这个类有两个属性,一个构造函数和一些方法:Ninject动态构造函数参数

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

另见http://stackoverflow.com/questions/25667834/constructor-with-multiple-arguments-with-ninject/25700827#25700827 – BatteryBackupUnit 2014-09-26 13:49:29

+1

有了'ApiController',你指的是'SyncProductController'?如果这些值在实例化时不知道,但只有在执行后才能知道,则不能使用ctor注射。你应该使用'.Initialize(...)'或者(取决于助手在做什么)方法来传递一个方法,使用'ChangeSomething'方法。 – BatteryBackupUnit 2014-09-26 13:52:04

回答

4

Ninject无法解析依赖关系iIdsId,因为它们只有在调用API方法时才能绑定,但在绑定链中已经太晚了。当您收到该方法的帖子时,SyncProductController的一个实例被实例化,然后Ninject尝试实例化一个SyncProductsHelper,但它不能,因为它不知道该位置何处或如何找到它的依赖关系。

我建议两个选项之一:

  1. 重构你的实现做出iIdsIdSyncProductsHelper法案,将让您有一个参数的构造函数一些其他的方式。也许创建一个代表iIdsId的新类,它将作为ChangeSomething的另一个参数。 SyncProductsHelper是否需要记住这些字段的状态?

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

+0

谢谢。 #1:我不完全明白,为什么我是唯一有这个问题的人。创建这样的构造函数不正常吗? :-)#2 - 这是我的代码的一个非常简化的版本。 – Thomas 2014-09-29 05:58:00

+0

以这种方式使用构造函数是完美的,但依赖注入需要自己的一套规则来指导你的类设计。我已经更新了我的答案,以帮助澄清:) – 2014-09-29 14:29:39

相关问题