【问题标题】:ImportMany not working with Custom Metadata AttributeImportMany 不使用自定义元数据属性
【发布时间】:2013-12-28 17:16:20
【问题描述】:

我在 MEF 中为 ImportMany 创建了自定义元数据属性,但 ImportMany 始终为空。

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class ,AllowMultiple = false)]
public class ModuleAttribute : ExportAttribute ,IModuleMetadata
{
    public ModuleAttribute(string contract)
        : base(typeof(IScreen))
    {
        Name = contract;
        Region = Region.Sidebar;
        IsVisible = true;
    }

    public string Name { get; set; }
    public string Module { get; set; }
    public Region Region { get; set; }
    public string DisplayName { get; set; }
    public bool IsVisible { get; set; }
    public string Description { get; set; }
    public short Order { get; set; }
    public Permissions Permissions { get; set; }
}

这是我导出课程的方式。

[Module("Stock" ,Module = "Stock" ,Order = 1 ,Permissions = Permissions.View)]
    internal sealed class StockWorkSpaceViewModel : Screen

屏幕是typeof(IScreen)

这是我的 ImportMany。

[ImportMany]
public IEnumerable<Lazy<IScreen ,IModuleMetadata>> Modules { get; set; }

谁能预测我哪里出错了。

【问题讨论】:

  • 能否也添加IModuleMetadata的声明?它是否具有匹配的只读属性?
  • 昨天,当我从类中删除默认构造函数时,我能够导入。如果该类具有带有一些代码的无参数构造函数。导入不起作用。我还必须从 Export 中删除合同名称,即我必须使用合同类型导出。
  • 我还有一个名为 Settings 的自定义导出,但现在 ImportMany 的设置包括来自 ModuleExport 的类型。我不知道为什么。两者都有不同的元数据接口,但合约类型相同。
  • 这里有很多可能出错的地方。如果您没有更多代码,将很难猜到。您可以尝试添加一个失败的完整示例。

标签: c# wpf mef caliburn.micro


【解决方案1】:
  1. 检查 ComponnetContainer.ComposeParts
  2. 检查导出和导入属性必须相同
  3. 检查自定义属性和您在延迟初始化中使用的接口。属性必须相同。即海关属性类实现了隐式延迟初始化。

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多