从懒惰的初始化导出中获取信息

时间:2019-04-08 16:45:48

标签: c# wpf mef caliburn.micro

我想将(导入MEF2公约)IEnumerable<Lazy<IModule>>集合绑定到菜单。

IModule是位于外部项目中的ViewModels的接口。

我的问题是,在使用Lazy<T>的情况下,我无法弄清楚如何在不实例化对象的情况下获取MenuName(及其所属的MenuParent,如果有的话)的方法,这违背了惰性初始化的目的(存在有很多模块,每个用户都需要使用很少的模块)。我将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导出第三方插件,而我的名字可以显示在菜单上,而无需对菜单进行硬编码。

1 个答案:

答案 0 :(得分:1)

Value的{​​{1}}属性将初始化并返回一个Lazy<IModule>,但是当然您需要实例化它们以便能够从中获取任何信息。

您可以绑定到某些轻量级视图模型对象,而不是使用IModule。这意味着您将必须为每个模块创建其他类型,但是鉴于您的要求,这不应该成为问题。