我想将(使用 MEF2 约定导入)IEnumerable<Lazy<IModule>>集合绑定到菜单。
IModule 是位于外部项目中的 ViewModel 的接口。
我的问题是,Lazy<T>我无法弄清楚如何在不实例化对象的情况下获得 MenuName (以及它所属的 MenuParent,如果有的话),这违背了延迟初始化的目的(有很多模块和每个用户需要使用非常小的数字)。我将 Caliburn.Micro 用于 MVVM。
我曾考虑将菜单结构存储在数据库中,但这会在其他开发人员创建新模块或删除过时模块时增加故障点,并且类似于对菜单进行硬编码。
MEF 出口:
RegistrationBuilder builder = new RegistrationBuilder()
builder.ForTypesDerivedFrom<IModule>.Export<IModule>
菜单视图模型:
private IEnumerable<Lazy<IModule>> _modules;
public MenuViewModel(IEnumerable<Lazy<IModule>> modules)
{
_modules = modules;
}
public IEnumerable<Lazy<IModule>> Modules
{
get { return _modules; }
set { _modules = value; }
}
我停在这里,因为没有什么可以绑定的。Lazy<IModule>不包含有关绑定到它的类型的任何信息。
我正在寻找一种允许 MEF 导出 3rd 方插件的策略,我可以在菜单上显示其名称,而无需对菜单进行硬编码。