繁体   English   中英

导出几个MEF元数据属性

[英]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

对于每个模块, IArmModuleDictionary<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; }
}

注意:

  • 您不必使自定义导出属性实现元数据接口。 MEF将处理此问题。
  • 您需要将导出的类型传递给ExportAttribute的构造函数。
  • 您将自定义导出属性的所有公共属性添加到接口。

我还更改了自定义属性类的名称,以符合创建自定义属性的准则(我现在无法找到该资源的来源,但您可以查看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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM