0

这是我的元数据:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ModuleAttribute : ExportAttribute, IModuleMetadata
{
    public ModuleAttribute(string Contract) : base(Contract,typeof(IScreen))
    {            
        Region = Region.Sidebar;
        IsVisible = true;
        Order = short.MaxValue;
        Description = string.Empty;
    }

    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 interface IModuleMetadata
{       
   string Module { get; set; }
   Region Region { get; set; }
   string DisplayName { get; set; }
   bool IsVisible { get; set; }
   string Description { get; set; }
   short Order { get; set; }
}

我正在使用:

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

但我的 Mod 总是以null.

更新:

[Module("Unit", Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>
{

有趣的是,当我询问使用 GetExport 时。我得到了所有 15 个导出的类。

var ex = container.GetExports<IScreen, JIMS.Common.Interface.IModuleMetadata>();
4

3 回答 3

0

要检查的另一件事是如何创建 BaseViewModel。如果您从 shell 或其他位置执行 new BaseViewModel(),MEF 将无法在类中发挥其魔力。MEF 需要创建任何将使用 MEF 的对象。

于 2013-04-11T14:44:28.443 回答
0

您需要检查以确保您匹配合同,这意味着挖掘元数据。虽然我建议这样做以便您可以看到 MEF 如何将所有部分组合在一起,但您应该尝试ImportMany.

于 2013-04-11T00:00:15.383 回答
0

由于您使用的是出口合同,因此您将需要相同的进口合同。

喜欢:

[ImportMany("Unit")]
public IEnumerable<Lazy<IScreen, IModuleMetadata>> Mods

使这项工作的另一种方法是将导出修改为:

[Module(null, Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>

通过将 null 或空字符串作为合同传递,则将使用该类型。

如果您并不总是需要合同,那么您可以将无参数的 .ctor 添加到ModuleAttribute.

于 2013-04-11T16:25:33.333 回答