0

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 のもの、リフレクション、アイコンなど) を提供し、シェルは基本的なウィンドウ レイアウト (メニュー、ツールバー、ステータス バー、メイン コンテンツ領域) を備えた汎用ホスト ウィンドウです。アプリケーションはすべて、シェルを共有しているため、共通の外観と動作を共有しています。

私のアプリケーションは、ロードされるモジュールから個々の機能を取得するため、アプリケーションごとにすべてをまとめたブートストラップ プロジェクトがあります (インフラ、シェル、モジュール)。

現在のものとは大きく異なるまったく新しいアプリケーションを開発する必要が生じた場合、インフラストラクチャ プロジェクトは再利用できますが、シェルは再利用できないと思います。そのため、インフラストラクチャ プロジェクトとシェルを切り離すことに興味があります。

4

1 に答える 1

2

あなたの論理は逆だと思います。あなたの殻は、すべてを結び付ける接着剤です。私の考えでは、インフラストラクチャとシェルはアプリケーションであるため、緊密に結合する必要があります。モジュールは、動的に変更および切り替えを行うアプリケーションの一部です。たとえば、別の開発者がアプリケーションのモジュールを記述して、別の開発者が別のビューをどこに配置するか、アプリケーションがそのモジュールをアタッチしてどのように動作するかを把握できるように、シェル領域を静的にする必要があります。インフラストラクチャ プロジェクトは、シェルとそのモジュールの間を行き来するためにあります...少なくとも私の本では、それは単なる現実です。明日、WPFの専門家の1人が、それを完全に吹き飛ばす何かを思いつくかもしれません....

于 2010-04-29T17:47:07.710 に答える