4

ここでCaliburn.Microブートストラッパーを使用しています:

https://gist.github.com/1127914

すべてのビューとビューモデルをbootstratpperと同じプロジェクトに保持すると、すべてが機能します。

しかし、Views and ViewModelsフォルダーを別のアセンブリ/プロジェクトにプッシュしたかったのですが、名前空間を変更し、ブートストラッパーを更新してそのビューモデルを見つけました。今実行すると、次のエラーが発生します

「サービスMVVMBook.ViewModules.ViewModels.MainViewModelをサポートするためのコンポーネントが見つかりませんでした」

ブートストラッパーのこの部分:

return string.IsNullOrWhiteSpace(key)
               ? _container.Resolve(service)
               : _container.Resolve(key, service);

明らかに、VMがBootstrapperの汎用パラメーターとして設定されていても、ViewModelを接続することはできません。

 public class CastleBootstrapper : Bootstrapper<MainViewModel>

私が使用している命名規則は、ViewsというフォルダーとViewModelsというフォルダーで、ファイルはMainView.xamlとMainViewModel.csです。

このアセンブリを見るようにどこに指示できますか?

また、ビューとビューモデルが別々のアセンブリにある場合に推奨されたが、問題を解決しなかったため、この部分をブートストラッパーに追加しました。

// needed if views and viewmodels are in a seperate assembly
  protected override IEnumerable<Assembly> SelectAssemblies()
  {
     return new[]
               {
                  Assembly.GetExecutingAssembly()
               };
  }
4

1 に答える 1

7

登録されていないため、ViewModelが見つかりませんでした。ブートストラッパーに付随するApplicationContainerクラスには、次のようなRegisterViewModelsメソッドがあります。

private void RegisterViewModels()
{
    Register(AllTypes.FromAssembly(GetType().Assembly)
                    .Where(x => x.Name.EndsWith("ViewModel"))
                    .Configure(x => x.LifeStyle.Is(LifestyleType.Transient)));
}

これにより、ApplicationContainerが配置されているアセンブリにViewModelのみが登録されます。

これらのクラスをプロジェクトに貼り付けて、変更できるようにしたと思います。その場合は、アプリコンテナのRegisterViewModelsを変更するか、CastleBootstrapperを変更して、次のようにConfigure()メソッドをオーバーライドできます。

protected override void Configure()
{
     _container = new ApplicationContainer();
     _container.AddFacility<TypedFactoryFacility>();
     _container.Register(AllTypes.FromAssembly(typeof(MainViewModel).Assembly)
         .Where(x => x.Name.EndsWith("ViewModel") || x.Name.EndsWith("View"))
         .Configure(x => x.LifeStyle.Is(LifestyleType.Transient)));
}

上記は、すべてのビューモデルとビューを登録します。Caliburnがビューを正しく見つけるには、SelectAssemblies()メソッドを更新します。

protected override IEnumerable<Assembly> SelectAssemblies()
{
   return new[]
   {
       Assembly.GetExecutingAssembly(),
       typeof(MainViewModel).Assembly
   };
}

Castle.Windsorの詳細については、 http: //stw.castleproject.org/Windsor.MainPage.ashxを参照してください。

于 2012-04-26T20:45:06.013 に答える