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