簡體   English   中英

如何使用MEF導出和導入應用程序服務?

[英]How do I export and import application services with say MEF?

我現在正在和MEF合作,但我正在尋找的答案可能與MEF無關 - 這都是依賴注入 - 我只是在這里使用MEF術語作為例子。

簡短的背景故事,我在MSDN上閱讀了這篇文章,重點是復合應用程序

在這個圖中有三個東西,shell,應用程序服務和模塊。 這是一個復合應用程序。

替代文字
(來源: microsoft.com

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

我真的很想看到一些簡潔的小代碼示例,沒有任何花哨的東西可以用來說明這一切是如何實現的(應用程序服務部分)。

就MEF而言,應用服務只是另一個可組合的部分。 您可以編寫的任何接口或類都可以充當服務。

每個服務都有一些您想要實現的接口或基類。 您可以通過某種類型的IService接口進行這些[ImportMany] (並使用[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;
     }

     // ...
}

然后,您將直接將此服務組合到您的應用程序中。

這被視為“應用程序服務”,因為它是某些通用服務的特定於應用程序的實現 - 它不是與視圖相關的組件,並且可以在整個應用程序中使用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM