试图在CompositionContainer中查找导出

时间:2013-02-28 18:24:00

标签: c# mef

我在我的WPF应用程序中使用MEF,我不确定我的导出是不是因为我导出它们的方式导致它进入容器,或者因为我查询容器的方式

这是我的对象层次结构:

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>>();

没有任何错误,只是没有结果。

3 个答案:

答案 0 :(得分:0)

MEF与IoC容器不完全相同。 MEF不进行继承导出。您需要添加属性

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

答案 1 :(得分: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>>();

答案 2 :(得分: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 {}