[英]Export several MEF Metadata attributes
美好的一天,能否请您协助我完成这项复杂的任务。 我用MEF开发模块应用程序。 每个模块都有这样的元数据:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public abstract class ModuleMetadata : ExportAttribute, IArmModuleMetadata
{
private ModuleDescriptor _descriptor;
public ModuleMetadata(string name, string code, string category, string iconUri)
: base()
{
_descriptor = new ModuleDescriptor(name, code, category, iconUri);
}
}
我这样使用它:
[Export(typeof(IArmTaskModule))]
[TaskModuleMetadata("test1", "code",
@"pack://application:,,,/WpfVisualModule;component/Icons/chart_line_error.png",
"road_weather_stations",
TargetItem = TargetItems.ControlComplex)]
class AdvancedChartContract : Burstroy.Arm.Contracts.IArmTaskModule
对于每个模块, IArmModule
的Dictionary<string, Settings.ParamDescriptor> CreateSettingsBlock()
方法IArmModule
生成一组属性,其中Key包含属性代码,Value包含花式名称和默认值。
在我的主应用程序中,我使用Lazy<T, TMetadata>
导入这样的模块
[ImportMany(typeof(IArmTaskModule), AllowRecomposition = true)]
private IEnumerable<Lazy<IArmTaskModule, IArmTaskModuleMetadata>> _taskModules;
此方法中的问题是Lazy<T, TMetadata>
将创建IArmTaskModule
实例以从方法接收设置块。 我想通过将属性信息添加到元数据来防止它。 我试图用新的List()扩展attrribute构造函数,但失败了(属性限制),我也试图创建新属性
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportedParam : ExportAttribute, IArmModuleProperty
{
public ExportedParam(string code, string fancyName)
: base()
{
this.Code = code;
this.FancyName = fancyName;
//this.Value = value;
}
public string Code { get; private set; }
public string FancyName { get; private set; }
public object Value { get; private set; }
}
但还是失败了。
[ExportedParam("a", "b")]
[ExportedParam("b", "c")]
[ExportMetadata("fffffuuu", 2)]
class MeteoSummary : IArmVisualModule,
有没有人有什么建议?
ModuleMetadata
类不遵循自定义导出属性准则 。
应该是这样的:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public abstract class ModuleMetadataExportAttribute : ExportAttribute
{
public ModuleDescriptor Descriptor { get; private set; }
public ModuleMetadata(string name, string code, string category, string iconUri)
: base(typeof(IArmTaskModule))
{
Descriptor= new ModuleDescriptor(name, code, category, iconUri);
}
}
和您的元数据界面是这样的:
public interface IArmModuleMetadata
{
ModuleDescriptor Descriptor { get; }
}
注意:
我还更改了自定义属性类的名称,以符合创建自定义属性的准则(我现在无法找到该资源的来源,但您可以查看Abrams的Cwalina的Framework Design Guidelines 2nd Edition)。 但这不是必需的。
然后您像这样导出:
[ModuleMetadataExport(...))] //Add your params here.
[TaskModuleMetadata("test1", "code",
@"pack://application:,,,/WpfVisualModule;component/Icons/chart_line_error.png",
"road_weather_stations",
TargetItem = TargetItems.ControlComplex)]
class AdvancedChartContract : Burstroy.Arm.Contracts.IArmTaskModule
我离开TaskModuleMetadata
是因为我不知道它是什么。 我认为这与MEF无关。
最后,请保持导入部分不变。 然后,当您遍历_taskModules
序列时,只有在检查了Metadata
属性并确保当前模块是您想要的模块之后,您才可以访问Value
属性。 然后,访问Value
属性,将创建模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.