试图在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>>();
没有错误,只是没有结果。
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 {}