6

WPF Prism アプリケーションを構築しています。さまざまなモジュール プロジェクトに取り組んでいるさまざまな開発者がおり、複数のモジュールがメインのアプリケーション シェルに挿入されています。メイン アプリケーションも別のプロジェクトです。また、さまざまなアプリケーションでモジュールを使用できるようにしたいと考えています。すべてのアプリケーションでリージョンに同じ名前を付ける必要はありません。

たとえば、2 つの異なるアプリケーションで使用するモジュールがあるとします。あるアプリケーションでは、その開発者がモジュールの領域に「DetailsRegion」という名前を付け、別のアプリケーションでは、その開発者が「ResultsRegion」という名前を付けることがあります。

私が見つけることができるすべての例は、モジュールのクラス定義でリージョン名をハードコーディングすることにより、ビューをリージョンに登録します。

myRegionManager.RegisterViewWithRegion("RegionNameHere", GetType(ModuleViewType))

私がやりたいことは、リージョン名をメイン アプリケーションの app.config ファイルに入れ、この名前をモジュールに渡すことです。このようなもの:

メインのシェル アプリケーションの app.config:

<Modules>
   <SearchModule>
       <add key="RegionName" value="SearchRegion" />
    </SearchModule>
</Modules>

そして、モジュールのクラス ファイルで:

Dim settings As NameValueCollection = CType(ConfigurationManager.GetSection("Modules/SearchModule"), NameValueCollection)
Dim regionName as string = settings("RegionName")
myRegionManager.RegisterViewWithRegion(regionName, GetType(SearchModuleType)

ある意味で、これはモジュールをシェルから、またモジュール同士を完全に分離するための最後のステップです。

これは、モジュールのビューで完全に機能します。ただし、ConfigurationManager はそのレベルでは使用できないため、モジュールのクラス定義ファイルでは実行できません。

これを行うには、モジュールのapp.configの ApplicatonSettings セクションにリージョン名を入れます。しかし、これはモジュールを 1 つの場所に格納して複数のアプリケーションでロードできるようにするという目的を無効にします。これは、メイン アプリケーションのapp.configにある必要があります。

コードでリージョンの名前をハードコーディングせずに、モジュールのビューをリージョンに登録する方法はありますか? 私たちは何もハードコーディングしないように努めています。ここで本当に必要ですか?

4

2 に答える 2

5

Meleakがコメントですでに述べたように:静的クラスを使用する

namespace Infrastructure
{
    public static class RegionNames
    {
        public const string MainRegion = "MainRegion";
    }
}

xamlコードでは、次のようにリージョン名を使用できます。

<UserControl 
    xmlns:Inf="clr-namespace:Infrastructure;assembly=Infrastructure"
    xmlns:Regions="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism">
    <ContentControl Regions:RegionManager.RegionName="{x:Static Inf:RegionNames.MainRegion}"/>
</UserControl>
于 2011-09-14T07:34:27.430 に答える
3

わかった。ある点で私が間違っていたことが判明し、そのことをお詫び申し上げます。親アプリケーションの .config 設定は、モジュール クラス定義レベルで使用できます。正しい参照を追加し、正しいインポート (または使用) エントリを作成する必要があります。キーボードで昼寝をしていたに違いない。

ホスト アプリケーションのapp.configで、configSection 定義を追加します。ここでは、2 つのモジュールのセクションを定義します。

<configSections>
    <sectionGroup name="Modules">
        <section name="SearchModule" type="System.Configuration.NameValueSectionHandler" />
        <section name="HeaderModule" type="System.Configuration.NameValueSectionHandler"/>
    </sectionGroup>
   ...
</configSections>

ホスト アプリケーションのapp.config で、モジュール セクションと各モジュールのサブセクションを追加します。

<Modules>
    <SearchModule>
        <add key="Region" value="SearchRegion"/>
    </SearchModule>
    <HeaderModule>
        <add key="Region" value="HeaderRegion"/>
    </HeaderModule>
</Modules>

Module プロジェクトで、System.Configuration.dll への参照を追加します。System.Collections.Specialized と System.Configuration に "Imports" (VB) または "using" (C#) を追加します。

VB:
Imports System.Collections.Specialized
Imports System.Configuration

C#:
using System.Collections.Specialized;
using System.Configuration;

モジュールのクラス定義ファイルの Initialize メソッドで:

VB:
    Public Sub Initialize() Implements Microsoft.Practices.Prism.Modularity.IModule.Initialize
        Dim settings As NameValueCollection = CType(ConfigurationManager.GetSection("Modules/SearchModule"), NameValueCollection)
        MyRegionManager.RegisterViewWithRegion(settings("Region"), GetType(SearchModuleView))
    End Sub

C#:
    public void Initialize() : Microsoft.Practices.Prism.Modularity.IModule.Initialize
    {
        (NameValueCollection)settings = (NameValueCollection)ConfigurationManager.GetSection("Modules/SearchModule");
        MyRegionManager.RegisterViewWithRegion(settings["Region"], typeof(SearchModuleView));
    }

これにより、ホスト アプリケーションの app.config で作成されたエントリからビューがリージョンに登録されます。これは、1 つのモジュールを複数のホスト アプリケーション用に構築でき、ホスト内の任意の名前のリージョンに挿入できることを意味します。コンパイルされたコードを変更したり、アプリケーションごとに個別の RegionNames クラスを作成したりする必要はありません。

私たちのアプリケーションも MVVM アーキテクチャを使用して構築されています。ホスト アプリケーションで View-Model を定義し、RegionContext または EventAggregator を使用して app.config で定義された名前でモジュールに公開します。これにより、モジュールがアプリケーションから完全に分離され、モジュールを変更せずにさまざまなアプリケーションで完全に再利用できるようになります。

ご意見をお寄せいただきありがとうございます。これが将来他の誰かに役立つことを願っています。

于 2011-09-14T16:14:42.020 に答える