ПРИЗМА: Модули ПРИЗМЫ предназначены для просмотра только одного региона? - PullRequest
1 голос
/ 31 марта 2011

Я действительно не понимаю, что должно быть внутри модуля.

Когда я вызываю RegisterViewWithRegion для многих представлений, все они загружаются вместе во время инициализации модуля ... Все эти представления предназначены для размещениявнутри одного региона, потому что это разные процессы одного и того же модуля.

Давайте скажем, что у меня есть модуль с именем Inventory, и он содержит представление для продуктов, представление для заказов и т. д. Все онисвязан с регионом с именем "MainRegion", и я хотел бы создать эти представления, когда пользователь запрашивает их, а не когда модуль инициализируется.

На мой взгляд, единственный ответ на эту загадку заключается в том, что модули Prism предназначеныиметь (что я называю) ТОЛЬКО ОДИН процесс внутри, так что в итоге я получу различные модули, подобные этому:

Inventory.Products.xap

Inventory.Orders.xap

... и т. Д.

Это правильно?Есть ли альтернатива, которая позволяет мне хранить эти процессы вместе в одном модуле?и в этом случае это удобно?

Заранее спасибо!Жан Поль

Ответы [ 3 ]

4 голосов
/ 02 апреля 2011

Просто добавьте к тому, что сказал @David, Prism помогает вам логически разделять различные модули, а разделение каждого представления на собственный модуль - это (а) огромный перебор и (б) плохая архитектура.

хорошая архитектура - это умение разделять и преодолевать задачи приложения, а это значит знать, когда делить вещи, а иногда еще важнее, когда не делить вещи .

4 голосов
/ 01 апреля 2011

Prism проводит различие между созданием представления и его отображением.В Prism 4 появился новый API для отображения регионов по запросу, но отображение по запросу может быть выполнено и с более старыми версиями.Если ваши представления не требуют значительных ресурсов, я бы предложил загрузить их во время начальной загрузки, а затем отобразить их по запросу пользователя.

Вот пара статей, которые должны помочь:

Prism 4.0 Отображение по требованию

Отображение по требованию - старые версии Prism

0 голосов
/ 05 апреля 2011

Ну, думаю, я наконец понял, как это должно работать.

Чтобы установить основание для этой публикации, скажем, что модуль приложения (не призменный модуль) представляет собой набор представлений (ранее называвшихся формами) и процедур, связанных с конкретными действиями в бизнес-процессе, например: Продажи , Инвентарь, банковское дело ... и т. Д.

Внутри каждого модуля приложения мы найдем такие процессы, как Sales.Invoices, Sales.Orders, Inventory.Products, Inventory.Stocks и т. Д.

Теперь в призме, как говорит @Elad, создание нового проекта для каждого процесса внутри модуля приложения может быть огромным перебором, и, как говорит @David, Prism делает различие между созданием представления и его отображением.

Ну, чтобы поступить правильно (то есть послушать этих ребят), я решил пойти так:

1) Отличить проект Visual Studio от модуля Prism: На самом деле нет необходимости разбивать прикладные модули на различные проекты в вашем решении, все, что вам нужно сделать, это создать один проект с помощью «прикладного модуля»

2) Создайте разные классы инициализатора модулей внутри каждого проекта «Модуль приложений», по одному для каждого процесса, например ::1133*

Для процесса "A" внутри модуля MyApplicationModule:

      <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

Для процесса "B" внутри модуля MyApplicationModule:

<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 один за другим, вы можете загрузить определение модулей из файла, но принцип тот же:

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

...