C# Autofac自注册类型DNAMEDKEYEDSERVICES

C# Autofac自注册类型DNAMEDKEYEDSERVICES,c#,inversion-of-control,ioc-container,autofac,caliburn.micro,C#,Inversion Of Control,Ioc Container,Autofac,Caliburn.micro,我有一个简单的系统,根据用户选择的分子类型显示不同的屏幕(WPF)。为此,我使用Caliburn.Micro和Autofac作为Ioc容器 需要一个简单的命名约定: [MolecleName][MolecleName]视图模型-->[MolecleName]视图 Micro提供了view/viewmodel约定,我的目标是复制MoleculeViewModel零件的约定 每个分子由一个类型表示,并继承自IMolecule public Interface IMolecule {...} IoC

我有一个简单的系统,根据用户选择的分子类型显示不同的屏幕(WPF)。为此,我使用Caliburn.Micro和Autofac作为Ioc容器

需要一个简单的命名约定:

[MolecleName][MolecleName]视图模型-->[MolecleName]视图

Micro提供了view/viewmodel约定,我的目标是复制MoleculeViewModel零件的约定

每个分子由一个类型表示,并继承自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));

}
private void configuremolecleslibs(Autofac.ContainerBuilder-builder)
{
var builder=new ContainerBuilder();
//获取程序集
var assemblies=AppDomain.CurrentDomain.GetAssemblies();
//注册分子
建设者
.RegisterAssemblyTypes(程序集)
.Where(t=>t.IsAssignableTo())
.AsSelf();
//注册分子视图模型
建设者
.RegisterType()
.键控(H2SO4分子类型);
建设者
.RegisterType()
.键控(分子类型);
建设者
.RegisterType()
.键控(分子类型);
}
因此,允许以下情况:

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; }
}
公共类包装器视图模型:屏幕
{
公共代表分子包装器视图模型工厂(IMolecule分子);
公共MoleculeWrapperViewModel(
IIndex Molecules ScreensLookup,
单分子
{
this.molecleViewModel=molecleScreensLookup[molecule.GetType()];
}
公共屏幕视图模型{get;private set;}
}

是否有一种方法可以通过将名称与相应的视图模型进行匹配来自动注册键控类型,就像Caliburn在视图和视图模型之间进行匹配一样?

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