从惰性初始化导出中获取信息
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>
。这意味着您必须为每个模块创建一个额外的类型,但根据您的要求,这应该不是问题。
我想将一个(根据 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>
。这意味着您必须为每个模块创建一个额外的类型,但根据您的要求,这应该不是问题。