试图在compostioncontainer中找到出口

本文关键字:出口 compostioncontainer | 更新日期: 2023-09-27 18:01:32

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

我想做的是得到exports的泛型版本:

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

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

试图在compostioncontainer中找到出口

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

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

你的代码无法编译。

如果你的意思是:

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

MEF不提供开箱即用的"开放泛型"支持。有一个MefContrib项目可以帮助你http://mefcontrib.codeplex.com/wikipage?title=Generic%20Catalog

在这种情况下,我要做的是在ICommonInterface上使用[InheritedExport]属性,而不是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 {}