2010-01-09 41 views
2

我一直在嘗試使用可配置的提供程序模型來處理我的MEF導入和導出MEF Contrib(link)。我已閱讀Codeplex文檔和Code Junkie的博客文章(link);但是,我似乎無法獲得容器來創建零件。我哪裏錯了?MEF Contrib提供程序模型不導入零件

的Program.cs

namespace MEFTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.Run(); 
     } 

     // [ImportMany("command", typeof(IHelp))] 
     public IEnumerable<IHelp> Commands { get; set; } 

     void Run() 
     { 
      Compose(); 

      foreach(IHelp cmd in Commands) 
      { 
       Console.WriteLine(cmd.HelpText); 
      } 

      Console.ReadKey(); 
     } 

     void Compose() 
     { 
      var provider = new ConfigurableDefinitionProvider("mef.configuration"); 
      var catalog = new DefinitionProviderPartCatalog<ConfigurableDefinitionProvider>(provider); 
      var container = new CompositionContainer(catalog); 
      container.ComposeParts(this); 
     } 
} 
} 

TestCommand.cs

namespace MEFTest 
{ 
    //[Export("command", typeof(IHelp))] 
    public class TestCommand : IHelp 
    { 
     private string _helpText = "This is a test."; 

     public string CommandName 
     { 
      get { return "Test"; } 
     } 

     public string HelpText 
     { 
      get { return _helpText; } 
     } 
    } 
} 

App.Config中部分:

<mef.configuration> 
<parts> 
    <part type="MEFTest.TestCommand, MEFTest"> 
    <exports> 
    <export contract="IHelp" /> 
    </exports> 
    </part> 
    <part type="MEFTest.Program, MEFTest"> 
    <imports> 
    <import member="Commands" contract="IHelp" /> 
    </imports> 
    </part> 
</parts> 
</mef.configuration> 

我沒有得到任何構建錯誤,如果我它運行良好切換到作爲MEF核心組成部分的典型的基於屬性的系統(也使用相應的目錄)。在上面的例子中,Program.Commands始終爲NULL。我試圖只使用一個單一的屬性,而不是一個集合,並得到相同的結果。

當我調試我可以得到provider.Parts集合,所以我知道它正在正確訪問配置信息;但是,每當我調試並嘗試鑽入catalog.Parts時,我都會得到一個InvalidOperationException異常。

任何人都有任何經驗,我在哪裏出錯了嗎?

回答

0

如記錄here,你還需要這在您的配置文件:

<configSections> 
    <section 
    name="mef.configuration" 
    type="MefContrib.Models.Provider.Definitions.Configurable.PartCatalogConfigurationSection, MefContrib.Models.Provider" /> 
</configSections> 

如果您已經擁有了,那麼它可能是有趣的向我們展示你訪問provider.Parts時,你得到InvalidOperationException的堆棧跟蹤。

0

我有同樣的問題,並無法讓它工作,但這裏有一些細節: 似乎ComposeParts()不能按預期工作(至少在我使用的版本中),因爲它使用靜態方法,基於Reflection來查找所有必需的Imports(所以看起來這個部分不能從MEF以外改變)。不幸的是,我們想要使用xml配置,而不是MEF屬性。

如果您將[導入]屬性添加到您使用ComposeParts()的類的成員,它將起作用。在你的情況下,這將是「Programm」。在這種情況下,將找到配置文件中定義的所有導出。

我找不到有關該問題的MEF Contrib頁面上的任何文檔或示例。此外,在使用ComposeParts()的MEF contrib項目中沒有單元測試。 解決方法是使用container.GetExportedValues()來檢索值,但在這種情況下,您必須手動設置類成員。

希望有所幫助。