System.Composition.Hosting.CompositionFailedException:类型 ' ITranslatorMetaData'不能用作元数据视图。元数据 view必须是具有无参数或字典的具体类 构造
我刚开始在PCL中使用MEF(使用nuget Microsoft.Composition)。我相信这是"轻量级" MEF。在我实施的课程中,我有
[Export(typeof(ITranslator))]
[ExportMetadata("Source", "Microsoft")]
[ExportMetadata("Order", "2")]
我有一个名为ITranslatorMetaData的接口
public interface ITranslatorMetaData
{
[DefaultValue("Unknown")]
string Source { get; }
[DefaultValue(Int32.MaxValue)]
int Order { get; }
}
最后,我尝试使用
导入它们 [ImportMany]
private Lazy<ITranslator, ITranslatorMetaData>[] _translators { get; set; }
我做错了什么?看起来这应该只是工作。
更新我试过这个无济于事。
[Export(typeof(ITranslator)),
ExportMetadata("Source", "Microsoft"),
ExportMetadata("Order", "2")]
更新2 我确实发现了一个错误,订单应该是一个int而不是一个字符串。但是在指定
之后我仍然得到同样的错误[Export(typeof(ITranslator)),
ExportMetadata("Source", "Microsoft"),
ExportMetadata("Order", 2)]
更新3 一个建议的解决方案建议我不应该使用接口作为元数据,尽管http://mef.codeplex.com/wikipage?title=Exports%20and%20Metadata&referringTitle=Guide中的MEF示例清楚地显示了使用元数据的接口,而不是具体的类
答案 0 :(得分:4)
正如exepction所说,你必须为元数据使用具体的类。
这意味着不允许interface
和abstract class
(编辑:static class
)类型,因为MEF代码在提取必要时不知道要构建什么元数据。
因此,如果您将interface ITranslatorMetaData
改为class TranslatorMetaData
,那么
public class TranslatorMetaData
{
[DefaultValue("Unknown")]
string Source { get; set; }
[DefaultValue(Int32.MaxValue)]
int Order { get; set; }
}
代码能够编译。
关于构造函数,假定缺少其他构造函数的无参数公共构造函数,因此上面的代码适合必要的参数。但是,使用参数指定构造函数将留下没有无构造函数参数的类,并导致相同的错误,除非使用&#34;字典&#34;错误中提到的构造函数。