自动自注册TypedNamedAndKeyedServices

本文关键字:TypedNamedAndKeyedServices 注册 | 更新日期: 2023-09-27 18:08:57

我有一个简单的系统,根据用户选择的Molecule的类型显示不同的屏幕(WPF)。为了完成它,我使用calburn。Micro与Autofac一起作为Ioc容器。

期望一个简单的命名约定:

[MoleculeName] <->[MoleculeName] ViewModel -> [MoleculeName]View

这份原稿。Micro提供了视图/视图模型约定,我的目标是在Molecule<>MoleculeViewModel部分复制这个约定。

每个Molecule由一个类型表示,继承自 immolecule

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在相同的方式Caliburn之间的视图和ViewModels?

自动自注册TypedNamedAndKeyedServices

听起来你想在这里使用一点反射来迭代所有分子类型并调用相应的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正在做的(但有一些正则表达式魔法和可能更少的泛型?)

相关文章:
  • 没有找到相关文章