我想将一个(使用MEF2约定导入)IEnumerable<Lazy<IModule>>
集合绑定到菜单。
IModule是位于外部项目中的ViewModel的接口。
我的问题是,使用Lazy<T>
,我无法弄清楚如何在不实例化对象的情况下获取MenuName(以及它所属的MenuParent,如果有的话),这就失去了Lazy Initialization的目的(有很多模块,每个用户需要使用非常少的数字)。我使用Caliburn.Micro作为MVVM。
我已经考虑过在数据库中存储Menu结构,但是当其他开发人员创建新模块或删除过时的模块时,这会增加故障点,类似于硬编码菜单。
MEF出口:
RegistrationBuilder builder = new RegistrationBuilder()
builder.ForTypesDerivedFrom<IModule>.Export<IModule>
MenuViewModel:
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导出第三方插件,我可以在菜单上显示其名称,而无需对菜单进行硬编码。
Value
的Lazy<IModule>
属性将初始化并返回IModule
,但当然您需要实例化它们以便能够从它们获取任何信息。
您可以绑定到一些轻量级视图模型对象,而不是使用Lazy<T>
。这意味着您必须为每个模块创建一个附加类型,但根据您的要求,这不应该是一个问题。