0

我有一个简单的系统,根据用户选择的分子类型显示不同的屏幕 (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 之间所做的一样?

4

1 回答 1

0

听起来您想在这里使用一点反射来遍历所有分子类型并调用相应的AutoFac泛型方法

您需要使用您的分子类型来生成您的类型名称:

var viewModelTypeName = moleculeTypeName + "ViewModel";

Type yourViewModelType = Type.GetType(viewModelTypeName); // Not 100% on the syntax here, don't have VS open :P

Type type = typeof(ContainerBuilder);
MethodInfo miGeneric = type.GetMethod("RegisterType");

MethodInfo mi = miGeneric.MakeGenericMethod(yourViewModelType);

mi.Invoke(...) // etc

显然它有点复杂,因为您正在链接方法(不确定RegisterType返回什么 - 可能是类型注册对象?)并且您必须为第一次调用的返回对象等的通用方法提供这个

你有没有尝试过这样的方法?

不确定是否AutoFac支持开箱即用的任何东西 - 但基本上这就是 CM 正在做的所有事情(但有一些正则表达式的魔力和可能更少的泛型?)

于 2013-04-14T12:07:00.270 回答