PrismとUnityでアプリを作っています。を使用しDirectoryModuleCatalog
て、メイン メニューに表示されるディスクから複数のモジュールをロードします。この特定のモジュールの名前をクリックすると、このモジュールの UI がロードされます。各モジュールは MVVM モデルに従って設計されているため、個別のビューとビュー モデルを使用します。
ブートストラップ:
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
Shell shell = Container.Resolve<Shell>();
shell.Show();
return shell;
}
protected override void InitializeShell()
{
base.InitializeShell();
App.Current.MainWindow = (Window)this.Shell;
App.Current.MainWindow.Show();
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterType<IApplicationMenuRegistry, MenuRegistry>();
Container.RegisterType<IApplicationCommands, ApplicationCommands>();
Container.RegisterType<ShellViewModel, ShellViewModel>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
//****** When I uncomment following line, the HelloWorldModule2 doesn't get initialized ***********
// Container.RegisterType<HelloWorldModule2ViewModel, HelloWorldModule2ViewModel>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
}
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @"C:\Data\NPC Service Tool\Source\develop\POC\GUIWithPrism\Modules" };
}
}
モジュール:
namespace HelloWorldModule2
{
[Module(ModuleName="HelloWorldModule2")]
public class HelloWorldModule2 : IModule
{
private IApplicationMenuRegistry menuRegistry;
private HelloWorldModule2ViewModel viewModel;
private IRegionManager regionManager;
public HelloWorldModule2(IApplicationMenuRegistry menuRegistry, HelloWorldModule2ViewModel vm, IRegionManager regionManager)
{
this.menuRegistry = menuRegistry;
this.regionManager = regionManager;
this.viewModel = vm;
}
public void Initialize()
{
ObservableCollection<ViewObject> views = new ObservableCollection<ViewObject>();
views.Add(new ViewObject() { Region = RegionName.Right, ViewType = typeof(HelloWorld2View) });
views.Add(new ViewObject() { Region = RegionName.Left, ViewType = typeof(View2) });
//****** Here the module gets registered in the main menu ******//
menuRegistry.RegisterModuleMenuItem("HelloWorld2", "Hello World module 2",views,1);
this.viewModel.Title = "Hello world module 2";
}
}
}
モデルを見る:
namespace HelloWorldModule2.ViewModels
{
public class HelloWorldModule2ViewModel : NotificationObject
{
private string title;
public string Title
{
get { return title; }
set
{
title = value;
RaisePropertyChanged(() => this.Title);
}
}
}
}
次の問題に遭遇しました: Bootstrapper コードに見られるようにビュー モデルを Unity コンテナーに登録すると、モジュールが初期化されません (Initialize
モジュールのメソッドにブレークポイントを設定しましたが、ヒットしません)。登録を削除し、モジュールのコンストラクターで vm パラメーターを削除すると、モジュールは初期化されます。
また、このモジュールを使用してモジュールカタログを手動で構成する場合:
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
moduleCatalog.AddModule(typeof(HelloWorldModule2.HelloWorldModule2));
}
の代わりにDirectoryModuleCatalog
、ビューモデルの登録でも正しく初期化されます。