[英]MEF Metadata vs. Value
我在这里是一个完全的初学者,所以这可能是一个非常明显的问题,我似乎无法理解或找到答案。 我已经阅读了MSDN 示例 ,其中大部分都是完全有道理的。
在该示例中,它们定义了以下接口并提供了这样的示例用法;
public interface IOperation
{
int Operate(int left, int right);
}
public interface IOperationData
{
char Symbol { get; }
}
[Export(typeof(IOperation))]
[ExportMetadata("Symbol", '+')]
public class Add : IOperation
{
public int Operate(int left, int right)
{
return left + right;
}
}
我想我必须在这里误解一些东西。
IOperationData
和ExportMetadata
什么ExportMetadata
? char Symbol {get;}
到IOperation
? 然后我可以使用Add.Value.Symbol
而不是Add.Metadata.Smybol
。 我想这并不是一个巨大的变化,但它确实意味着我不需要ExportMetadata
。 Value
和Metadata
之间有什么区别,为什么这个例子像它一样使用它们? 属性的Metadata
和方法的Value
是什么? 它似乎没有很好地解释给我。
MEF允许可组合部件提供其元数据 。 这里的元数据是一组静态已知的属性,这是部件类型的典型属性,而不是类型实例 。
假设您在给定示例中为计算器构建GUI。
每个操作都是一个插件,通过MEF容器加载。 在用户选择之前,您不希望实例化每个插件,但是您希望使用按钮构建面板,其中每个按钮都包含操作符号。
这就是为什么你需要使用元数据而不是添加char Symbol {get;}
到IOperation
:
您正在描述元数据接口IOperationData
并将ExportMetadata
属性应用于可组合部件定义。 然后,在运行时,MEF查看Add
类,并动态构建IOperationData
实现。 使用ExportMetadata
提供的值初始化该实现的实例。 最后,您可以稍后在主机应用程序中使用Add.Metadata.Smybol
访问IOperationData
实现的值。
更新 。 ExportMetadata
允许您添加多个元数据值,但使用自定义属性添加元数据通常更方便,该属性继承自ExportAttribute
:
public interface IMyPlugin {}
public interface IMyMetadata
{
int Value1 { get; }
string Value2 { get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class MyExportAttribute : ExportAttribute, IMyMetadata
{
public MyExportAttribute(int value1, string value2)
: base(typeof(IMyPlugin))
{
Value1 = value1;
Value2 = value2;
}
public int Value1 { get; private set; }
public string Value2 { get; private set; }
}
用法:
[MyExport(1, "Orange")]
public class MyPlugin : IMyPlugin {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.