好吧,我想我终于明白它应该如何工作了。
为了给这篇文章打下基础,假设应用程序模块(不是棱镜模块)是与业务流程中的特定活动相关的视图(以前称为表单)和过程的集合,例如:销售、库存、银行...等
在每个应用程序模块中,我们会发现诸如 Sales.Invoices、Sales.Orders、Inventory.Products、Inventory.Stocks 等流程。
现在,正如@Elad 所说,在 prism 中为应用程序模块内的每个进程创建一个新项目可能是一个巨大的矫枉过正,正如 @David 所说,Prism 在实例化视图和显示视图之间进行了区分。
好吧,为了做正确的事(就是听这些家伙的话),我决定这样做:
1) 将 Visual Studio 项目与 Prism 模块区分开来:实际上没有必要在解决方案中将应用程序模块分解为不同的项目,您只需通过“应用程序模块”创建一个项目即可
2)在每个“应用程序模块”项目中创建不同的模块初始化器类,每个进程一个,例如:
对于 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)一旦我们得到了这个,让我们稍微改变一下你的模块目录是如何在你的shell项目上创建的。就我而言,我正在使用代码一个一个地添加 Prism 模块,您可以从文件中加载模块定义,但原理是相同的:
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