はじめに
本稿では、前回の記事に続き、Mini CMSシステムの構築を進めていきます。このシステムには、ワークプレースの実体を表すベースコンポーネントが必要です。これらのコンポーネントは、ワークプレース内へモジュールをロードして表示したり、モジュール間で制御を受け渡したり、処理終了時にモジュールをアンロードしたりといった処理を担います。モジュールからは、他のモジュールを呼び出したり、パラメータを渡したりできることが必要です。呼び出された側のモジュールは、呼び出し元のモジュールに制御を戻したり、終了ステータス(ユーザーが変更を保存したかキャンセルしたか)を併せて返したりします。呼び出し元のモジュールは、その内容に応じて、自らを更新します。
こうしたフレームワークの柔軟性を高めるためには、インターフェースを使用してコンポーネントを定義するのが1番です。実装の中身が既存の特定のコントロールと密接に結び付くのを避けることができ、将来の拡張や実装方法の変更にも対応しやすくなるからです。
WorkplaceコンポーネントとModuleコンポーネント
アプリケーションの屋台骨となるのが、WorkplaceコンポーネントとModuleコンポーネントです。Workplaceは実際にはコンテナで、各種機能を持つモジュールをこの中にロードできます。ここにロードしたモジュールが、アプリケーションの実際の処理を担うことになります。
WorkplaceとModuleが実装するインターフェースは次のとおりです。
- IWTWorkplace:図1に示すWorkplaceコンポーネントのインターフェースを定義したものです。このインターフェースを実装したコンポーネントを使って、実際のワークプレースを実現します。モジュールのロードと表示、既存のモジュールがロード済みかどうかのチェック、全モジュールの非表示化、モジュールの削除が可能です。このインターフェースのプロパティとメソッドは表1のとおりです。
- IWTModule:Moduleコンポーネントのインターフェースを定義したものです(図1を参照)。すべてのモジュールがこのインターフェースを実装する必要があります。プロパティとメソッドは表2のとおりです。
プロパティ | 説明 |
Control BodyPanel{ get; } | ワークプレースのコンテナの役割を果たすコントロールへの参照を返します。Visual WebGUIでは、Controlから派生したすべてのコンポーネントがControls プロパティ(ControlsCollection型)を公開する必要があります。このプロパティは、中に含むすべてのコントロールを保持するものです |
string Caption { get; set;} |
コンテナのキャプション値を設定または取得します。IWTWorkplaceをHeaderedPanelまたはGroupBoxとして実装することで、GroupBoxのタイトルのラベルまたはHeaderedPanelの見出しを設定できます |
メソッド | 説明 |
IWTModule LoadModule( IWTModule module, IWTModule parentModule) |
モジュールをアクティブモジュールとしてロードし、そのモジュールへの参照を返します。第2パラメータのparentModule, には、親のIWTModuleモジュール(このモジュールの起動元となるモジュール)への参照を指定します。つまりparentModule パラメータでは、新しくロードしたモジュールの終了後にどのモジュールをアクティブにするかを制御できます。またparentModule にはnullも指定できます。その場合は、現在のモジュールには親はないという意味になります。IWTWorkplaceの最初のモジュールの場合や、これまでにロードした他のモジュールとの間に依存関係がない場合には、nullを指定するとよいでしょう |
IWTModule LoadModule( IWTModule module, IWTModule parentModule, bool loadVisible); |
上のメソッドとほぼ同じですが、非表示でのモジュールのロードにも対応している点が異なります。ロードしたモジュールを表示する前にプログラムで追加的な処理が必要な場合には、非表示でのロードが便利です |
void ShowModule( IWTModule module); |
ロード済みのモジュールをアクティブ化します |
bool CheckModuleExists( IWTModule module); |
指定したモジュールがIWTWorkplaceに読み込み済みかどうかをチェックします |
void RemoveModule( IWTModule module); |
指定のモジュールをIWTWorkplaceから削除します |
void HideAllModules(); | 全モジュールを非表示にします |
プロパティ | 説明 |
IWTModule CallerModule { get; set; } |
呼び出し元のモジュールへの参照を取得または設定します。呼び出し元のモジュールのプロパティやメソッドにアクセスするときに使用できます |
IWTWorkplace HostWorkplace { get; set; } |
モジュールをロードしたワークプレースコンポーネントへの参照です |
メソッド | 説明 |
void Refresh( WTCancelGenericEventArgs e) |
このメソッドは、IWTWorkplaceコンポーネントがモジュールを終了して呼び出し元モジュールに制御を返すときに呼び出す必要があります。モジュールの終了時にはClose イベントが発生し、WTCancelGenericEventArgs型の引数が渡されます。ワークプレースはRefresh メソッドを呼び出して、この引数を呼び出し元のモジュールに渡します |
event WTCancelGenericEventHandler Close; | IWTModuleの終了時に発生するイベントです |
IWTModuleとIWTWorkplaceの間のやり取りを制御するのがWTWorkplaceControllerクラスです。表3に示す静的メソッドのみを持ち、モジュールとワークプレースの橋渡しとなります。
メソッド | 説明 |
public static IWTModule LoadModule( IWTWorkplace workplace, IWTModule module, IWTModule parentModule, bool loadVisible) |
ワークプレースにモジュールをロードします。親モジュール(現在のモジュールの起動元のモジュール)の指定と、ロードするモジュールの表示/非表示の指定も可能です |
public static void ShowModule( IWTWorkplace workplace, IWTModule module) |
ワークプレースにロード済みのモジュールを表示します |
public static void RemoveModule( IWTWorkplace workplace, IWTModule module) |
ワークプレースからモジュールを削除します |
public static void HideAllModules( IWTWorkplace workplace) |
ワークプレースの全モジュールを非表示にします |
public static bool CheckModuleExists( IWTWorkplace workplace, IWTModule module); |
モジュールがワークプレースにロード済みかどうかを調べます |