Microsoft のComposite Application Libraryを使用して設計されたアプリケーションがあります。私のシェルには、個別のモジュールからコンテンツを挿入できるように、いくつかの領域が定義されています。これらの領域が導入する結合を減らす設計パターンを探しています。
私が見たすべての例では、リージョンはインフラストラクチャ プロジェクトの静的クラスの文字列を使用して定義およびアクセスされます。
<ItemsControl cal:RegionManager.RegionName="{x:Static inf:RegionNames.TabRegion}">
public static class RegionNames
{
public const string TabRegion = "TabRegion";
}
これにより、インフラストラクチャ プロジェクトの一部がシェルと一致する必要があるため、インフラストラクチャ プロジェクトからシェルへの依存関係が導入されます。定義されていないリージョンにアクセスしようとすると、CAL RegionManager が例外をスローするため、インフラストラクチャ プロジェクトとシェル プロジェクトが同期されていることを確認する必要があります。
シェルの領域を分離して、シェル内でのみ定義されるようにする方法はありますか (インフラストラクチャ プロジェクトに領域名はありません)。
リージョンをオプションにして、シェルがすべて同じリージョンを持っていなくてもシェルを交換できるようにする方法はありますか? (例: あるシェルにはメニューとツールバーの領域があり、別のシェルにはメニューしかありません...モジュールは、ツールバーが利用可能であればツールバーに挿入でき、そうでない場合は失敗することはありません)
更新 - 私のアーキテクチャの詳細
以下のdedratureboyの回答に応えて、システムのセットアップ方法を説明したいと思いました...おそらく、より良いフィードバックがあるでしょう。
私は Infrastructure および Shell プロジェクトを汎用ライブラリとして扱っており、それらを使用するアプリケーションがいくつかあります。インフラストラクチャ プロジェクトは "フレームワーク" コードとリソース (MVVM のもの、リフレクション、アイコンなど) を提供し、シェルは基本的なウィンドウ レイアウト (メニュー、ツールバー、ステータス バー、メイン コンテンツ領域) を備えた汎用ホスト ウィンドウです。アプリケーションはすべて、シェルを共有しているため、共通の外観と動作を共有しています。
私のアプリケーションは、ロードされるモジュールから個々の機能を取得するため、アプリケーションごとにすべてをまとめたブートストラップ プロジェクトがあります (インフラ、シェル、モジュール)。
現在のものとは大きく異なるまったく新しいアプリケーションを開発する必要が生じた場合、インフラストラクチャ プロジェクトは再利用できますが、シェルは再利用できないと思います。そのため、インフラストラクチャ プロジェクトとシェルを切り離すことに興味があります。