我在我的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>>();
没有任何错误,只是没有结果。
答案 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 {}