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

问题描述 投票:0回答:1

我想将一个(使用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导出第三方插件,我可以在菜单上显示其名称,而无需对菜单进行硬编码。

c# wpf mef caliburn.micro
1个回答
1
投票

ValueLazy<IModule>属性将初始化并返回IModule,但当然您需要实例化它们以便能够从它们获取任何信息。

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

© www.soinside.com 2019 - 2024. All rights reserved.