Silverlight PRISM:PRISM模块是否打算每个区域只有一个视图?

Silverlight PRISM:PRISM模块是否打算每个区域只有一个视图?,silverlight,views,prism,modularity,regions,Silverlight,Views,Prism,Modularity,Regions,我真的很困惑模块内部应该是什么 当我为许多视图调用RegisterViewWithRegion时,它们都在模块初始化期间加载在一起。。。所有这些视图都应位于同一区域内,因为它们是同一模块的不同进程 假设我有一个名为Inventory的模块,它包含一个产品视图、一个订单视图等。所有这些视图都与一个名为“MainRegion”的区域相关联,我希望在用户请求时实例化这些视图,而不是在模块初始化时实例化 在我看来,这个谜团的唯一答案是Prism模块的内部(我称之为)只有一个进程,所以这样我将得到不同的模

我真的很困惑模块内部应该是什么

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

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

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

Inventory.Products.xap

Inventory.Orders.xap

。。。等等

是这样吗? 有没有其他方法可以让我将这些流程放在一个模块中?在这种情况下,这样方便吗

提前谢谢!
Jean-Paul

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

以下几篇文章应该会有所帮助:


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

以下几篇文章应该会有所帮助:


为了补充@David所说的,Prism有助于逻辑上分离不同的模块,而将每个视图分离到它自己的模块是(a)一个巨大的过度杀伤力,(b)一个糟糕的架构


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

除了@David所说的,Prism有助于逻辑上划分不同的模块,将每个视图划分为自己的模块是(a)一个巨大的杀伤力,(b)一个糟糕的架构


好的体系结构就是知道如何划分和征服应用程序的任务,这意味着知道何时划分任务,有时更重要的是,何时不划分任务。

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

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

在每个应用程序模块中,我们将找到诸如销售、发票、销售、订单、库存、产品、库存、库存等流程

现在,正如@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
<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
结论

这样,只有当用户请求这个特定的“业务流程”时,您的视图才会被实例化,您不需要将您的解决方案拆分为更小的部分,因此编译过程将永远耗时,并且您的解决方案仍然是“团队友好型”的


谢谢你@David&@Elad

好吧,我想我终于明白了它的工作原理

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

在每个应用程序模块中,我们将找到诸如销售、发票、销售、订单、库存、产品、库存、库存等流程

现在,正如@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
<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
结论

这样,只有当用户请求这个特定的“业务流程”时,您的视图才会被实例化,您不需要将您的解决方案拆分为更小的部分,因此编译过程将永远耗时,并且您的解决方案仍然是“团队友好型”的


谢谢你@David&@Elad

谢谢你,David!。。。是的,我的视图实例化了一个Viewmodel,这个VM实例化了一个具有多个查找列表和安全相关对象的UnitOfWork。。。这就是为什么我不喜欢它们在模块初始化时被实例化的事实…谢谢David!。。。是的,我的观点是正确的