1

我对模块中应该包含的内容感到非常困惑。

当我为许多视图调用 RegisterViewWithRegion 时,它们都在模块初始化期间一起加载......所有这些视图都旨在托管在同一区域内,因为它们是同一模块的不同进程。

假设我有一个名为 Inventory 的模块,它包含一个产品视图、一个订单视图等。所有这些都与一个名为“MainRegion”的区域相关联,我想在用户请求它们时实例化这些视图,而不是在模块初始化时。

在我看来,这个谜的唯一答案是 Prism 模块旨在(我称之为)内部只有一个进程,所以这样我最终会得到不同的模块,如下所示:

库存.产品.xap

库存.订单.xap

... 等等。

那正确吗?是否有任何替代方法可以让我将这些流程放在一个模块中?在这种情况下,这方便吗?

提前致谢!让·保罗

4

3 回答 3

4

Prism 对实例化视图和显示视图进行了区分。Prism 4 有一个用于按需显示区域的新 API,但也可以使用旧版本进行按需显示。除非您的视图是资源密集型的,否则我建议在引导时加载它们,然后根据用户的要求显示它们。

这里有几篇文章应该会有所帮助:

Prism 4.0 按需显示

按需显示 - Prism 的旧版本

于 2011-03-31T21:01:40.917 回答
4

只是为了补充@David所说的,Prism可以帮助您在逻辑上分离不同的模块,并且将每个视图分离到它自己的模块是(a)一个巨大的过度杀伤,以及(b)一个糟糕的架构。

好的架构是知道如何划分和征服应用程序的任务,这意味着知道何时划分事物,有时甚至更重要的是,何时不划分事物

于 2011-04-02T00:57:55.863 回答
0

好吧,我想我终于明白它应该如何工作了。

为了给这篇文章打下基础,假设应用程序模块(不是棱镜模块)是与业务流程中的特定活动相关的视图(以前称为表单)和过程的集合,例如:销售、库存、银行...等

在每个应用程序模块中,我们会发现诸如 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

于 2011-04-05T04:10:31.437 回答