-
Notifications
You must be signed in to change notification settings - Fork 49
UserGuide_RichClient.ja
2026年7月更新版
- Open 棟梁を用いたアプリケーション開発を行う、SE・開発者
本ドキュメントは、リッチクライアント用機能の利用方法について纏めています。
本ドキュメントに記載の会社名・商品名は、各社の商標または登録商標です。
図中の凡例:赤枠=実装必須、赤枠 (破線)=実装に注意が必要、青文字=任意の実装が可能。
Windows Form 用 P層ベースクラスである「画面コード親クラス2」には、次に示す P層の共通処理を実装できます。
表 1.1 「画面コード親クラス2」に実装できる P層の共通処理
| 項番 | 処理 | メソッド | 説明項 |
|---|---|---|---|
| 1 | 初期処理 (ページ ロード処理) | UOC_CMNFormInit(カスタム認証、権限チェック、閉塞チェック、ページ タイトルの設定、アクセス ログの出力 ,etc.) | 1.1.1 項 |
| 2 | P層イベント処理の前後処理:開始処理 | UOC_PreAction(処理時間の測定、アクセス ログの出力 ,etc.) | 1.1.2 項 |
| 3 | 終了処理 | UOC_AfterAction(処理時間の測定、アクセス ログの出力 ,etc.) | 1.1.2 項 |
| 4 | 例外処理 | UOC_ABEND(メッセージ編集、共通メッセージの表示、アクセス ログ、エラー ログ出力 ,etc.) | 1.1.3 項 |
基本的に「画面コード親クラス2」は 1 つのシステムに対して 1 つ作成します。サンプルは ~\root\programs\C#\Samples\WS_sample\WSClient_sample にあります (「MyBaseControllerWin」クラスを参考にできます)。
#region using
// System~
using System;
~
using Touryo.Infrastructure.Business.Util;
#endregion
namespace Touryo.Infrastructure.Business.RichClient.Presentation
{
/// <summary>画面コード親クラス2(Windowアプリケーション)</summary>
/// <remarks>(オーバーライドして)自由に利用できる。</remarks>
public class MyBaseControllerWin : BaseControllerWin
{
// ↑abstractだとVSデザイナが機能しないので外した。
/// <summary>ユーザ情報</summary>
/// <remarks>画面コード親クラス2、画面コード クラスから利用する。</remarks>
protected static MyUserInfo UserInfo = new MyUserInfo("-", Environment.MachineName);
/// <summary>ログ出力の可否フラグ</summary>
/// <remarks>
/// 自動デプロイ環境ではログ出力が出来ない
/// ことがあるので、その場合に利用すること。
/// </remarks>
protected static bool CanOutPutLog = true;
/// <summary>性能測定</summary>
private PerformanceRecorder perfRec;図 1.1 「画面コード親クラス2」の実装のテンプレート
※ 「MyBaseControllerWin」クラスには共通的な UI 実装を追加することも可能ですが、「画面コード親クラス1」の「BaseControllerWin」クラスが abstract に指定されているため VS デザイナは使用できないので注意します。
「ページ ロード処理」は実装必須の処理です。「UOC_CMNFormInit」メソッドを「画面コード親クラス2」でオーバーライドし、カスタム認証、権限チェック・閉塞チェック、ページ タイトルの設定、アクセス ログの出力 ,etc. を実装します。
/// <summary>ページロードのUOCメソッド</summary>
/// <remarks>実装必須</remarks>
protected override void UOC_CMNFormInit()
{
// フォーム初期化(初回ロード)時に実行する処理を実装する
// TODO:
}図 1.1.1 「ページ ロード処理」の実装例
「UOC_PreAction」「UOC_AfterAction」メソッドを「画面コード親クラス2」でオーバーライドし、処理時間の測定、アクセス ログの出力 ,etc. を実装します。
#region フレームワークの対象コントロールイベントの開始 終了処理のUOCメソッド
/// <summary>フレームワークの対象コントロールイベントの開始処理を実装</summary>
/// <param name="fxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_PreAction(FxEventArgs fxEventArgs)
{
// フレームワークの対象コントロールイベントの開始処理を実装する
// TODO:
}
/// <summary>フレームワークの対象コントロールイベントの終了処理を実装</summary>
/// <param name="fxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_AfterAction(FxEventArgs fxEventArgs)
{
// フレームワークの対象コントロールイベントの終了処理を実装する
// TODO:
}
#endregion図 1.1.2 「P層イベント処理の開始・終了処理」の実装例
以下の 3 つの「UOC_ABEND」メソッドを「画面コード親クラス2」でオーバーライドします。
表 1.1.3 「画面コード親クラス2」に実装できる、3 つの「UOC_ABEND」メソッド
| 項番 | 対応する例外 | メソッド シグネチャ |
|---|---|---|
| 1 | 業務例外 | UOC_ABEND(BusinessApplicationException baEx, RcFxEventArgs rcFxEventArgs) |
| 2 | システム例外 | UOC_ABEND(BusinessSystemException bsEx, RcFxEventArgs rcFxEventArgs) |
| 3 | その他、一般的な例外 | UOC_ABEND(Exception ex, RcFxEventArgs rcFxEventArgs) |
- 業務例外の例外処理:処理後にリスローしない。「メッセージ編集」「共通メッセージの表示」を実装できる。
// <summary>業務例外発生時の処理を実装</summary>
/// <param name="baEx">BusinessApplicationException</param>
/// <param name="rcFxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_ABEND(BusinessApplicationException baEx, RcFxEventArgs rcFxEventArgs)
{
// 業務例外発生時の処理を実装
// TODO:
}図 1.1.3-1 「業務例外の例外処理」の実装例
- システム例外の例外処理:処理後に「システム例外」をリスローする。「エラー ログ出力」を実装できる。
/// <summary>システム例外発生時の処理を実装</summary>
/// <param name="bsEx">BusinessSystemException</param>
/// <param name="rcFxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_ABEND(BusinessSystemException bsEx, RcFxEventArgs rcFxEventArgs)
{
// システム例外発生時の処理を実装
// TODO:
}図 1.1.3-2 「システム例外の例外処理」の実装例
- その他、一般的な例外の例外処理:処理後にリスローする。「エラー ログ出力」を実装できる。
/// <summary>一般的な例外発生時の処理を実装</summary>
/// <param name="ex">例外オブジェクト</param>
/// <param name="rcFxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_ABEND(Exception ex, RcFxEventArgs rcFxEventArgs)
{
// 一般的な例外発生時の処理を実装
// TODO:
}図 1.1.3-3 「その他、一般的な例外の例外処理」の実装例
本フレームワークの P層イベント処理機能は、下記コントロールのイベント (5 つ) に対応しています [1]。
表 1.1.4 P層イベント処理機能に対応するコントロール イベント
| 項番 | コントロール | イベント |
|---|---|---|
| 1 | ボタン (隠しボタン含む) | クリック イベント |
| 2 | ピクチャーボックス | |
| 3 | コンボボックス | セレクト インデックス チェンジ イベント |
| 4 | リストボックス | |
| 5 | ラジオボタン | チェック チェンジ イベント |
イベントを追加するには、業務フレームワーク (Business) 名前空間の「画面コード親クラス2」に P層イベント処理機能の拡張処理を実装します。ただしリッチクライアントはイベント数が多いので、.NET 標準のイベントハンドラから隠しボタン (HiddenButton) の DoClick メソッドで Click イベントを発生させるなどの工夫も必要になります (マルチプル・イベントやマルチキャスト・イベント等に対応する方法としても利用できます)。まず「画面コード親クラス2」の「ページ ロード処理」から「イベント追加処理」の「addControlEvent」メソッドを呼び出します。
図 1.1.4 「イベント追加処理」を「画面コード親クラス2」の「ページ ロード処理」から呼び出す
「addControlEvent」メソッドに実装する処理は、纏め者編 7 章:「P層イベント処理対応コントロール (イベント) の追加」と同様の処理方式です。
Windows Form の「画面コード クラス」をプロジェクトに追加して処理を実装します。
// System~
using System;
~
using ProjectName.Infrastructure.Business.Util;
public partial class Form1 : MyBaseControllerWin
{
}図 1.2 「画面コード クラス」の実装のテンプレート
- ページ ロード処理を実装する:「UOC_FormInit」メソッドを「画面コード クラス」でオーバーライドする。
/// <summary>ページロードのUOCメソッド(個別:初回ロード)</summary>
/// <remarks>実装必須</remarks>
protected override void UOC_FormInit()
{
// フォーム初期化(初回ロード)時に実行する処理を実装する
// TODO:
}図1.2.1 「ページ ロード処理」の実装例
-
「コントロールのイベント処理」を実装する:
- Windows Form 上にコントロール (
[prefix]任意の文字列) を配置する (プレフィックスは ASP.NET 版 P層と同様に app.config に定義)。(図1.2.2-1) - 「画面コード クラス」上に UOC メソッド
UOC_[prefix]任意の文字列_Clickを実装する。イベント ハンドラのシグネチャはprotected string イベント ハンドラ名(RcFxEventArgs rcFxEventArgs)とする。
- Windows Form 上にコントロール (
<!-- コントロールのプレフィックス -->
<add key="FxPrefixOfButton" value="btn"/>
<add key="FxPrefixOfPictureBox" value="pbx"/>
<add key="FxPrefixOfComboBox" value="cbb"/>
<add key="FxPrefixOfListBox" value="lbx"/>
<add key="FxPrefixOfRadioButton" value="rbn"/>図1.2.2‐1 コントロールのプレフィックスの定義例
protected void UOC_btnButton_Click(RcFxEventArgs rcFxEventArgs)
{
// TODO:
}図1.2.2‐2 「画面コード クラス」上のコントロールのイベントの実装例
protected void UOC_testControl_btnButton_Click(RcFxEventArgs rcFxEventArgs)
{
// TODO:
}図1.2.2‐3 「ユーザ コントロール」上のコントロールのイベントの実装例
カスタム コントロール テンプレートを [C#\Frameworks\Infrastructure\CustomControl\RichClient] 以下に用意しているので、これをカスタマイズしてプロジェクト用のカスタム コントロールを作成できます。対象は TextBox と MaskedTextBox の 2 つで、チェック・編集処理のカスタム実装を含みます。使用サンプルは [\C#\Samples\2CS_sample\CustCtrl_sample] です。VS のデザイン タイム プロパティを変更するだけで、チェック・編集処理の動作をカスタマイズできます。
図 1.3-1 各カスタム コントロールのデザイン タイム プロパティ
表 1.3 各カスタム コントロールのデザイン タイム プロパティ
| 項番 | プロパティ | 説明 | 備考 |
|---|---|---|---|
| 1 | CheckRegExp | 正規表現チェック | TextBox/MaskedTextBox 共通 |
| 2 | CheckProhibitedChar | 禁則文字チェック | |
| 3 | CheckType | チェックタイプ (IsIndispensabile 必須/IsHankaku 半角/IsZenkaku 全角/IsNumeric 数値/IsKatakana 片仮名/IsHanKatakana 半角片仮名/IsHiragana 平仮名/IsDate 日付) | |
| 4 | EditPadding | 文字埋め編集 | TextBox のみ |
| 5 | EditDigitsAfterDP | 小数点以下 x 桁編集 | |
| 6 | EditAddFigure | 桁区切り編集 (PadDir パッド方向/PadChar パッド文字) | |
| 7 | Mask_Editing | 編集中に適用されるマスク | MaskedTextBox のみ |
| 8 | Text2 | Mask を適用した値/マスクを除いた値を取得 | TextBox/MaskedTextBox |
| 9 | Text3 | Mask_Editing を適用した値を取得 | MaskedTextBox のみ |
カスタム コントロール テンプレートには、イベント (Enter:編集開始 + 全選択、Validating:単項目チェック、Validated:編集終了) とメソッド (Validate、GetDateTime、GetDecimal、GetDouble、GetFloat、GetInt16/32/64) が埋め込まれています。一括チェック処理は CmnCheckFunction.HasErrors メソッドを使用して容易に実装でき、チェック エラー情報は List<CheckResult> として返却されます。
/// <summary>一括チェックのテスト</summary>
private void button1_Click(object sender, EventArgs e)
{
string ret = "";
List<CheckResult> lcr = new List<CheckResult>();
if (CmnCheckFunction.HasErrors(this, lcr))
{
foreach (CheckResult cr in lcr)
{
ret += cr.CtrlName + "\r\n";
foreach (string checkErrorInfo in cr.CheckErrorInfo)
{
ret += "・" + checkErrorInfo + "\r\n";
}
ret += "\r\n";
}
}
MessageBox.Show(ret);
}図1.3‐2 一括チェック処理の実装方法
非同期呼び出しは Windows Forms・WPF の双方のリッチクライアント アプリケーションから利用できます。
表 2.1 「非同期呼出コード親クラス2」に実装できる共通処理
| 項番 | 処理 | メソッド | 説明項 |
|---|---|---|---|
| 1 | 非同期呼出処理の前後処理:開始処理 | UOC_Pre(処理時間の測定、アクセス ログの出力 ,etc.) | 2.1.1 項 |
| 2 | 終了処理 | UOC_After(処理時間の測定、アクセス ログの出力 ,etc.) | 2.1.1 項 |
| 3 | 例外処理 | UOC_ABEND(アクセス ログ、エラー ログ出力 ,etc.) | 2.1.2 項 |
| 4 | 最終処理 | UOC_Finally(終了処理 ,etc.) | 2.1.2 項 |
サンプルは「MyBaseAsyncFunc」クラスを参考にできます。
#region using
// System~
using System;
~
using Touryo.Infrastructure.Business.Util;
#endregion
namespace Touryo.Infrastructure.Business.RichClient.Asynchronous
{
/// <summary>
/// 非同期コード親クラス2
/// </summary>
public class MyBaseAsyncFunc : BaseAsyncFunc
{
/// <summary>コンストラクタ</summary>
/// <param name="_this">WPFやWinFormの要素</param>
public MyBaseAsyncFunc(object _this) : base(_this) { }
・・・図 2.1 「非同期呼出コード親クラス2」の実装のテンプレート
- 開始・終了を実装する(図2.1.1)
/// <summary>開始処理</summary>
protected override void UOC_Pre()
{
// 開始処理を実装
// TODO:
}
/// <summary>終了処理</summary>
protected override void UOC_After()
{
// 終了処理を実装
// TODO:
}図 2.1.1 「非同期呼出コード親クラス2」の開始・終了処理
- 例外、最終処理を実装する:最終処理 (UOC_Finally メソッド) は、スタート処理 (Start、StartByThreadPool メソッド) と対応させて「スレッド数管理」「画面ロック管理」を行います。スレッド数は app.config に定義します。
/// <summary>例外処理</summary>
protected override void UOC_ABEND(Exception ex)
{
// 例外処理を実装
// TODO:
}
/// <summary>最終処理</summary>
protected override void UOC_Finally()
{
// 終了処理を実装
// TODO:
}図 2.1.2-1 「非同期呼出コード親クラス2」の例外・最終処理
<add key="FxMaxThreadCount" value="3"/>図2.1.2‐2スレッド数の定義例
※ この処理部はクリティカルセクションですが、非同期スレッド側で実行される最終処理 (UOC_Finally) 内のクリティカルセクションでは、Control.Invoke や Dispatcher.Invoke などの主スレッド経由の同期呼び出しを行わないよう注意します (デッドロックを防ぐため)。
非同期呼び出し処理の実装箇所は、Windows Forms の Form や WPF の Window のイベントハンドラ上になります。
/// <summary>非同期実行</summary>
private void UOC_btnASync_Click(RcFxEventArgs rcFxEventArgs)
{
MyBaseAsyncFunc af = new MyBaseAsyncFunc(this);
// 非同期処理本体・無名関数デリゲート
af.AsyncFunc = delegate(object param)
{
・・・時間の掛かる処理(副スレッド で実行される)・・・
// 進捗報告
af.ExecChangeProgress("進捗報告に渡す引数");
・・・時間の掛かる処理(副スレッド で実行される)・・・
return "終わり";
};
// 進捗報告・無名関数デリゲート
af.ChangeProgress = delegate(object param)
{
・・・進捗表示処理(主スレッド で実行される)・・・
};
// 結果設定・無名関数デリゲート
af.SetResult = delegate(object retVal)
{
if (retVal is Exception)
{
// 例外発生時
・・・例外情報表示処理(主スレッド で実行される)・・・
}
else
{
・・・結果表示処理(主スレッド で実行される)・・・
// フォーカス制御をする場合、
this.BeginInvoke(new MethodInvoker(this.SetForcus));
}
};
// 非同期処理を開始させる。
if (af.Start())
{
// 非同期処理がキューイングされた。
// BaseAsyncFunc.ThreadCountでスレッド数を確認できる。
}
else
{
// 非同期スレッドが最大数に達した。
// BaseAsyncFunc.ThreadCountでスレッド数を確認できる。
}
}図 2.2 非同期呼出し処理の実装例
※ C# の匿名関数 (クロージャ) のデリゲートを使用していますが、VB では使用できないので、通常のメソッドを定義して AddressOf 演算子でデリゲートします。VB ではレキシカル スコープでローカル変数を使用できないため、各処理からアクセスする変数はメンバ変数に定義します。
非同期イベントは、Windows Forms・WPF や常駐型アプリケーションで利用できる、名前付きパイプ名を使用したプロセス間通信が可能な非同期のイベント処理を実装するためのフレームワークです (名前付きパイプ名のコネクションは都度接続方式)。
初期化メソッドを呼び出します (第一引数:コチラの名前付きパイプ名、第二引数:接続先の名前付きパイプ名の文字列配列、第三引数:接続待ちの待機時間 (ミリ秒))。終了処理では終了メソッドを呼び出します。
AsyncEventFx.Init("aaaa", new string[] { "bbbb", "cccc", "dddd", "eeee" }, 3000);図3.1‐1 非同期イベントの初期化処理
AsyncEventFx.Final();図3.1‐2 非同期イベントの終了処理
AsyncEventFx.RegisterAsyncEvent メソッドで登録、AsyncEventFx.UnRegisterAsyncEvent メソッドで登録抹消します。エントリ (AsyncEventEntry オブジェクト) には以下を設定します。
-
イベント区分 (
AsyncEventEnum.EventClass):Thread (スレッド関数)、ThreadPool (スレッド プール)、WinForm (Control.BeginInvoke)、WPF (Dispatcher.BeginInvoke) から選択。 - 機能 ID:非同期イベントのイベント名 (0〜36 文字)。
- Control:イベント区分が WinForm、WPF の場合、BeginInvoke に使用するコントロール。
- イベントハンドラ:非同期イベントを受信して処理を遂行するデリゲート。
// 登録エントリ
// スレッド
this.AeeTh = new AsyncEventEntry(
AsyncEventEnum.EventClass.Thread, "Thread", null,
new ParameterizedThreadStart(this.ParameterizedThreadStartDgt));
AsyncEventFx.RegisterAsyncEvent(this.AeeTh);
// ---
// スレッド プール
this.AeePl = new AsyncEventEntry(
AsyncEventEnum.EventClass.ThreadPool, "ThreadPool", null,
new WaitCallback(this.WaitCallbackDgt));
AsyncEventFx.RegisterAsyncEvent(this.AeePl);
// ---
// WinForm
this.AeeWin = new AsyncEventEntry(
AsyncEventEnum.EventClass.WinForm, "WinForm", this,
new AsyncEventFx.SetResultDelegate(this.SetResultDgt));
AsyncEventFx.RegisterAsyncEvent(this.AeeWin);
// ---
// WPF
this.AeeWPF = new AsyncEventEntry(
AsyncEventEnum.EventClass.WPF, "WPF", this,
new AsyncEventFx.SetResultDelegate(this.SetResultDgt));
AsyncEventFx.RegisterAsyncEvent(this.AeeWPF);図3.2‐1 非同期イベントのエントリの登録
/// <summary>デレゲート(スレッド)</summary>
private void ParameterizedThreadStartDgt(object obj) { }
/// <summary>デレゲート(スレッド プール)</summary>
private void WaitCallbackDgt(object state) { }
/// <summary>デレゲート(WinForm、WPF)</summary>
private void SetResultDgt(object result) { }図3.2‐2 非同期イベントのイベント ハンドラのシグネチャ(デリゲート型)
登録した非同期イベントは、呼び出しメソッドで呼び出せます (第一・二引数:送り先のイベント区分+機能 ID、第三・四引数:送り元のイベント区分+機能 ID、第五・六引数:名前付きパイプ名、第七・八引数:送信データのデータ長と送信データ (バイト配列))。
※ 送信データのヘッダーは C 構造体のバイナリ表現であるため、C/C++ とのデータ交換も可能です。
/// <summary>bbbbのThread</summary>
private void button1_Click(object sender, EventArgs e)
{
byte[] bytes = BinarySerialize.ObjectToBytes(this.txtMSG.Text);
AsyncEventFx.SendAsyncEvent(
AsyncEventEnum.EventClass.Thread, "Thread",
AsyncEventEnum.EventClass.Thread, "Thread",
"aaaa", "bbbb", (uint)bytes.Length, bytes);
}
/// <summary>ccccのThreadPool</summary>
private void button2_Click(object sender, EventArgs e)
{
byte[] bytes = BinarySerialize.ObjectToBytes(this.txtMSG.Text);
AsyncEventFx.SendAsyncEvent(
AsyncEventEnum.EventClass.ThreadPool, "ThreadPool",
AsyncEventEnum.EventClass.ThreadPool, "ThreadPool",
"aaaa", "cccc", (uint)bytes.Length, bytes);
}
/// <summary>ddddのControl.BeginInvoke</summary>
private void button3_Click(object sender, EventArgs e)
{
byte[] bytes = BinarySerialize.ObjectToBytes(this.txtMSG.Text);
AsyncEventFx.SendAsyncEvent(
AsyncEventEnum.EventClass.WinForm, "WinForm",
AsyncEventEnum.EventClass.WinForm, "WinForm",
"aaaa", "dddd", (uint)bytes.Length, bytes);
}
/// <summary>eeeeのDispatcher.BeginInvoke</summary>
private void button4_Click(object sender, EventArgs e)
{
byte[] bytes = BinarySerialize.ObjectToBytes(this.txtMSG.Text);
AsyncEventFx.SendAsyncEvent(
AsyncEventEnum.EventClass.WPF, "WPF",
AsyncEventEnum.EventClass.WPF, "WPF",
"aaaa", "eeee", (uint)bytes.Length, bytes);
}図3.3 非同期イベントの呼び出し
C/S 2層アプリケーションのサンプルは ~\root\programs\C#\Samples\2CS_sample にあります。C/S 2層アプリケーション開発では、P層フレームワーク (Windows Forms)、B層フレームワーク (C/S 2層用)、D層フレームワークを使用できます。
- 使用 (継承):「業務コード親クラス1」に C/S 2層用のクラスを使用し、「業務コード親クラス2」がそれを継承、「業務コード クラス」が更にそれを継承する。
namespace Touryo.Infrastructure.Business.Business
{
/// <summary>
/// 業務コード親クラス2
/// </summary>
public abstract class MyFcBaseLogic2CS : BaseLogic2CS
{namespace xxxx
{
/// <summary>
/// LayerB の概要の説明です
/// </summary>
class LayerB : MyFcBaseLogic2CS
{図 4.1-1 C/S 2層用の B層フレームワークを使用(継承)
-
トランザクションの開始:C/S 2層のクライアント側では、サーバ側と異なり、都度コミット・ロールバックせず手動で制御する。B層の呼び出し時に
MyFcBaseLogic2CS.UOC_ConnectionOpenメソッドが呼び出されるので、ここでトランザクションを開始する (既に DB 接続が確立されている場合は呼び出されない)。
// B層を生成
LayerB myBusiness = new LayerB();
// 業務処理を実行
TestReturnValue TestReturnValue =
(TestReturnValue)myBusiness.DoBusinessLogic(
(BaseParameterValue)testParameterValue, DbEnum.IsolationLevelEnum.ReadCommitted);図 4.1-2 B層呼び出し時のトランザクション分離レベルの指定
-
トランザクションの終了:
DbEnum.IsolationLevelEnum.NoTransactionを指定している場合、以降は自動コミット トランザクションとなる (図4.1-3)。それ以外の分離レベルの場合は、コミット・ロールバックを手動で制御する (図4.1-4)。DB 接続・切断オーバーヘッドの軽減にはコネクション プーリング [2] を使用する。
// コネクション クローズ
BaseLogic2CS.ConnectionClose();図4.1‐3 DB接続の切断
// コミット
BaseLogic2CS.CommitAndClose();
// ロールバック
BaseLogic2CS.RollbackAndClose();図4.1‐4 トランザクションの終了 + DB接続の切断
C/S 2層用の B層・D層フレームワークを利用するのに必要な app.config のパラメタがあります (ASP.NET Web 開発と比較して使用できない機能があるため、不要なパラメタがいくつかあります)。各パラメタの説明は「纏め者編」1.2 節を参照してください。
<configuration>
<appSettings>
<!-- 共通部品の使用するパラメータ - start -->
<!-- Log4Netのコンフィグファイルへのパス -->
<add key="FxLog4NetConfFile" value=".\Log\SampleLogConf.xml" />
<!-- D層のパフォーマンスログ出力機能のon・off -->
<add key="FxSqlTraceLog" value="on" />
<!-- D層のSQL文キャッシュ機能のon・off -->
<!-- 開発フェーズのことを考慮して、デフォルトoffに設定 -->
<add key="FxSqlCacheSwitch" value="off" />
<!-- D層のSQLロード時のエンコーディングを指定(shift_jis、utf-8.etc) -->
<add key="FxSqlEncoding" value="shift_jis" />
<!-- D層のSQLのCommandTimeout値を指定 -->
<add key="FxSqlCommandTimeout" value="30"/>
<!-- 共通部品の使用するパラメータ - end -->
<!-- アプリケーションの使用するパラメータ - start -->
<!-- SQLファイルへのパス -->
<add key="SqlTextFilePath" value=".\Dao" />
<!-- アプリケーションの使用するパラメータ - end -->
</appSettings>
<connectionStrings>
<!-- 接続文字列 -->
<add name="~" connectionString="~" />
</connectionStrings>
<system.web>
~
</system.web>
</configuration>図4.2‐1 必要なコンフィグレーション
※ この部品は ZIPライブラリのサポート切れで discon(ソースは残っているので必要なら修正して復活させることは出来る)
Web デプロイ部品は、実行モジュールをクライアント端末にデプロイするツールです。実行モジュールを複数の [ZIP ファイル] にアーカイブし、ダウンロード一式の情報を [配置マニュフェスト ファイル] に纏めることができます。クライアントから [配置マニュフェスト ファイル] への URL を指定するだけで、実行モジュール一式をデプロイできます (差分の ZIP ファイルのみのダウンロードにも対応)。
[Zip パッケージを作成] タブで、[フォルダ] (圧縮対象)、[ファイル名] (圧縮ファイル名) を入力し [圧縮] ボタンを押下します。
図 5.1 ZIP パッケージの作成
ポイントはチェック ボックスの状態です。オフ (デフォルト) の場合はインストール ディレクトリ直下に ZIP ファイル名と同じ名前のフォルダを作成し復元します (フォルダ毎に圧縮する場合に適する)。オンの場合はインストール ディレクトリ以下に構成をそのまま復元します (一度に複数のファイルやフォルダを配置する場合に適する)。
[配置マニュフェスト] タブで、ZIP ファイル、[インストール ディレクトリ] (環境変数使用可能)、[EXE 名 (パス)] (カンマ区切りで起動チェック EXE、起動 EXE [3]) を指定し、[マニュフェストファイルを作成する] ボタンを押下します。
図 5.2 配置マニュフェストの作成
作成後は、[配置マニュフェスト ファイル] と全ての ZIP ファイルを WWW サーバ上の同じディレクトリに配置します。
[HTTP でデプロイ] タブが、実行モジュールをクライアント端末にデプロイするタブです。
図 5.3-1 Web デプロイ(GUI で実行)
このツールは CUI としても実行でき、/HELP オプションでヘルプを確認できます。
図 5.3-2 Web デプロイ(CUI の /HELP コマンドを実行)
WWW サーバの URL には [配置マニュフェスト ファイル] への URL を指定し、Credential (認証や資格) 情報 (ユーザ ID、パスワード、ドメイン名) を入力します。プロキシ サーバを経由する場合は、プロキシ サーバの URL と Credential 情報を入力します (URL 指定が無い場合は IE 設定を適用、none 指定でプロキシ未使用)。以下の config 値も調整可能です。
<!-- app.config -->
<!--非同期呼び出し処理の多重度(2以上の設定が必須)-->
<add key="FxMaxThreadCount" value="3"/>
<!--プログレスダイアログが閉じるまでの待機設定(秒)-->
<add key="PDWSleepSec" value="3"/>-
MSGDefinition.xml:各種表示メッセージの調整 -
Log4DeployZipPackWithHTTP.xml:ログ出力設定の調整 (log4net)
図 5.3-4 フローチャート:ツール起動までの流れ
図 5.3-5 フローチャート:アプリの更新&起動までの流れ
discon JavaScript版は作るかも?
- リッチクライアントの P層イベント処理機能が対応するコントロール イベント (5 つ)。
- データ プロバイダのコネクション プーリング機能。
- カンマ区切りで起動チェック EXE、起動 EXE を指定する。
- .NET でデータ移送処理の実装で慣例的に利用される。
- 行の変更ステータス (DataRowState)。
-以上-