我有一个简单的系统,根据用户选择的分子类型显示不同的屏幕 (WPF) 。为了实现它,我将 Caliburn.Micro 与 Autofac 一起用作 Ioc 容器。
需要一个简单的命名约定:
[MoleculeName] <--> [MoleculeName]ViewModel --> [MoleculeName]View
Caliburn.Micro 提供视图/视图模型约定,我的目标是复制 Molecule<->MoleculeViewModel 部分的约定。
每个 Molecule 都由一个类型表示并继承自IMolecule
public Interface IMolecule {...}
IoC 由 AutoFac 提供,以下工作正常:
private void ConfigureMoleculesLibs(Autofac.ContainerBuilder builder)
{
var builder = new ContainerBuilder();
// get assemblies
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
// register molecules
builder
.RegisterAssemblyTypes(assemblies)
.Where(t => t.IsAssignableTo<IMolecule>())
.AsSelf();
// register molecules view models
builder
.RegisterType<H2SO4MoleculeViewModel>()
.Keyed<Type>(TypeOf(H2SO4Molecule));
builder
.RegisterType<HClMoleculeViewModel>()
.Keyed<Type>(TypeOf(HClMolecule));
builder
.RegisterType<H2oMoleculeViewModel>()
.Keyed<Type>(TypeOf(H2oMolecule));
}
以便允许以下情况:
public class MoleculeWrapperViewModel : Screen
{
public delegate MoleculeWrapperViewModel Factory(IMolecule molecule);
public MoleculeWrapperViewModel(
IIndex<Type, Screen> moleculeScreensLookup,
IMolecule molecule)
{
this.MoleculeViewModel = moleculeScreensLookup[molecule.GetType()];
}
public Screen MoleculeViewModel { get; private set; }
}
有没有办法通过将名称与其对应的 ViewModels 匹配来自动注册 Keyed Types,就像 Caliburn 在 Views 和 ViewModels 之间所做的一样?