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