2011-02-10 50 views
1

我有一個控制器,使用MEF導出並由Controller工廠加載。MVC3 ImportMany對於導出控制器的構造函數參數

[Export(Controller)] 
    public class MyController : Controller 
    { 

     private IRepository MyRepsoitory; 

     [ImportMany] 
     public IEnumerable<MyImportedItem> TestImportItems {get;set;} 

     public MyController([ImportMany]IEnumberable<MyImportedItem> items, [Import]IRepository repository) 
     { 
      // items here is always null 
      // However if I grab the container that the ControllerFactory used and tell it ComposeParts on this the TestImportItems will be filled with 50+ items 
      // repository however is instantiated appropriately. 

      GlobalItems.Container.ComposeParts(this); 
      //Now TestImportItems if filled but my items parameter alway null... how do I get constructor to fill 

     } 

    } 

所以MEF創建,但myController的只會造成資源庫,爲ImportMany發送空,即使它可以用相同的容器後填寫的財產。

還有一點奇怪的是,如果我做了某件事會破壞MyConroller的創建在ControllerFactory中創建的某個項目......就好像它檢查構造函數是否有部分,但從不將它們推送到IEnumerable參數。

我缺少什麼?

很顯然,我有部分可用,如果在同一個容器適用於.ComposingParts上(本)(和我反映其具有提供適當的導入/導出零件在創建控制器時的目錄。

我可以重寫我的類中使用填充屬性,但我真的很喜歡我的進口構造函數來得到一個填充集合

更新:

如果我添加一個簡單的包裝類進口許多MEF將加載[ImportMany]參數。

所以下面將填補了IEnumerable我...

public MyController(TestImportClass test, [Import]IRepository repository) 
{ 
    //test.Items != null 
} 

public class TestImportClass 
{ 

    public IEnumberable<MyImportedItem> Items {get;set;} 

    [ImportingConstructor] 
    public TestImportClass([ImportMany]IEnumberable<MyImportedItem> items) 
    { 
     this.Items = items; 
    } 
} 

我使用的是「公約」系統,我實際的代碼來標記要導出的控制器。也許由於某些原因導致MEF不理解初始構造函數參數上的Import?如果是這種情況,雖然我不知道爲什麼我的IRepository總是被填滿?

+0

有趣...... 如果我改變我的控制器構造函數參數從ImportMany IEnumerable的<...>到一個簡單的接口類與構造函數,它在它的工作原理ImportMany參數。 因爲什麼原因,MEF不想在我的Contoller構造函數中填充ImportMany參數,但會在鏈的下一級執行。 – Andy

回答

0

當你調用ComposeParts時,你傳遞了已經構造好的對象。無法在現有對象上再次調用構造函數。 (在這種情況下,如果你確實會得到無限遞歸)。所以ComposeParts不滿足構造函數的導入。

如果您的控制器被從容器中以其他方式拉出,並且您將一個ImportingConstructorAttribute放置在構造函數中,則應滿足構造函數的導入。

+0

我只做ComposeParts(被稱爲post構造函數)來顯示我可以填充IEnumerable屬性。 但是,控制器本身是從我調用ComposeParts(this)的相同Container中加載的。 IRepository確實在構造函數中實例化,而不是IEnumerable 參數。這是我的問題。 此外,我已經測試了添加[ImportingConstructor]屬性的代碼以及參數上的ImportMany,但仍然沒有實例化IEnumerable。 – Andy

0

可能您使用的約定系統不支持構造函數參數中的ImportMany。據推測該公約不適用於TestImportClass,這就是爲什麼ImportMany在該構造函數上工作的原因。

我們計劃在MEF的下一個版本中提供官方會議模型支持,我們應該很快發佈一個新的Codeplex版本,並預覽此支持。

相關問題