到目前爲止,你所說的一切聽起來都很合理。您將某些區域模塊化,在不同抽象層次上定義接口並使用不同接口導出每個模塊,即每個模塊都將被註冊爲它實現的多個接口。您將能夠根據您所需的抽象級別,獲得所有服務,所有業務領域等來解決您的模塊。因此,我認爲您正朝着正確的方向前進。
如何處理元數據? MEF提供元數據的導出,這似乎是合理的使用。也許我沒有完全理解它,但是我對MEF元數據導出做了非常糟糕的體驗。就我所知,MEF將元數據存儲爲鍵值對,其中鍵是一個字符串。
即使使用類型化的元數據導出和使用函數,元數據也不是真正的類型安全。假設您有一個名爲'PropertyA'的屬性的界面'IMetadata',並且您註冊了一個類型(爲了創造性,我們稱它爲Foo
),這個類型用a中的相應屬性來裝飾,MEF調用類型安全,實現IMetadata的元數據)。現在假設你有第二個元數據接口'IMetadataB',它也有一個名爲PropertyA
的屬性。如果您現在請求通過元數據IMetadataB
請求解析Foo
,您將首先獲得您註冊的實例,因爲MEF對元數據鍵值對中存在的PropertyA
感到滿意,並構建了實現IMetadataB
的相應代理元數據類型。長話短說,也許我對MEF不公平,但我停止使用MEF構建的元數據支持,並建議你也這樣做。當我處理非常複雜和冗長的元數據時,包括一些我想要與我導出的類緊密結合的類的文檔,我開發了一個對我來說非常好的系統,儘管它是一個有點非常規:
基本上,我爲我的元數據定義了一個接口和一個基類,比如MetadataBase
,它帶有一個名爲Description
的字符串屬性。
public class MetadataBase : IMetadata
{
public string Description { get; set; }
}
此後,對每個類別我想有元數據,我導出從該基類的類(FooMetadata
)和XAML部分地限定它。然後,在XAML,我定義的屬性的類特定的值,例如:
<md:MetadataBase.Description>
The description of my class goes here
</md:MetadataBase.Description>
隨着自定義屬性,我涉及元數據類型到我的實際的類:
[Export(typeof(IFoo))]
[AssociatedMetadata(typeof(FooMetadata))]
public class Foo : IFoo
{
// Whatever
}
擴展方法爲對象,您可以通過反射讀取的元數據:
public static IMetadata GetMetadata(this object objectWithMetadata)
{
// Read attribute type
// Create instance of the metadata type, i.e. FooMetadata
// A caching mechanism can be implemented, if needed, but, honestly,
// my really big metadata objects including images and stuff like this
// are created within 3-5 ms
// Return this instance
}
現在,你基本上沒有,你可以看到它有這樣的元數據的任何對象的元數據:
var myObjectsMetadata = myObject.GetMetadata();
當你讓你的AssociatedMetadataAttribute
實現一個接口並且使用這個接口的元數據註冊你的類型時,你可以在MEF中利用這個元數據。沒有什麼會混淆,因爲對於擁有一個屬性而沒有其他任何東西(類型)的所有東西都有一種類型的元數據。
這個解決方案並不是一切的正確方法,但我喜歡它,你的問題是展示它的好機會。希望能幫助到你!
我的回答有幫助嗎? – Marc