1

モジュール内にあるはずのものについて本当に混乱しています。

多くのビューに対して RegisterViewWithRegion を呼び出すと、それらはすべてモジュールの初期化中に一緒にロードされます...これらのビューはすべて、同じモジュールの異なるプロセスであるため、同じリージョン内でホストされることを意図しています。

Inventory という名前のモジュールがあり、Products のビュー、Orders などのビューが含まれているとしましょう。それらはすべて「MainRegion」という名前のリージョンに関連付けられており、ユーザーが要求したときにそれらのビューをインスタンス化したいと考えています。 、モジュールが初期化されたときではありません。

私の考えでは、この謎に対する唯一の答えは、Prism モジュールは (私が呼ぶように) 内部に 1 つのプロセスしか持たないように意図されているということです。

在庫.製品.xap

在庫.注文.xap

... 等々。

そうですか?これらのプロセスを 1 つのモジュール内にまとめる代替手段はありますか? この場合、これは便利ですか?

前もって感謝します!ジャン・ポール

4

3 に答える 3

4

@Davidが言ったことに付け加えると、Prismはさまざまなモジュールを論理的に分離するのに役立ち、各ビューを独自のモジュールに分離することは(a)非常にやり過ぎであり、(b)悪いアーキテクチャです。

優れたアーキテクチャとは、アプリケーションのタスクを分割して克服する方法を知っていることです。つまり、いつ分割するか、さらに重要なこととして、いつ分割しないかを知ることです。

于 2011-04-02T00:57:55.863 に答える
4

Prism は、ビューのインスタンス化と表示を区別します。Prism 4 にはリージョンをオンデマンドで表示するための新しい API がありますが、古いバージョンでもオンデマンド表示を行うことができます。ビューがリソースを集中的に使用しない限り、ブートストラップ時にビューをロードし、ユーザーの要求に応じて表示することをお勧めします。

以下に役立つ記事をいくつか示します。

Prism 4.0 ディスプレイオンデマンド

ディスプレイ オン デマンド - Prism の旧バージョン

于 2011-03-31T21:01:40.917 に答える
0

まあ、私はそれがどのように機能することになっているのかをようやく理解したと思います。

この投稿の根拠を設定するために、アプリケーションモジュール(プリズムモジュールではない)が、ビジネスプロセスの特定のアクティビティに関連するビュー(以前はフォームと呼ばれていました)と手順のコレクションであるとします。たとえば、販売、在庫、銀行...など

各アプリケーションモジュール内には、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

于 2011-04-05T04:10:31.437 に答える