n階層システム設計の考慮点

第4回 各コンポーネントの設計について(2)

この記事を読むのに必要な時間:およそ 7 分

ユーザインターフェイスプロセスコンポーネントの設計について

画像

① ユーザインターフェイスプロセスコンポーネントの設計について

ユーザンターフェイスプロセスコンポーネントの設計では,以下の点に注意して設計します。

概要

ユーザインターフェイスプロセスコンポーネントは,ユーザインターフェイスコンポーネントから呼び出し可能なメソッドを公開するクラスとして公開されます。このクラスは,ユーザインターフェイスコンポーネントからインスタスが生成され,プロセス全体はこのインスタンスを使用します。このインスタンス内で実行されるプロセスから呼び出されるWindows FormやASP.NETのページを動的に構成する場合は,構成ファイルなどのメタデータストアから取得し画面を作成します。

ユーザインターフェイスプロセスコンポーネントとユーザインターフェイスコンポーネントを分離することにより,Web Formなどの非同期アプリケーションやWindows Form,Office製品をフロントエンドとして用いたアプリケーションでの表示・入力の時間に関係なく,業務を続行することができます。

文字コード変換

ユーザインターフェイスプロセスコンポーネントはユーザインターフェイスコンポーネントの要素の表示をコントロールします。その一環として,文字コードの統一のため,複数言語を使用する場合,ユーザインターフェイスプロセスコンポーネントでサポートする言語の文字コードとアプリケーションおよびデータベース内で使用する文字コードへの変換を行います。ここで文字コード変換を行わないと,各言語の文字コード別にビジネスレイヤ内のロジックを作成する必要があり,各レイヤ間の独立性が損なわれることとなります。

しかし,Web Formベースアプリケーションの場合,ユーザンターフェイスプロセスコンポーネントでは文字コードの変換ができないため,ビジネスレイヤのサービスインターフェイスでの変換が必要になります。

各コンポーネントのコントロール

ユーザインターフェイスプロセスコンポーネントは複数のユーザインターフェイスコンポーネント間のデータのやり取り,連携をコントロールします。これにより,複雑なアプリケーションを構築することができます。

ここで,一つのシナリオを考えてみましょう。A社はインターネットサイトで注文を受け付けるサイトを構築します。注文者であるエンドユーザはインターネット経由で注文をしてきます。しかし,クレジットなどの個人情報や配送に関することは個別にオペレータと直接電話でやり取りする場合を想定します。この場合,注文者は注文状況をインターネット経由でブラウザを用いて確認します。A社の電話オペレータは自社内のLAN環境でWindows Formを用いて注文者の注文状況を確認します。この際,ユーザインターフェイスプロセスコンポーネントとユーザインターフェイスコンポーネントが分離されていれば,ユーザインターフェイスプロセスコンポーネントを再利用してWeb Form用とWindows Form用を共通して構築することができます。

ただし,すべてが共通化できるわけでなく,当然,Windows Form個別のロジックやWeb Form個別のロジックは別々に設計・実装する必要があります。しかし,ビジネスレイヤとの通信や画面内の項目間チェックなどの裏側のロジックは共通化ができるため,工数の削減,再利用性の向上,品質の確保が図ることができます。

状態の管理

また,ユーザインターフェイスプロセスコンポーネントの状態を管理・保存する仕組みを検討する必要があります。

Windows FormベースアプリケーションであればローカルPC内や複数のユーザで業務の途中の状態を共有する場合は,サーバやデータベースに保存することを検討します。

Web Formベースアプリケーションでは,ユーザのプロセス状態及び業務データはASP.NETのセッションオブジェクトに保持できます。しかし,保持する先については検討が必要です。IISが稼働しているサーバが複数あり,それらで負荷分散を行っている場合,セッションの状態を保持する専用のサーバを構成し保持するか,SQL Serverを業務データベースとは別に構築し,そこに保持するかを選択する必要がります。この際,SQL Serverに保持されたセッションデータは,保持期限が切れた時に自動的に削除され,蓄積されることはありません。これらのセッションの保持についてはweb.configに記述することができるため,開発時はローカルもしくは開発サーバ内で保持させ,本番環境ではセッションサーバもしくはSQL Serverへ変更することは容易にできます。しかし,本稼働前の負荷テストは本番環境で実施し,検証する必要があります。

例外対応

ユーザンターフェイスプロセスコンポーネントでも例外設計は必要です。この場合,例外を漏れなくキャッチし,メッセージ化し,ログ出力し,ユーザンターフェイスコンポーネントでエラーとして表示させるためのデータを渡します。ここで,エラーオブジェクトを渡してしまうと発生場所の特定が難しくなるばかりでなく,ユーザンターフェイスコンポーネントとの独立性が保てなくなる可能性があります。

トランザクション

トランザクションはプレゼンテーションレイヤから開始・参加や投票しないようにします。これは,プレゼンテーションレイヤは接続型・非接続型の両方があり,設計の統一性を考慮するとトランザクションルートとならないほうがよいことが多いためです。特にデータ更新・削除に伴う業務を設計する場合のトランザクションは排他制御が難しくなります。これらトランザクションはビジネスレイヤで制御し,楽観排他・悲観排他や整合性を保ったデータの参照などを考慮した設計をする必要があります。

レイヤ間の通信

最後にビジネスレイヤとユーザインタフェイスプロセスコンポーネントとの通信についてですが,以前はインプロセス,関数による呼び出し,.NET Remotingなどがありましたが,.NET Framework 3.0以降をフレームワークとして採用する場合はWCFの活用を是非検討してください。今まで煩雑であったデータの受け取りや手順などがWCFを用いることにより非常に簡単に,安全にできるようになっています。生産性の向上,保守性の確保,品質の向上の観点からもWCFの採用を検討してみてください。

著者プロフィール

露木敏博(つゆきとしひろ)

1966年神奈川県横浜市生まれ。1990年,株式会社日立システムアンドサービス(旧日立システムエンジニアリング株式会社)に入社。

流通系SE,営業所駐在SEなどを経て,2003年から生産技術部門で.NET技術に関する技術支援業務に携り,.NET技術に関する各種基準書および標準化,設計ガイドなどを作成。

マイクロソフトMVPアワードプログラムよりDevelopment Platforms - ASP/ASP.NETのカテゴリで2008年7月よりMVPアワードを受賞。