0

ユーザーが選択した分子の種類に応じて異なる画面 (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; }
}

ビューとビューモデルの間でカリバーンが行うのと同じ方法で、対応するビューモデルと名前を一致させることにより、キー付きタイプを自動的に登録する方法はありますか?

4

1 に答える 1