元数据视图必须是具有无参数或字典构造函数的具体类

时间:2015-03-10 17:37:32

标签: c# mef

  

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示例清楚地显示了使用元数据的接口,而不是具体的类

1 个答案:

答案 0 :(得分:4)

正如exepction所说,你必须为元数据使用具体的类。

这意味着不允许interfaceabstract 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;错误中提到的构造函数。