2010-05-06 77 views
0

我有兩個具體類型「CategoryFilter」&「StopWordsFilter」,實現了 「IWordTokensFilter」。StructureMap IoC問題在運行時獲取實例

下面是我的設置:

ForRequestedType<IWordTokensFilter>().TheDefaultIsConcreteType<CategoryFilter>() 
      .AddInstances(x => 
      { 
       x.OfConcreteType<StopWordsFilter>(); 
      } 
     ); 

問題是,當結構圖自動注入它在我的課,BEC的運行時間。我有相同的插件類型的參數:

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter) 

我總是得到CategoryFilter在我的第一個參數,但它應該是stopWordsFilter。

我如何以正確的方式設置此?在此先感謝

回答

1

有多種可能的解決方案:

1)是否需要的ClassA的過濾器來區分呢,還是隻需要運行他們兩個?如果沒有,你可以改變的構造函數接受一個數組,這將導致IWordTokensFilter的所有已註冊的情況下被注入:

public ClassA(IWordTokensFilter[] filters) 

然後,您可以在的foreach過濾器應用它們。

2)如果您確實需要區分它們,因爲它們需要以不同的方式使用,您可以考慮使用一個標記接口來更好地描述它的用途。然後可以改變ClassA以接受IWordTokensFilter和ICategoryFilter(或任何你命名的標記接口)。使用ICategoryFilter註冊CategoryFilter,然後兩者都將被正確注入。

public ClassA(IWordTokensFilter stopWordsFilter, ICategoryFilter categoryFilter) 

3)你可以告訴StructureMap明確如何創建ClassA的:

ForRequestedType<ClassA>().TheDefault.Is.ConstructedBy(c => { 
    return new ClassA(c.GetInstance<StopWordsFilter>(), c.GetInstance<CategoryFilter>()); 
}); 

4)你可以告訴StructureMap覆蓋依賴關係ClassA的之一:

x.ForRequestedType<ClassA>().TheDefault.Is.OfConcreteType<ClassA>() 
    .CtorDependency<IWordTokensFilter>("stopWordsFilter").Is<StopWordsFilter>(); 
+0

約書亞嗨,我對你的回答非常滿意。我想選擇解決方案1,但我有很多過濾器。所以,我決定使用3或4.順便說一句,將結構映射自動注入到您的解決方案1中的數組參數的所有具體類型?..再次感謝。 – 2010-05-07 08:06:32

+0

是的,它會自動注入它知道的所有具體實例。您可以通過顯式使用AddInstances(如您的示例)來告訴它,或者在Scan中調用AddAllTypesOf。 – 2010-05-07 13:24:55

+0

再次感謝老兄。 – 2010-05-10 12:59:01