まあ、私はそれがどのように機能することになっているのかをようやく理解したと思います。
この投稿の根拠を設定するために、アプリケーションモジュール(プリズムモジュールではない)が、ビジネスプロセスの特定のアクティビティに関連するビュー(以前はフォームと呼ばれていました)と手順のコレクションであるとします。たとえば、販売、在庫、銀行...など
各アプリケーションモジュール内には、Sales.Invoices、Sales.Orders、Inventory.Products、Inventory.Stocksなどのプロセスがあります。
さて、@ Eladが言うように、Prismでは、アプリケーションモジュール内のプロセスごとに新しいプロジェクトを作成するのは非常にやり過ぎかもしれません。@ Davidが言うように、Prismはビューのインスタンス化と表示を区別します。
さて、正しいことをするために(それはこれらの人に耳を傾けることです)、私はこのように行くことにしました:
1)Visual StudioプロジェクトとPrismモジュールを区別する:ソリューション内でアプリケーションモジュールを別のプロジェクトに分割する必要はありません。必要なのは、「アプリケーションモジュール」で1つのプロジェクトを作成することだけです。
2)各「アプリケーションモジュール」プロジェクト内に、プロセスごとに1つずつ、異なるモジュール初期化クラスを作成します。例:
MyApplicationModule内のプロセス「A」の場合:
<ModuleExport(GetType(MyApplicationModule.ProcessAInitializer))> _
Public Class ProcessAInitializer
Implements IModule
<Import()> _
Public Property RegionManager As IRegionManager
#Region "IModule Implementation"
Public Sub Initialize()
Implements Microsoft.Practices.Prism.Modularity.IModule.Initialize
RegionManager.RegisterViewWithRegion(RegionNames.SubMenuView,
GetType(MyApplicationModule.SubMenuViewA))
RegionManager.RegisterViewWithRegion(RegionNames.ContentRegion,
GetType(MyApplicationModule.ContentViewA))
End Sub
#End Region
End Class
MyApplicationModule内のプロセス「B」の場合:
<ModuleExport(GetType(MyApplicationModule.ProcessBInitializer))> _
Public Class ProcessBInitializer
Implements IModule
<Import()> _
Public Property RegionManager As IRegionManager
#Region "IModule Implementation"
Public Sub Initialize()
Implements Microsoft.Practices.Prism.Modularity.IModule.Initialize
RegionManager.RegisterViewWithRegion(RegionNames.SubMenuView,
GetType(MyApplicationModule.SubMenuViewB))
RegionManager.RegisterViewWithRegion(RegionNames.ContentRegion,
GetType(MyApplicationModule.ContentViewB))
End Sub
#End Region
End Class
3)これを取得したら、モジュールカタログがシェルプロジェクトで作成される方法を少し変更しましょう。私の場合、コードを使用してPrismモジュールを1つずつ追加しています。ファイルからモジュール定義をロードできますが、原則は同じです。
Protected Overrides Function CreateModuleCatalog() As
Microsoft.Practices.Prism.Modularity.IModuleCatalog
Dim objModuleCatalog = New ModuleCatalog
objModuleCatalog.AddModule(New ModuleInfo()
With {.InitializationMode = InitializationMode.OnDemand,
.Ref = "MyApplicationModule.xap",
.ModuleType = "MyApplicationModule.ProcessAInitializer, MyApplicationModules, Version 1.0.0.0, Culture=neutral, PublicKeyToken=null",
.ModuleName = "ProcessAInitializer"})
objModuleCatalog.AddModule(New ModuleInfo()
With {.InitializationMode = InitializationMode.OnDemand,
.Ref = "MyApplicationModule.xap",
.ModuleType = "MyApplicationModule.ProcessBInitializer, MyApplicationModule, Version 1.0.0.0, Culture=neutral, PublicKeyToken=null",
.ModuleName = "ProcessBInitializer"})
Return objModuleCatalog
End Function
結論
このように、ユーザーがこの特定の「ビジネスプロセス」を要求した場合にのみ、ビューがインスタンス化されます。ソリューションを小さな部分に分割する必要がないため、コンパイルに時間がかかり、ソリューションは「チームフレンドリー」です。
ありがとう@David&@ Elad