ユーザーが選択した分子の種類に応じて異なる画面 (WPF) を表示する単純なシステムがあります。それを達成するために、Ioc コンテナーとして Autofac と共に Caliburn.Micro を使用しています。
単純な命名規則が期待されます。
[分子名] <--> [分子名]ViewModel --> [分子名]View
Caliburn.Micro はビュー/ビューモデルの規則を提供します。私の目的は、Molecule<->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));
}
以下が許可されるように:
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; }
}
ビューとビューモデルの間でカリバーンが行うのと同じ方法で、対応するビューモデルと名前を一致させることにより、キー付きタイプを自動的に登録する方法はありますか?