1

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、ビューモデルの登録でも正しく初期化されます。

4

2 に答える 2

1

モジュール クラスの目的を誤解されているようです。モジュール クラスは、モジュール アセンブリで提供されるクラスを登録するために使用されます。これは、インフラストラクチャのみを目的としています。したがって、モジュール クラス内にビジネス ロジックを配置しようとしないでください。

ブレークポイントがヒットしない理由は、DI コンテナーが挿入された型の HelloWorldModule2ViewModel を解決できないためです。初期化する前に DI コンテナーを使用しようとすると、初期化プロセスが例外によって中止されます。

Prism マニュアルを見て、第 2 章を注意深く読んでください。参照実装も見てください。

于 2012-09-19T13:06:45.820 に答える