这是我的元数据:
[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;
}
但我的Mods总是最终成为null
。
更新
[Module("Unit", Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>
{
有趣的是,当我要求使用GetExport时。我得到了所有15个导出的课程。
var ex = container.GetExports<IScreen, JIMS.Common.Interface.IModuleMetadata>();
答案 0 :(得分:0)
您需要检查以确保您正在匹配合同,这意味着需要深入了解元数据。虽然我建议这样做,以便您可以看到MEF如何将所有部分放在一起,您应该尝试指定type for ImportMany
。
答案 1 :(得分:0)
要检查的另一件事是如何创建BaseViewModel。如果您从shell或其他位置执行了新的BaseViewModel(),MEF将无法在类中运行其魔法。 MEF需要创建任何将使用MEF的对象。
答案 2 :(得分:0)
由于您正在使用合同进行出口,因此您需要使用相同的合同进行导入。
像:
[ImportMany("Unit")]
public IEnumerable<Lazy<IScreen, IModuleMetadata>> Mods
另一种方法是将导出修改为:
[Module(null, Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>
通过传递null或空字符串作为契约,将使用该类型。
如果您不总是需要合同,那么您可以向ModuleAttribute
添加无参数.ctor。