2013-05-10 107 views
0

我想知道使用Import/ImportMany裝飾物有什麼好處?我和MEF一起玩,並通過CompositionContainer管理所有事情。我使用派生自ExportAttribute的自定義MetaDataAttribute來裝飾出口。當我嘗試訪問插件實例時,我可以通過Container.GetExports<T, IMetaDataAttribute>()懶洋洋地訪問元數據和插件實現。託管擴展性框架(MEF),爲什麼需要導入?

那麼,我爲什麼需要進口的裝飾打擾?我明白MEF的核心是CompositionContainer,而這正是我應該關心的。但是網上的大多數例子都通過導入裝飾對象實例。爲什麼是這樣,他們提供什麼附加價值?

下面是我如何訪問我的元數據和實際的插件的例子:

public static IEnumerable<IPluginAttributeView> GetMetaData<T>() 
    { 
     return Container.GetExports<T, IPluginAttributeView>().Select(e => e.Metadata); 
    } 

    public static T GetPlugin<T>(string pluginName) where T : class 
    { 
     var plugins = Container.GetExports<T, IPluginAttributeView>(); 
     var pluginByName = plugins.Where(e => e.Metadata.PluginName.Equals(pluginName)).FirstOrDefault(); 

     return pluginByName.Value; 
    } 

我缺少的東西或缺乏瞭解?請幫助我理解。因爲他們爲您提供自動的依賴注入

回答

2

進口屬性(及其等價MEF2方法RegistrationBuilder)是非常有用的。容器爲你處理。您可以使用導出屬性裝飾許多類型,並使用其中一個導入屬性裝飾成員,並讓容器在需要時組合它們。因此,您只需使用容器來獲取其他類型導入的導出。其餘的由MEF爲您處理。如果您避免導入屬性,那麼您將不得不自己注入所有依賴關係。

如果你看看大多數的MEF的例子在那裏你會注意到,他們大多使用進口大量屬性。有些人使用MEF,甚至不知道CompositionContainer提供的GetExportXXX方法。當然,您需要決定什麼最適合您的應用程序。在你的情況下(插件管理器),GetExports方法可能就足夠了。如果您決定添加插件之間的依賴關係,那麼導入屬性將變得非常有價值,並且您的插件管理器將變得更加簡單。 MEF對插件管理器另一個不錯的功能是重排,這是據我所知,僅可通過導入屬性(或MEF2的RegistrationBuilder)。這可以爲您的插件感知應用程序增加很大的價值。無論哪種方式,您仍然有MEF應該提供的可擴展性功能。

+0

這就是爲什麼我很困惑。鑑於人們知道'GetExport',我沒有看到使用Imports的任何優勢。相反,Imports會引入額外的代碼中斷和其他類的機會。另外,在與Container相同的類中使用導入時,無法將包裝類設置爲靜態,這基本上意味着必須傳遞插件管理器的引用而不是使用靜態類。當然,導入可以放在一個單獨的類中,並在靜態PluginManager類中實例化並存儲爲ref。在任何情況下,我仍然看不到Imports如何幫助我。 – 2013-05-10 12:18:48

+0

我看到你的觀點重新加入了插件之間的依賴關係,我想這就是將Unity和MEF這樣的東西結合起來的地方。謝謝你的解釋 – 2013-05-10 12:21:47

相關問題