1

我在我的 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>>();

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

4

3 回答 3

0

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

[Export(type(CommonBaseClass<ICommonInterface>))] 
于 2013-02-28T19:40:47.953 回答
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 {}
于 2013-03-01T00:29:44.753 回答
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>>();
于 2013-03-01T00:10:09.287 回答