2011-10-19 38 views
9

我試圖用Ninject將IEnumerable注入到構造函數中。使用Ninject工廠方法將IEnumerable注入到構造函數中

我的構造是這樣的:

public MatrixViewModel(IEnumerable<FooViewModel> fooViewModels) 
{ 
    _fooViewModels = fooViewModels; 
} 

我Ninject模塊如下所示:

public class MainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IEnumerable<FooViewModel>>() 
      .ToMethod(context => GetFooViewModels()) 
      .InSingletonScope(); // this binding is not working 
    } 

    private IEnumerable<FooViewModel> GetFooViewModels() 
    { 
     // returns a bunch of foo view models 
    } 
} 

這似乎並不奏效。我沒有得到任何錯誤。 Ninject不會使用綁定,並且傳遞給構造函數的值基本上只是一個空的默認值。

如何爲Ninject注入IEnumerable

編輯

更多關於我的工廠方法細節:

private IEnumerable<FooViewModel> GetFooViewModels() 
{ 
    return new[] 
    { 
     new FooViewModel 
     { 
      Bar = new BarViewModel 
      { 
       X = 1, 
       Y = 2 
      }, 
      Misc = "Hello" 
     }, 
     new FooViewModel 
     { 
      Bar = new BarViewModel 
      { 
       X = 3, 
       Y = 4 
      }, 
      Misc = "Goodbye" 
     }, 
     // etc..... 
    }; 
} 

編輯2

基於聖雷莫的回答,一個可能的解決方案是使用foreach循環綁定一次查看一個模型:

foreach (var fooViewModel in GetFooViewModels()) 
{ 
    Bind<FooViewModel>().ToConstant(fooViewModel); 
} 
+1

我不知道收集支持或'ToMethod'這樣工作。這應該可以工作:'綁定()。ToMethod(context => new MatrixViewModel(GetFooViewModels()))''。此外,您可以將自己的答案添加到您的問題,並接受它,如果雷莫的不是你想接受的水平,作爲答案。 –

+0

@Merlyn,這是一個很好的觀點......只是「走上一個關卡」並綁定整個MatrixViewModel(我的真實視圖模型有一些參數,所以綁定整個東西會有點麻煩)。至於爲什麼我沒有把我的解決方案放入答案,我可以問你同樣的事情關於你的評論:) – devuxer

+0

真:)肯定有多種有效的解決方案... –

回答

5

基於聖雷莫的回答,一個可能的解決方案是使用foreach循環到一個綁定視圖模型在同一時間:

foreach (var fooViewModel in GetFooViewModels()) 
{ 
    Bind<FooViewModel>().ToConstant(fooViewModel); 
} 
+0

這應該與原始綁定完全相同,不同之處在於在創建綁定時調用GetFooViewModels(),並且在第一次解析時調用原始綁定。 –

+0

雷莫,從我原來的約束力的另一個區別是,這一個實際上工作:)但謝謝你的後續行動。 – devuxer

+0

@Remo:我得到了NInject特殊集合集合的印象,所以它會解析集合中所有類型的綁定。如果它有特殊情況,我不會感到驚訝,如果它*沒有*解決其他方式。 OP中的行爲似乎與我的假設相符。 https://github.com/ninject/ninject/wiki/Multi-injection –

14

Ninject對枚舉類型的處理方式不同。只需提供所有視圖模型的綁定。對於枚舉項,Ninject將創建每個應用綁定的實例並將它們傳遞爲IEnumerable

例如

Bind<FooViewModel>().To<FooViewModel1>(); 
Bind<FooViewModel>().To<FooViewModel2>(); 
+0

雷莫,謝謝你的回答,但它並沒有真正解決我的情況。我的工廠方法返回一堆FooViewModel的實例,而不是從FooViewModel繼承的一堆對象。 – devuxer

+0

請參閱我的編輯。 – devuxer

+0

目前,您不能使用IEnumerable,IList,List和數組的綁定,因爲它們是專門處理的。不幸的是,你必須使用ICollection或者從IEnumerable

3

從你的問題:

Bind<IEnumerable<FooViewModel>>() 
    .ToMethod(context => GetFooViewModels()) 

我不知道收集支持或ToMethod這樣工作。

這應該會工作,雖然:

Bind<MatrixViewModel>() 
    .ToMethod(context => new MatrixViewModel(GetFooViewModels())) 

。當然,這是多麼有用的解決方案是取決於你如何建立你的看法。

+0

您正在注入您的視圖模型,因此這不適用於您的情況。但是如果你使用WPF/MVVM,並試圖將視圖模型注入到視圖中,我喜歡從視圖中刪除任何視圖模型的概念,並在'ToMethod'中設置視圖的'DataContext'。 –

+0

+1。很好的答案......我可能真的會這樣做。 – devuxer

相關問題