2013-02-28 19 views
1

我在我的WPF應用程序中使用MEF,並且我不確定是否由於導出它們的方式而導致我的導出沒有進入容器,或者因爲方式我正在查詢容器。試圖在CompositionContainer中找到出口

這裏是我的對象層次:

public interface ICommonInterface 
{ } 

[InheritedExport] 
public abstract class CommonBaseClass<T> : ICommonInterface 
{ } 

public Class1 : CommonBaseClass<Class1> 
{ } 

public Class1 : CommonBaseClass<Class2> 
{ } 

我使用T的實現在基類的問題的範圍之外的原因;這就是爲什麼它在那裏。如果我擺脫對CommonBaseClass仿製藥的,它的繼承類,我可以從我的容器出口爲這樣:

var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
var exports = container.GetExportedValues<CommonBaseClass>(); 

我想要做的,是讓出口的仿製藥版本:

var exports = container.GetExportedValues<CommonBaseClass<ICommonInterface>>(); 

沒有任何錯誤,只是沒有結果。

回答

0

MEF與IoC容器並不完全相同。 MEF不會做繼承出口。您需要添加屬性

[Export(type(CommonBaseClass<ICommonInterface>))] 
+0

卸下其他出口,並增加這1類(使用「typeof運算」,而不是「類型」),我得到一個錯誤鑄造...不能投的下面是'Cl​​ass1(ContractName =「CommonBaseClass(ICommonInterface)」)'類型的基礎導出值'鍵入'CommonBaseClass'1 [ICommonInterface]' – Random 2013-03-04 16:40:28

0

您的代碼無法編譯。

如果你的意思是:

public interface ICommonInterface 
{ } 

[InheritedExport] 
public abstract class CommonBaseClass<T> : ICommonInterface 
{ } 

public class Class1 : CommonBaseClass<Class1> 
{ } 

public class Class2 : CommonBaseClass<Class2> 
{ } 

然後你就可以得到一個出口:

var exports = container.GetExportedValues<CommonBaseClass<Class1>>(); 
+0

是的,忘了'class'關鍵字...編輯問題 – Random 2013-03-01 02:24:09

0

MEF不爲「開放仿製藥的」開箱即提供支持。有一個MefContrib項目,可以幫助您與http://mefcontrib.codeplex.com/wikipage?title=Generic%20Catalog

我想在這種情況下做的雖然是使用[InheritedExport]屬性您ICommonInterface而非CommonBaseClass<T>。就像這樣:

[InheritedExport] 
interface ICommonInterface {} 

public abstract class CommonBaseClass<T> : ICommonInterface { } 

public class Class1 : CommonBaseClass<Class1> { } 

public class Class2 : CommonBaseClass<Class2> { } 

那麼你是在一個位置,這樣做:

var exports = container.GetExportedValues<ICommonInterface>(); 

比方說,你有另一個類也實現ICommonInterface,你不想拉那到你的容器。在這種情況下,你可以使用[PartNotDiscoverable]屬性:

[PartNotDiscoverable] 
public class Class3 : ICommonInterface {} 
+0

是的,忘了'class'關鍵字...已編輯的問題 – Random 2013-03-01 01:08:01

+0

該方法的問題是我只能獲取接口公開的屬性。我還嘗試了一個額外的CommonBaseClass來完成層次結構中的繼承,但是它有相同的問題。類型參數不會是這些解決方案中的任何一個的一部分。 – Random 2013-03-01 02:27:27

+0

@ChrisO MEF2,.NET Framework 4.5附帶的版本確實支持開放的通用部分。 MEF以前的版本不支持它們。 http://blogs.msdn.com/b/bclteam/archive/2011/10/27/what-s-new-in-mef-version-2-preview-4.aspx – 2013-03-01 07:47:20