2010-03-31 27 views
5

我現在正在使用MEF,但我正在尋找的答案可能與MEF無關 - 這都是依賴注入 - 我只是在這裏使用MEF術語作爲示例。如何通過說MEF導出和導入應用程序服務?

短故事背景,我在MSDN與重點Composite Applications

閱讀這篇文章,在該圖中有三件事情,外殼,應用服務和模塊。所以這是一個複合應用程序。

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

我不完全得到的是應用服務的一部分。什麼是服務,它是什麼樣子?如何通過模塊公開服務,以及如何從不同的模塊使用服務?

我真的很想看到一些整潔的小代碼示例,沒有什麼奇特的東西可以說明這些是如何實現的(應用程序服務部分)。

+5

我的眼睛,我的眼睛! – 2010-03-31 19:42:45

+0

是的,該圖片中顏色的選擇是可怕的... – 2010-03-31 19:56:18

回答

3

就MEF而言,應用服務只是另一個可組合的部分。您可以編寫的任何界面或類都可以像服務一樣。

每個服務都會有一些你想實現的接口或基類。您可以通過某種類型的IService界面(並使用[ImportMany]將它們全部導入)來完成這些操作,但通常您需要不同的服務類型。

然後,您會根據需要將其導入到您的課程中。例如,假設你有一個服務的公共接口庫,以及您提供:

public interface IDataRepostory 
{ 
    public IList<MyType> MyTypes { get; } 
} 

然後,您可以有一個獨立的庫出口特定類型:然後

[Export(typeof(IDataRepository))] 
public class Repository: IDataRepostory 
{ 
    // implement interface for this specific "service" 
} 

你的主要程序將能夠根據需要導入,並編寫代碼。例如,假設您想要展示客戶,您需要從數據層加載客戶。如果你想通過你的資料庫來加載,你可以導入倉庫到你的應用程序的特定部分:

public class CustomersViewModel 
{ 
    [Import] 
    public IDataRepository 
    { 
     get; set; 
    } 

    // ... 
} 

你會然後得到直接組合成你的應用程序此服務。

這被認爲是「應用程序服務」,因爲它是一些通用服務的特定於應用程序的實現 - 它不是與視圖相關的組件,它可能會在整個應用程序中使用。

+0

如果超過1個應用程序服務滿足導入,您將如何區分兩者?元數據?或者,還有更好的方法?或者這是錯誤的。我知道MEF在發生這種情況時拋出異常,所以我真的只想要1個接口和1個具體實現? – 2010-03-31 20:06:39

+0

@John:您必須使用[ImportMany],然後查詢服務或使用元數據來確定使用哪個。否則,你會得到一個異常。 – 2010-03-31 20:08:59

+0

@John:如果多個服務使用相同的導入接口/類,那麼使用[ImportMany]並導入IEnumerable中 2010-03-31 20:09:22

0

聲明實現此接口的服務和導出類的接口。 例如,您可能在共享程序集中聲明瞭IPersonBuilder。你主要的模塊有MyPersonBuilder實現接口並導出。 所有視圖使用導入IPersonBuilder來調用它的方法,並且使用MEF組合,他們將能夠從您的主模塊調用MyPersonBuilder上的CreatePerson()