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

Getting Information From Lazy Initialized Exports

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

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

我的问题是,对于 Lazy<T>,我不知道如何在不实例化对象的情况下获得 MenuName(以及它所属的 MenuParent,如果有的话),这违背了延迟初始化的目的(有很多模块,每个用户需要使用的数量很少)。我对 MVVM 使用 Caliburn.Micro。

我考虑过将菜单结构存储在数据库中,但这是其他开发人员创建新模块或删除过时模块时增加的故障点,类似于硬编码菜单。

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 导出第 3 方插件的策略,我可以在菜单上显示其名称,而无需对菜单进行硬编码。

Lazy<IModule>Value属性会初始化,return会初始化IModule,当然你需要实例化它们才能能够从他们那里得到任何信息。

您可以绑定到一些轻量级视图模型对象,而不是使用 Lazy<T>。这意味着您必须为每个模块创建一个额外的类型,但根据您的要求,这应该不是问题。