UserGuide_Leaders.ja - OpenTouryoProject/OpenTouryo GitHub Wiki

Open 棟梁 利用ガイド (纏め者編)

2026年7月更新版

はじめに

本ドキュメントの対象

  • Open 棟梁を用いたアプリケーション開発を行う、SE・開発者

本ドキュメントの概要

本ドキュメントは、「開発の纏め者」が把握しておくべき点について纏めています。「開発の纏め者」とは、適用プロジェクトの処理方式を理解した上で、開発基盤 (ベースクラス2) に共通処理を実装するタスクを担う者を指します。

他社所有名称に対する表示

本ドキュメントに記載の会社名・商品名は、各社の商標または登録商標です。

図中の凡例:

  • 赤枠:実装必須のコードブロック
  • 赤枠 (破線):実装に注意が必要なコードブロック
  • 青文字:任意の実装が可能なコードブロック

目次

1. コンフィギュレーション ファイル、外部ファイル

2. 共通持ち回り情報の持ち回り処理

3. B層フレームワーク

4. D層フレームワーク

5. P層フレームワーク

6. その他

7. P層イベント処理対応コントロール (イベント) の追加

1. コンフィギュレーション ファイル、外部ファイル

本章では、各種コンフィギュレーション ファイル、外部ファイルの設定について説明します。

各種コンフィギュレーション ファイル、外部ファイルの一覧については、「共通編」の 3.2 章:「外部ファイルの確認」を参照してください。また、フレームワークで使用するコンフィグ パラメタの一覧、デフォルト値、必須・任意、範囲などの情報については、「1b_config_parameter_list.xls」を参照してください。

1.1 web.Config ファイル

本節では、web.config の設定について説明します。web.config ファイルは ASP.NET の動作設定を定義するファイルです。以下に、web.config ファイルの設定例を示します。

<?xml version="1.0" encoding="utf-8"?>
<!--
    ASP.NET アプリケーションの構成方法の詳細については、
    https://go.microsoft.com/fwlink/?LinkId=169433 を参照してください
-->
<configuration>
  <!-- ajaxの設定(バージョンなどに注意する。) -->
  <!-- appSettingsの設定 -->
  <appSettings file="app.config" />
  <!-- connectionStringsの設定 -->
  <connectionStrings>
    <!-- SQL Server / SQL Client用 -->
    <add name="ConnectionString_SQL" connectionString="Data Source=localhost;Initial Catalog=Northwind;User ID=sa;Password=seigi@123;Encrypt=false;" />
    <!-- Multi-DB / OLEDB.NET用 -->
    <add name="ConnectionString_OLE" connectionString="Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
    <!-- Multi-DB / ODCB.NET用 -->
    <add name="ConnectionString_ODBC" connectionString="Dsn=odbc_test1" />
    <!-- Oracle / ODP.NET用 -->
    <add name="ConnectionString_ODP" connectionString="User Id=SCOTT;Password=tiger;Data Source=localhost/XE;" />
    <!-- MySQL / MySQL Connector/NET用 -->
    <add name="ConnectionString_MCN" connectionString="Server=localhost;Database=test;User Id=root;Password=seigi@123;" />
  </connectionStrings>
  <!-- ASP.NETのパラメータ -->
  <!--
    web.config の変更点の説明については、http://go.microsoft.com/fwlink/?LinkId=235367 を参照してください。

    次の属性を <httpRuntime> タグに設定できます。
      <system.Web>
        <httpRuntime targetFramework="4.8" />
      </system.Web>
  -->
  <system.web>
    <!-- リリース時は、debug="false"に変更してください。 -->
    <compilation debug="true" targetFramework="4.8" />
    <!--
            グローバリゼーション
            globalization 要素
            http://msdn2.microsoft.com/ja-jp/library/hy4kkhe0.aspx
            http://msdn2.microsoft.com/ja-jp/library/hy4kkhe0(VS.80).aspx
            CultureInfo クラス
            http://msdn2.microsoft.com/ja-jp/library/system.globalization.cultureinfo.aspx
            http://msdn2.microsoft.com/ja-jp/library/system.globalization.cultureinfo(VS.80).aspx
            CultureInfo("ja") と CultureInfo("ja-JP") の違い
            http://blogs.wankuma.com/ogiogi/archive/2007/12/10/112403.aspx
        -->
    <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" responseHeaderEncoding="utf-8" culture="ja-JP" uiCulture="ja-JP" />
    <!--
            セッションの設定
            本設定のパラメタは、別途検討すること。
            属性         : 目的
            timeout      : セッション状態プロバイダがセッションを終了するまでに、要求間で許容される時間 (分単位) を設定する。
            cookieless   : セッションIDをURLに埋め込む(true)か、cookie に格納する(false)かを設定する。
            mode         : 現在のセッション状態モードを設定する。
      
            詳細は、下記URLを参照のこと。
            http://msdn2.microsoft.com/ja-jp/library/h6bb9cz9.aspx
            http://msdn2.microsoft.com/ja-jp/library/h6bb9cz9(VS.80).aspx
        -->
    <!-- インプロセス -->
    <!--sessionState timeout="20" cookieless="false" mode="InProc"></sessionState-->
    <!--
            ステートサーバ(利用の際は、管理ツール「サービス」から、ASP.NET 状態サービスを開始しておくこと。)
            開発フェーズでステートサーバを選択しておけば、本番環境は、どのモードにも対応できる。
        -->
    <sessionState timeout="20" cookieless="false" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" />
    <!--
            SQLサーバ(利用の際は、以下のスクリプトを実行する)
            C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
            ・InstallSqlState.sql(UninstallSqlState.sql)
            ・InstallPersistSqlState.sql(UninstallPersistSqlState.sql)
            
            [HOWTO]:ASP.NETで永続的なSQLServerセッション状態管理を構成する方法 
            http://support.microsoft.com/default.aspx?kbid=311209
            [HOWTO]:SQL ServerでASP.NETセッション状態管理を構成する方法 
            http://support.microsoft.com/kb/317604/ja
            
            ↓環境構築には以下のツールを使用する。
            
            ASP.NET SQL Server 登録ツール (Aspnet_regsql.exe)
            http://msdn.microsoft.com/ja-jp/library/ms229862%28VS.80%29.aspx
            
            ※ Express Editionは、SQL Server 2005以降、SQL Serverエージェントを搭載しないので利用できない。
        -->
    <!--sessionState timeout="20" cookieless="false" mode="SQLServer" 
            sqlConnectionString="Data Source=seigi-cmn-pc4;User ID=sa;Password=sa;"/-->
    <!--
            Oracleサーバ(利用の際は、以下のスクリプトを実行する)           
            C:\app\Administrator\product\11.1.0\client_1\ASP.NET\SQL
            ・InstallOracleSessionState.sql(UninstallOracleSessionState.sql)
            ・InstallOracleSessionState92.sql(UninstallOracleSessionState92.sql)
            
            Oracle Providers for ASP.NET開発者ガイド > Oracle Providers for ASP.NETのインストール
            http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E06106-01/IntroInstallation.htm
            Oracle Providers for ASP.NET開発者ガイド > OracleSessionStateStoreクラス
            http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E06106-01/OracleSessionStateStoreClass.htm
        -->
    <!--sessionState timeout="20" cookieless="false" mode="Custom" customProvider="MyOracleSessionStateStore">
            <providers>
                <add name="MyOracleSessionStateStore"
                     type="Oracle.Web.SessionState.OracleSessionStateStore, 
                           Oracle.Web, Version=2.111.6.20, Culture=neutral, 
                     PublicKeyToken=89b483f429c47342"
                     connectionStringName="ConnectionString_ODP"/>
            </providers>
        </sessionState-->
    <!--
            認証の設定 
            
            このセクションは、アプリケーションの認証ポリシーを設定します。
            使用できるモードは、"Windows"、"Forms"、"Passport" および "None" です。
            
            詳細は、下記URLを参照のこと。
            http://msdn2.microsoft.com/ja-jp/library/532aee0e.aspx
            http://msdn2.microsoft.com/ja-jp/library/532aee0e(VS.80).aspx
        -->
    <!-- Windows認証 -->
    <!--authentication mode="Windows"/-->
    <!-- Forms認証 -->
    <authentication mode="Forms">
      <!--
                本設定のパラメタは、別途検討すること。
                属性                      : 目的
                name                      : 認証チケットを保存するクッキーの名前に使われる。
                loginUrl                  : ログイン・フォームのURL
                defaultUrl                : 認証後のリダイレクトに使用する既定の URL を定義する。
                timeout                   : チケットの有効期間(単位:分)。
                protection                : クッキーの暗号化と検証の有無を指定(推奨値は、「All」)
                path                      : クッキーのパス(既定値は、「/」)。
                domain                    : フォーム認証 Cookie に設定するオプションのドメインを指定する。
                requireSSL                : 認証 Cookie を送信するために SSL 接続が必要かどうかを指定する(既定値は、「false」)。
                slidingExpiration         : スライド式有効期限が有効かどうかを指定する(既定値、推奨値は、「true」)。
                enableCrossAppRedirects   : アプリケーション間のフォーム認証を可能にする。
                cookieless                : Cookie を使用するかどうか、および Cookie の動作を定義する。 
                
                詳細は、下記URLを参照のこと。
                http://msdn2.microsoft.com/ja-jp/library/1d3t3c61.aspx
                http://msdn2.microsoft.com/ja-jp/library/1d3t3c61(VS.80).aspx
            -->
      <forms name="formauth" loginUrl="Aspx/Start/login.aspx" defaultUrl="Aspx/Start/menu.aspx" timeout="10" protection="All" path="/" domain="" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" />
    </authentication>
    <!--
            権限の設定
            このセクションは、アプリケーションの権限のポリシーを設定します。
            この設定により、ユーザーまたはロールによるアプリケーション
            リソースへのアクセスを許可したり、拒否したりできます。
            ワイルドカード : "*" は全員を、"?" は匿名 (未認証) ユーザーを表します。
            
            詳細は、下記URLを参照のこと。
            http://msdn2.microsoft.com/ja-jp/library/8d82143t.aspx
            http://msdn2.microsoft.com/ja-jp/library/8d82143t(VS.80).aspx
        -->
    <authorization>
      <!-- 全ユーザーへの許可 -->
      <!--<allow users="*"/>-->
      <!-- 匿名ユーザーの禁止 -->
      <deny users="?" />
      <!--
            <allow  users="[ユーザーのコンマ区切り一覧]"
                roles="[ロールのコンマ区切り一覧]"/>
            <deny  users="[ユーザーのコンマ区切り一覧]"
                roles="[ロールのコンマ区切り一覧]"/>-->
    </authorization>
    <!-- 偽装する場合は以下を有効にする -->
    <!-- identity impersonate="true" userName="xxxx" password="xxxx" / -->
    <!--
            <customErrors> セクションは、要求の実行中にハンドルされていないエラーが発生した場合の処理方法の構成を有効にします。
            具体的には、開発者が HTML エラーページをスタック トレースのエラーの代わりに表示するように構成することを可能にします。
            ※ アプリケーションで発生した例外は、Application_Errorで全てのエラーを処理する。
            ※ HTTP状態コードに対応するHTMLを設定する場合は、ここを設定する。
            
            <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
                <error statusCode="403" redirect="NoAccess.htm" />
                <error statusCode="404" redirect="FileNotFound.htm" />
            </customErrors>
            
            詳細は、下記URLを参照のこと。
            customErrorsタグ
            http://msdn2.microsoft.com/ja-jp/library/h0hfz6fc.aspx
            http://msdn2.microsoft.com/ja-jp/library/h0hfz6fc(VS.80).aspx
            errorタグ
            http://msdn2.microsoft.com/ja-jp/library/s2f4e3e7.aspx
            http://msdn2.microsoft.com/ja-jp/library/s2f4e3e7(VS.80).aspx
        -->
    <!-- 
            ASP.NETの処理方法、実行時設定をする。
            ・maxRequestLength:POSTデータの最大値(既定値は 4,096 KB (4 MB))
            ・executionTimeout:POST処理の実行タイムアウトを設定(既定値は 90 秒)
            詳細は、下記URLを参照のこと。
            http://msdn2.microsoft.com/ja-jp/library/e1f13641.aspx
            http://msdn2.microsoft.com/ja-jp/library/e1f13641(VS.80).aspx
        -->
    <httpRuntime targetFramework="4.8" maxRequestLength="4096" executionTimeout="90" />
    <pages>
      <namespaces>
        <add namespace="System.Web.Optimization" />
      </namespaces>
      <controls>
        <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" />
      </controls>
    </pages>
  </system.web>
  <!-- ファイルをForms認証対象外にする -->
  <!--JS/CSSをバンドルしたフォルダ-->
  <location path="bundles">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <!--外部ログイン・コールバック-->
  <location path="Aspx/OAuth2">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <system.serviceModel>
    <services>
      <service name="WebForms_Sample.JSONService">
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="MyBehavior" contract="WebForms_Sample.IJSONService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="MyBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
      <wsHttpBinding>
        <binding name="WSHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <!--addressは通信制御部品の設定ファイルに定義する。-->
      <!--basicHttpBinding-->
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="Transmission.IWCFHTTPSvcForFx" name="Transmission.WCFHTTPSvcForFx" />
      <!--wsHttpBinding-->
      <!--endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding" contract="Transmission.IWCFHTTPSvcForFx" name="Transmission.WCFHTTPSvcForFx" /-->
      <!--netTcpBinding-->
      <endpoint address="" binding="netTcpBinding" bindingConfiguration="" contract="Touryo.Infrastructure.Framework.Transmission.IWCFTCPSvcForFx" name="Touryo.Infrastructure.Business.Transmission.WCFTCPSvcForFx" />
    </client>
  </system.serviceModel>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>...</dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

図 1.1-1~5 web.config

1.1.1 appSettings セクション

web.config の appSettings セクションには、app.config ファイルへのリンクを記述します [1]。app.config ファイルへの設定の詳細は、次節で説明します。

  <!-- appSettingsの設定 -->
  <appSettings file="app.config" />

図 1.1.1 appSettings セクション

1.1.2 connectionStrings セクション

web.config の connectionStrings セクションには、DB への接続文字列を設定できます。

  <!-- connectionStringsの設定 -->
  <connectionStrings>
    <!-- SQL Server / SQL Client用 -->
    <add name="ConnectionString_SQL" connectionString="Data Source=localhost;Initial Catalog=Northwind;User ID=sa;Password=seigi@123;Encrypt=false;" />
    <!-- Multi-DB / OLEDB.NET用 -->
    <add name="ConnectionString_OLE" connectionString="Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
    <!-- Multi-DB / ODCB.NET用 -->
    <add name="ConnectionString_ODBC" connectionString="Dsn=odbc_test1" />
    <!-- Oracle / ODP.NET用 -->
    <add name="ConnectionString_ODP" connectionString="User Id=SCOTT;Password=tiger;Data Source=localhost/XE;" />
    <!-- MySQL / MySQL Connector/NET用 -->
    <add name="ConnectionString_MCN" connectionString="Server=localhost;Database=test;User Id=root;Password=seigi@123;" />
  </connectionStrings>SampleLogConfMobile

図 1.1.2-1 connectionStrings セクションの実装例

connectionStrings セクションに設定した接続文字列は、GetConfigParameter.GetConnectionString("(キー)") メソッドを使用して、アプリケーションから取得できます。DBMS との接続確立のロジックは「業務コード親クラス2」の「データアクセス制御クラスの生成処理の UOC メソッド」に実装します(本ドキュメント 3.2 項:「DB 初期化処理を実装する」を参照)。

また、次のコマンドで connectionStrings セクションを暗号化できます。

  1. カスタム RSA キーコンテナの名前を指定して、キーペアを作成する。
    > aspnet_regiis -pc "MyKeys" -exp
  2. ASP.NET の実行アカウントに、カスタム RSA キーコンテナへのアクセス許可を追加する。
    > aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"
    ※ "NT AUTHORITY\NETWORK SERVICE" は、IIS6.0 での既定の ASP.NET の実行アカウント。
  3. web.config ファイルに、作成した「MyKeys」カスタム RSA キーコンテナを使用して暗号化・復号化する「RsaProtectedConfigurationProvider」クラスの「MyProvider」インスタンスを追加する。
<configProtectedData>
 <providers>
 <add name="MyProvider"
 type="System.Configuration.RsaProtectedConfigurationProvider,
 System.Configuration, Version=2.0.0.0, Culture=neutral,
 PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
 keyContainerName="MyKeys" useMachineContainer="true" />
 </providers>
</configProtectedData>

図 1.1.2-2 configProtectedData セクションを追加

  1. 次のコマンドを実行して、web.config ファイルの connectionStrings セクションを暗号化する。
    > aspnet_regiis -pe "connectionStrings" -app "/(Webサイト名)" -prov "MyProvider"
<connectionStrings configProtectionProvider="MyProvider">
 <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#">
 <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
 <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
 <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
 <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
 <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
 <KeyName>Rsa Key</KeyName>
 </KeyInfo>
 <CipherData>
 <CipherValue>X+eV/t4UbqQIU/L1a8pS5vl0DTTVC(略)q2se9sY8tuAtfzUv6gOiDE8NfV3D4=</CipherValue>
 </CipherData>
 </EncryptedKey>
 </KeyInfo>
 <CipherData>
 <CipherValue>mGDl6aJliUXkfRFM4TFHm61Gvy6q(略)5cJ0IztRp84cT4QyunGWT13lDhKntdI8MJ98=</CipherValue>
 </CipherData>
 </EncryptedData>
</connectionStrings>

図 1.1.2-3 暗号化された connectionStrings セクション

複合化する場合は、> aspnet_regiis -pd "connectionStrings" -app "/(Webサイト名)" を実行します。その他、カスタム RSA キーコンテナのインポート・エクスポートなどの詳細は、チュートリアル: RSA キー コンテナの作成とエクスポート を参照してください。

1.1.3 sessionState セクション

本項では、web.config の sessionState セクションの設定について説明します。sessionState セクションには、セッションに関する設定ができます。

<sessionState timeout="20" cookieless="false" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" />

図 1.1.3 sessionState セクションの実装例

sessionState セクションの基本的な属性は、以下の 3 属性です。

表 1.1.3 sessionState セクション

項番 属性 目的
1 timeout セッション状態プロバイダがセッションを終了するまでに、要求間で許容される時間 (分単位) を設定する。
2 cookieless セッション ID を URL に埋め込む (true) か、cookie に格納する (false) か、を設定する。
3 mode 現在のセッション状態モードを設定する。

セッション状態モードによっては、他のパラメタの設定も必要になるので注意します。開発時は、mode="StateServer" としておくと良いでしょう (稼動後に、色々なモードに変更できるため)。この場合、stateConnectionString 属性に、ステートサーバへの URL を設定する必要があります。参考:セッション状態モード、sessionState 要素。

1.1.4 authentication、authorization セクション

本項では、web.config の authentication セクションの設定について説明します。authentication セクションには、認証に関する設定ができます。また、このセクションを設定した後、認証済みのユーザにのみアクセスを許可するため、匿名ユーザのアクセスを拒否する authorization セクションの設定も必要になります。以下は Form 認証を使用した場合の authentication、authorization セクションの実装例です。

<!-- Forms 認証 -->
<authentication mode="Forms">
 <forms name="formauth" loginUrl="(ログイン ページ)" defaultUrl="(トップ ページ)" timeout="10"
 protection="All" path="/" domain="" requireSSL="false"
 slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile"/>
</authentication>
<authorization>
 <deny users="?"/><!-- 匿名ユーザの禁止 -->
</authorization>

図 1.1.4 authentication、authorization セクションの実装例

また、Form セクションの属性の説明を以下の表 1.1.4 に示します。

表 1.1.4 Form セクション(Form 認証)

項番 属性 目的
1 name 認証チケットを保存するクッキーの名前に使われる。
2 loginUrl ログイン フォームの URL。
3 defaultUrl 認証後のリダイレクトに使用する既定の URL を定義する。
4 timeout チケットの有効期間 (単位:分)。
5 protection クッキーの暗号化と検証の有無を指定 (推奨値は「All」)。
6 path クッキーのパス (既定値は「/」)。
7 requireSSL 認証 Cookie を送信するために SSL 接続が必要かどうかを指定する (既定値は「false」)。
8 slidingExpiration スライド式有効期限が有効かどうかを指定する (既定値・推奨値は「true」)。
9 enableCrossAppRedirects アプリケーション間のフォーム認証を可能にする。
10 cookieless Cookie を使用するかどうか、および Cookie の動作を定義する。
11 domain フォーム認証 Cookie に設定するオプションのドメインを指定する。

参考:authorization 要素、authentication の forms 要素。

1.2 app.Config ファイル

本節では、app.config の設定について説明します。app.config の appSettings セクションには、フレームワークや共通部品の使用するパラメタを定義します。

1.2.1 フレームワークで使用するパラメタ

フレームワークで使用するパラメタを以下に示します。

<?xml version="1.0" encoding="utf-8"?>
<appSettings>
 <!-- パラメータ変更後は、iisresetコマンドを実行してください。 -->
 <!-- フレームワークの使用するパラメータ - start -->
 <!-- コントロールのプレフィックス -->
 <add key="FxPrefixOfButton" value="btn"/>
 <add key="FxPrefixOfLinkButton" value="lbn"/>
 <add key="FxPrefixOfImageButton" value="ibn"/>
 <add key="FxPrefixOfImageMap" value="imp"/>
 <add key="FxPrefixOfTextBox" value="txt"/>
 <add key="FxPrefixOfDropDownList" value="ddl"/>
 <add key="FxPrefixOfListBox" value="lbx"/>
 <add key="FxPrefixOfRadioButton" value="rbn"/>
 <add key="FxPrefixOfRadioButtonList" value="rbl"/>
 <add key="FxPrefixOfCheckBoxList" value="cbl"/>
 <add key="FxPrefixOfRepeater" value="rpt"/>
 <add key="FxPrefixOfGridView" value="gvw"/>
 <add key="FxPreficOfListView" value="lvw"/>
 <!-- 基盤画面パス -->
 <add key="FxErrorScreenPath" value="/(サイト名)/Aspx/Common/ErrorScreen.aspx"/>
 <add key="FxOKMessageDialogPath" value="/(サイト名)/Aspx/FrameWork/myOKMessageDialog.aspx"/>
 <add key="FxYesNoMessageDialogPath" value="/(サイト名)/Aspx/FrameWork/myYesNoMessageDialog.aspx"/>
 <add key="FxDialogFramePath" value="/(サイト名)/Aspx/Framework/DialogFrame.htm"/>
 <!-- アイコンパス -->
 <add key="FxInformationIconPath" value="/(サイト名)/Framework/img/information.ico"/>
 <add key="FxWarningIconPath" value="/(サイト名)/Framework/img/warning.ico"/>
 <add key="FxErrorIconPath" value="/(サイト名)/Framework/img/error.ico"/>
 <add key="FxQuestionIconPath" value="/(サイト名)/Framework/img/question.ico"/>
 <!-- デフォルトの画面スタイル -->
 <add key="FxDefaultFxDialogStyle" value="dialogWidth:450px;dialogHeight:250px;status:no;" />
 <add key="FxDefaultBusinessDialogStyle" value="dialogWidth:640px;dialogHeight:480px;status:no;" />
 <add key="FxDefaultNormalScreenStyle" value="width=960,height=700,scrollbars=yes" />
 <!-- セッションタイムアウト検出機能のon・off -->
 <add key="FxSessionTimeOutCheck" value="on"/>
 <!-- 二重送信防止機能のon・off -->
 <add key="FxDoubleTransmissionCheck" value="on"/>
 <!-- 不正操作防止機能のon・off(操作履歴の最大数) -->
 <add key="FxRequestTicketGuidMaxQueueLength" value="100"/>
 <!-- ボタン履歴を保持するキューの最大長 -->
 <add key="FxButtonhistoryMaxQueueLength" value="20"/>
 <!-- 親画面別セッション領域の自動削除機能のon・off(スコープの最大数) -->
 <add key="FxScreeenGuidMaxQueueLength" value="30"/>
 <!--ウィンドウ画面別セッション領域の自動削除機能のon・off(スコープの最大数) -->
 <add key="FxWindowGuidMaxQueueLength" value="10"/>

 <!-- 画面遷移方法を指定(T:Transfer、R:Redirect、off) -->
 <add key="FxScreenTransitionMode" value="off"/>
 <!-- 画面遷移チェック機能のon・off -->
 <add key="FxScreenTransitionCheck" value="off"/>
 <!-- メッセージ定義へのパス -->
 <add key="FxXMLMSGDefinition" value="C:\root\files\resource\Xml\MSGDefinition.xml"/>
 <!-- 画面遷移定義へのパス -->
 <add key="FxXMLSCDefinition" value="C:\root\files\resource\Xml\SCDefinition.xml"/>
 <!-- トランザクション制御定義へのパス -->
 <add key="FxXMLTCDefinition" value="C:\root\files\resource\Xml\TCDefinition.xml"/>
 <!-- 名前解決定義へのパス -->
 <add key="FxXMLTMProtocolDefinition" value="C:\root\files\resource\Xml\TMProtocolDefinition.xml"/>
 <add key="FxXMLTMInProcessDefinition" value="C:\root\files\resource\Xml\TMInProcessDefinition.xml"/>
 <!-- フレームワークの使用するパラメータ - end -->

図 1.2.1 appSettings セクションの実装例(フレームワークで使用するパラメタ)

表 1.2.1 appSettings セクション(フレームワークで使用するパラメタ)

項番 区分 属性 目的
1 コントロールのプレフィックス FxPrefixOfButton ボタン コントロール
1-2 FxPrefixOfLinkButton リンクボタン コントロール
1-3 FxPrefixOfImageButton イメージボタン コントロール
1‐4 FxPrefixOfImageMap イメージマップ コントロール
1‐5 FxPrefixOfTextBox テキストボックス コントロール
1-6 FxPrefixOfDropDownList ドロップ ダウン リスト コントロール
1-7 FxPrefixOfListBox リスト ボックス コントロール
1-8 FxPrefixOfRadioButton ラジオ ボタン コントロール
1-9 FxPrefixOfRadioButtonList ラジオ ボタン リスト コントロール
1-10 FxPrefixOfCheckBoxList チェック ボックス リスト コントロール
1-11 FxPrefixOfRepeater リピータ コントロール
1-12 FxPrefixOfGridView グリッドビュー コントロール
1-13 FxPrefixOfListView リストビュー コントロール
2 基盤画面へのパス (仮想パス) FxErrorScreenPath エラー画面へのパスを指定する。
2-2 FxYesNoMessageDialogPath [Yes]・[No] メッセージ ダイアログへのパス。
2-3 FxOKMessageDialogPath [OK] メッセージ ダイアログへのパス。
2-4 FxDialogFramePath ダイアログ フレームへのパス。
3 アイコンへのパス (仮想パス) FxInformationIconPath [OK] メッセージ ダイアログの [情報] アイコン。
3-2 FxWarningIconPath [OK] メッセージ ダイアログの [警告] アイコン。
3-3 FxErrorIconPath [OK] メッセージ ダイアログの [エラー] アイコン。
3-4 FxQuestionIconPath [Yes]・[No] メッセージ ダイアログの [?] アイコン。
4 デフォルトのスタイル FxDefaultFxDialogStyle [OK]/[Yes]・[No] メッセージ ダイアログのスタイル。
4-2 FxDefaultBusinessDialogStyle 業務モーダル画面のスタイル。
4-3 FxDefaultNormalScreenStyle 業務モードレス画面のスタイル。
5 機能の ON・OFF スイッチ FxSessionTimeOutCheck セッションタイムアウトの検出機能の有効・無効を [on]・[off] で指定する。
5-2 FxDoubleTransmissionCheck 二重送信の防止機能の有効・無効を [on]・[off] で指定する [2]。
5-3 FxRequestTicketGuidMaxQueueLength 不正操作防止機能の画面単位の操作履歴の最大数を指定する [3]。0 以下:OFF、0 より大:ON。
5-4 FxButtonhistoryMaxQueueLength ボタン履歴情報を保持するキューの最大長を設定する。0 以下:OFF、0 より大:ON。
5-5 FxScreeenGuidMaxQueueLength 親画面別セッション領域の自動削除機能の on・off (スコープの最大数)。
5-6 FxWindowGuidMaxQueueLength ウィンドウ別セッション領域の自動削除機能の on・off (スコープの最大数)。
6 画面遷移機能 FxScreenTransitionMode 画面遷移モードを [Transfer]、[Redirect]、[off] で設定する。
6-2 FxScreenTransitionCheck 画面遷移チェック機能の有効・無効を [on]・[off] で指定する。
7 その他の定義ファイル FxXMLMSGDefinition メッセージ取得機能の定義ファイル。
7-2 FxXMLSCDefinition 画面遷移制御機能の定義ファイル。
7-3 FxXMLTCDefinition トランザクション制御機能の定義ファイル。
7-4 FxXMLTMProtocolDefinition 通信制御部品 (呼出プロトコル選択) の定義ファイル。
7-5 FxXMLTMInProcessDefinition 通信制御部品 (インプロセス呼出) の定義ファイル。

※ デフォルト値、設定エラーとなるケースなどの詳細については、付属の「1b_config_parameter_list.xls」を参照してください。

1.2.2 共通部品で使用するパラメタ

共通部品で使用するパラメタを以下に示します。

<!-- 共通部品の使用するパラメータ - start -->

 <!-- Log4Netのコンフィグファイルへのパス -->
 <add key="FxLog4NetConfFile" value="C:\root\files\resource\Log\SampleLogConf.xml"/>

 <!-- D層のSQLトレースログ出力機能の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層のコマンド タイムアウト値を指定(秒) -->
 <add key="FxSqlCommandTimeout" value="30"/>
 <!-- 共通部品の使用するパラメータ - end -->

図 1.2.2 appSettings セクションの実装例(共通部品で使用するパラメタ)

表 1.2.2 appSettings セクション(共通部品で使用するパラメタ)

項番 属性 目的
1 FxLog4NetConfFile log4net のコンフィグファイルへのパスを指定する。
3 FxSqlTraceLog SQL トレースログの出力機能を [on]・[off] で指定する。
4 FxSqlCacheSwitch 読み込んだ SQL をキャッシュするかどうかを [on]・[off] で指定する。
5 FxSqlEncoding SQL ロード時のエンコーディングを指定する。
6 FxSqlCommandTimeout コマンド タイムアウト値を指定する (秒)。

1.2.3 アプリケーション(サンプル)で使用するパラメタ

アプリケーション (サンプル) で使用するパラメタを以下に示します。

 <!-- 共通部品の使用するパラメータ - start -->

 <!-- Log4Netのコンフィグファイルへのパス -->
 <add key="FxLog4NetConfFile" value="C:\root\files\resource\Log\SampleLogConf.xml"/>

 <!-- D層のSQLトレースログ出力機能の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層のコマンド タイムアウト値を指定(秒) -->
 <add key="FxSqlCommandTimeout" value="30"/>
 <!-- 共通部品の使用するパラメータ - end -->

図 1.2-2 appSettings セクションの実装例(共通部品で使用するパラメタ)

※ 網掛けは、テストプログラムに特化したものなので、利用しません。

<!-- アプリケーションの使用するパラメータ - start -->

 <!-- SQLファイルファイル(フォルダ)へのパス -->
 <add key="SqlTextFilePath" value="C:\ files\resource\Sql"/>

 <!-- テスト プログラムの使用するパラメータ - start -->

 <!-- ブラウザのタイトル -->
 <add key="BrowserTitle" value="フレームワーク テスト画面"/>

 <!-- 画面遷移方法(1がTransfer、2がRedirect) -->
 <add key="ScreenTransitionMethod" value="1"/>

 <!--コントロールのプレフィックス(追加分) -->
 <add key="FxPrefixOfCheckBox" value="cbx"/>

 <!-- ファイル(フォルダ)へのパス -->
 <add key="TestFilePath" value="C:\ files\resource\test"/>

 <!-- テスト プログラムの使用するパラメータ - end -->

 <!-- アプリケーションの使用するパラメータ - end -->

図 1.2.3 appSettings セクションの実装例(アプリケーションで使用するパラメタ)

表 1.2.3 appSettings セクション(アプリケーションで使用するパラメタ)

項番 区分 属性 目的
1 流用可能 SqlTextFilePath SQL を保存するフォルダへのパスを設定する (流用可能)。
1-2 BrowserTitle WWW ブラウザに表示されるタイトル名。
1-3 ScreenTransitionMethod 画面遷移制御機能が OFF の場合の画面遷移方法を指定する。
2 流用可能:コントロールのプレフィックス FxPrefixOfCheckBox チェック ボックス コントロール。

フレームワークの処理対象となるコンテンツ ページ上のコントロール追加方法については、本ドキュメント 7 章:「P層イベント処理対応コントロール (イベント) の追加」を参照してください。

1.3 log4net

本節では、log4net の設定について説明します。本フレームワークでは、log4net によるログ出力に関する設定に XML 形式の外部ファイルを使用しています。以下は、フレームワーク付属の設定サンプルです。

1.3.1 アペンダの定義

本項では、log4net のアペンダ設定について説明します。アペンダにはログ出力先 (主にファイル) に紐付く各種設定を行います。設定項目には、ログの出力先、追加・上書きの設定、フィルタの設定、出力先毎の個別の設定、メッセージ フォーマットの設定などがあります。

<?xml version="1.0" encoding="utf-8" ?>
<!-- log4net構成設定のセクション -->

<log4net debug="true"><!-- ← debug="true"の場合、デバッグ用のコンソール出力が有効になる。 -->

    <!-- アペンダを選択することによって、ログの出力先を変更できる。 -->

    <!--
        アペンダの例

        FileAppender        :ファイルに出力。
        RollingFileAppender :ファイルに出力。ローリング機能付き。
        EventLogAppender    :イベントビューアに出力(ローカルのPCのみ)
        ConsoleAppender     :コンソールに出力
        ※ FileAppender、RollingFileAppenderは、ネットワーク上のフォルダ共有やネットワークドライブにへの出力も可能
    -->
    
    <!--
        PatternLayoutで指定できるパターン
        パターン        説明
        %logger         ログ出力が行われたlogger名
        %appdomain      アプリケーションドメイン名
        ●%date         日時を出力。「%date{yyyy/MM/dd HH:mm:ss,fff}」といった詳細指定も可能。
        ●%level        ログのレベル(Fatal/Errorなど)
        ●%t            ログを生成したスレッド
        ●%message      メッセージ
        ●%newline      改行文字
        %literal{-}     リテラル(%をそのまま出力する場合など)
        %file           ファイル名
        %class          クラス名
        %method         メソッド名
        %line           行番号
        %location       ログ出力した際の関数名とファイルのフルパス
        ※ %file ~ %locationは処理負荷が高くなるため必要な時以外は使用しない。
        http://d.hatena.ne.jp/shima111/20060703
    -->
    
    <!-- ローリング・ログファイル出力用アペンダ -->
    <appender name="(★アペンダ名1)" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="(★ファイルパス)" />
        <!-- ローリングの設定 -->
        <param name="StaticLogFileName" value="false" />
        <param name="RollingStyle" value="date " />
        <param name="DatePattern" value='"."yyyy-MM-dd".log"' />
        <!-- 書き込み時の設定(追加 or 上書き、出力エンコーディング) -->
        <param name="AppendToFile" value="true" />
        <encoding value="utf-8" />
        <!-- メッセージのフォーマット -->
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="[%date{yyyy/MM/dd HH:mm:ss,fff}],[%-5level],[%thread],%message%newline" />
        </layout>
        <!-- フィルタ(範囲)の設定 -->
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG" />
            <levelMax value="FATAL" />
        </filter>
    </appender>
        
    <!-- ローリング・ログファイル出力用アペンダ -->
    <appender name="(★アペンダ名2)" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="(★ファイルパス)" />
        <!-- ローリングの設定 -->
        <param name="StaticLogFileName" value="false" />
        <param name="RollingStyle" value="date " />
        <param name="DatePattern" value='"."yyyy-MM-dd".log"' />
        <!-- 書き込み時の設定(追加 or 上書き、出力エンコーディング) -->
        <param name="AppendToFile" value="true" />
        <encoding value="utf-8" />
        <!-- メッセージのフォーマット -->
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="[%date{yyyy/MM/dd HH:mm:ss,fff}],[%-5level],[%thread],%message%newline" />
        </layout>
        <!-- フィルタ(範囲)の設定 -->
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG" />
            <levelMax value="FATAL" />
        </filter>
    </appender>
    
    <!-- ログファイル出力用アペンダ -->
    <appender name="(★アペンダ名3)" type="log4net.Appender.FileAppender">
        <param name="File" value="(★ファイルパス)" />
        <!-- 書き込み時の設定(追加 or 上書き、出力エンコーディング) -->
        <param name="AppendToFile" value="true" />
        <encoding value="utf-8" />
        <!-- メッセージのフォーマット -->
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="[%date{yyyy/MM/dd HH:mm:ss,fff}],[%-5level],[%thread],%message%newline" />
        </layout>
        <!-- フィルタ(範囲)の設定 -->
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

図 1.3.1-1 log4net の設定ファイル アペンダの定義例 [4]

サンプル プログラムの設計を流用する場合は、SampleLogConf.xml (ASP.NET Web アプリケーション用)、SampleLogConfWebService.xml (3層アプリケーション [5] 用) ファイルをそのまま利用可能です。上記には、次の 4 つのアペンダを定義、ログ出力をしています。

  • ACCESS ログ → アクセストレース ログ
  • SQLTRACE ログ → SQL トレース ログ
  • Operation ログ → オペレーション ログ
  • SERVICE-IF ログ → サービス インターフェイス ログ

1.3.2 ロガーの定義

本項では、log4net のロガー設定について説明します。ロガーには、ログ出力時の動作を設定します (プログラムからは、ロガー名を使用してログ出力を行う)。設定項目には、Root ロガー・個別ロガーの定義、各ロガーとログ出力レベルの設定、各ロガーとアペンダとの対応があります。

    <!--
        ロガーを作成する。
        ロガーにはロガー名、アペンダ、出力レベルを設定する。
        特定のレベルのログだけを出力したい場合には、
        フィルタ(範囲)機能を使用する。
        -->
    <!--
        ↑出力レベル・高
        Fatal         システム停止するような致命的な障害
        Error         システム停止はしないが、問題となる障害
        Warn          障害ではない注意警告
        Info          操作ログなどの情報
        Debug         開発用のデバッグメッセージ
        All           すべてのレベル
        ↓出力レベル・低
    -->
    <!--
        Rootロガーを作成する(アペンダ×n、出力レベルを設定する)。
        全てのログがRootロガーに出力される。
    -->
    <root>
        <level value="DEBUG" /> 
        <appender-ref ref="(★アペンダ名1)" /> 
        <appender-ref ref="(★アペンダ名2)" /> 
        <appender-ref ref="(★アペンダ名3)" /> 
    </root>
    <!--
        個別のロガーを作成する(ロガー名、アペンダ×n、出力レベルを設定する)。
        プログラムから個別のロガー名を指定したログは、個別のロガーで処理される。
    -->
    <logger name="(★ロガー名1)">
        <level value="DEBUG" /> 
        <appender-ref ref="(★アペンダ名1)" /> 
        <appender-ref ref="(★アペンダ名2)" /> 
        <appender-ref ref="(★アペンダ名3)" /> 
    </logger>
    <logger name="(★ロガー名2)">
        <level value="DEBUG" /> 
        <appender-ref ref="(★アペンダ名1)" /> 
        <appender-ref ref="(★アペンダ名2)" /> 
        <appender-ref ref="(★アペンダ名3)" /> 
    </logger>
    <logger name="(★ロガー名3)">
        <level value="DEBUG" /> 
        <appender-ref ref="(★アペンダ名1)" /> 
        <appender-ref ref="(★アペンダ名2)" /> 
        <appender-ref ref="(★アペンダ名3)" /> 
    </logger>

</log4net>

図 1.3.2 log4net の設定ファイル ロガーの定義例

サンプル プログラムの SampleLogConf.xml ファイルでは、アペンダ毎にロガーを定義しています。

1.3.3 参考資料

log4net、またはその設定についての詳細は、log4net のサイト、または関連サイトを参照してください。

1.3.4 オプション設定

本項では、log4net のオプション設定について説明します。

<バックアップ数が固定となるローリング>
log4net では、1 系 ⇔ 2 系のローリングを代替する、バックアップ数が固定となるローリングの設定方法が Web 上の情報から発見できないことが多いですが、参考サイトで詳しく紹介されています。以下に、バックアップ数が固定となるローリングの定義例を示します。

<!-- ローリング・ログファイル出力用アペンダ-->
<appender name="(★アペンダ名)" type="log4net.Appender.RollingFileAppender">
 <param name="File" value="(★ファイルパス)" />
 <!-- ローリングの設定-->
 <param name="StaticLogFileName" value="true" />
 <param name="RollingStyle" value="size" />
 <param name="MaximumFileSize" value="10MB" />
 <param name="MaxSizeRollBackups" value="2" />
 <param name="CountDirection" value="-1" />
 <!-- 書き込み時の設定(追加 or 上書き、出力エンコーディング)-->
 <param name="AppendToFile" value="true" />
 <encoding value="utf-8" />
 <!-- メッセージのフォーマット-->
 <layout type="log4net.Layout.PatternLayout">
   <param name="ConversionPattern" value="~(省略)~" />
 </layout>
 <!-- フィルタ(範囲)の設定-->
 <filter type="log4net.Filter.LevelRangeFilter">
   <levelMin value="DEBUG" />
   <levelMax value="FATAL" />
 </filter>
</appender>

図 1.3.4 バックアップ数が固定となるローリングの定義例

上記の設定では、サイズ 10MB 毎にローリングし、2 つのバックアップを保持します [6]((ログファイル名) → 現在出力中のログ、(ログファイル名).1 → 過去のログバックアップ(古い)、(ログファイル名).2 → 過去のログバックアップ(最も古い))。日付とサイズを合わせたローリングを行う場合は、DatePattern 値に注意して設定します [7]。

<!-- ローリングの設定 -->
<param name="StaticLogFileName" value="false" />
<param name="RollingStyle" value="composite" />
<param name="DatePattern" value='"."yyyy"-"MM"-"dd".log"' />
<param name="MaximumFileSize" value="10MB" />
<param name="MaxSizeRollBackups" value="10" />
<param name="CountDirection" value="-1" />

図 1.3.4 バックアップ数が固定となるローリングの定義例

<appender filter、logger level 設定時の動作>

  • filter 設定:filter は無くても良い (フィルタなし)。
  • logger level 設定:logger level は無くても良い (無い場合は ALL 扱い)。
  • filter、logger level 設定:両方適用され、より厳しい設定が適用される。

<その他、特殊なオプション>

  • Lockingmodel タグ:appender タグの子ノードに
<lockingmodel type="log4net.Appender.FileAppender+MinimalLock">

と記述すると複数プロセスから単一のファイルにログ出力できる(ただし競合が多い場合、ログが欠落する可能性がある [8])。
type 属性:

  • log4net.Appender.FileAppender+ExclusiveLock(排他ロック。デフォルト値。複数プロセスからの書き込みは不可)

  • log4net.Appender.FileAppender+MinimalLock(最小限のロック。複数プロセスから書き込み可能だが性能は劣化)。

  • ImmediateFlush タグ:appender タグの子ノードに

<ImmediateFlush value="False" />

と記述するとバッファリングしてからフラッシュ(ログ出力)するようになる。
value 属性:

  • True(バッファリングせず即時フラッシュ。デフォルト。クラッシュ時も全ログ出力)
  • False(バッファリング後フラッシュ。Disk I/O の負荷が軽減)。

2. 共通持ち回り情報の持ち回り処理

本章では、共通持ち回り情報の定義方法と、その持ち回り処理について説明します。

2.1 画面を跨って持ち回る情報

画面を跨って持ち回る情報は、[Touryo].Infrastructure.Business.Util 名前空間の「ユーザ情報クラス2」(MyUserInfo) に収集し、Session に格納することで持ち回ります。

  • 情報設定のタイミングは、ログオン時などとする。
  • 基本的に「ユーザ情報クラス2」は、1 つのシステムに対して 1 つ作成する。
  • クラス名称は任意の名称に変更可能である。
  • セッション タイム アウトなどでユーザ情報が消失した場合は、エラー画面に飛ばして再度ログインさせるか、Forms 認証の認証チケットや Windows 認証の実行アカウントを取得できる場合はその情報を元にユーザ情報を再生成する。

「ユーザ情報クラス2」(MyUserInfo) は雛形の提供のため、当該システムに合わせてカスタマイズします。サンプル プログラムに付属の以下のクラスの実装を参考にできます。

  • セッションへの格納・取得:UserInfoHandle クラス
  • 認証時の生成処理:ログイン画面「login.aspx」「login.aspx.cs」「Aspx_Start_login」
  • 消失時の再生成:「画面コード親クラス2」(MyBaseController) のページ ロードの UOC メソッドから呼び出される「GetUserInfo」メソッド

2.2 B層・D層まで持ち回る情報

B・D 層まで持ち回る情報は、「引数親クラス2」・「戻り値親クラス2」に格納することで、B・D 層を跨って持ち回ります。

  • 設定のタイミングは、B 層生成時などとする。
  • 基本的に「引数親クラス2」・「戻り値親クラス2」は、1 つのシステムに対して 1 つずつ作成する。
  • クラス名称は任意の名称に変更可能である。

以下に、「引数親クラス2」の実装のテンプレートを示します(サンプルの「MyParameterValue」クラスを参考にできます)。

using System;
using Touryo.Infrastructure.Business.Util;
using Touryo.Infrastructure.Framework.Common;

namespace Touryo.Infrastructure.Business.Common
{
    /// <summary>引数親クラス2</summary>
    /// <remarks>
    /// シリアライズ可能にする(WS対応)自由に(拡張して)利用できる。
    /// </remarks>
    [Serializable()]
    public class MyParameterValue : BaseParameterValue
    {
        #region インスタンス変数

        /// <summary>ユーザ情報</summary>
        private MyUserInfo _user;

        #endregion

        #region コンストラクタ

        /// <summary>コンストラクタ</summary>
        /// <param name="screenId">スクリーンID</param>
        /// <param name="controlId">コントロールID</param>
        /// <param name="actionType">アクションタイプ</param>
        /// <param name="user">ユーザ情報</param>
        /// <remarks>
        /// コンストラクタは継承されないので、派生先で呼び出す必要がある。
        /// ※ コンストラクタの実行順は、基本クラス→派生クラスの順
        /// ※ VB.NET では、MyBase.New() を派生クラスのコンストラクタから呼ぶ。
        /// 自由に利用できる(互換性の維持)。
        /// </remarks>
        public MyParameterValue(string screenId, string controlId, string actionType, MyUserInfo user)
            : base(screenId, controlId, actionType)
        {
            // ユーザ情報
            this._user = user;
        }
        
        /// <summary>コンストラクタ</summary>
        /// <param name="screenId">スクリーンID</param>
        /// <param name="controlId">コントロールID</param>
        /// <param name="methodName">メソッド名</param>
        /// <param name="actionType">アクションタイプ</param>
        /// <param name="user">ユーザ情報</param>
        /// <remarks>
        /// コンストラクタは継承されないので、派生先で呼び出す必要がある。
        /// ※ コンストラクタの実行順は、基本クラス→派生クラスの順
        /// ※ VB.NET では、MyBase.New() を派生クラスのコンストラクタから呼ぶ。
        /// 自由に利用できる。
        /// </remarks>
        public MyParameterValue(string screenId, string controlId, string methodName, string actionType, MyUserInfo user)
            : base(screenId, controlId, methodName, actionType)
        {
            // ユーザ情報
            this._user = user;
        }

        #endregion

        #region プロパティ

        /// <summary>ユーザ情報(読み取り専用)</summary>
        /// <remarks>自由に利用できる。</remarks>
        public MyUserInfo User
        {
            get
            {
                return this._user;
            }
        }

        #endregion        
    }
}

図 2.2-1 「引数親クラス2」の実装のテンプレート

以下に、「戻り値親クラス2」の実装のテンプレートを示します(サンプルの「MyReturnValue」クラスを参考にできます)。

namespace Touryo.Infrastructure.Business.Common
namespace Touryo.Infrastructure.Business.Common
{
  /// <summary>戻り値親クラス2</summary>
  /// <remarks>
  /// シリアライズ可能にする(WS対応)自由に(拡張して)利用できる。
  /// </remarks>
  [Serializable()]
  public class MyReturnValue : BaseReturnValue
  {
    #region インスタンス変数
    private string _Output1;
    private string _Output2;
    #endregion
    
    #region プロパティ
    public string Output1
    {
      set
      {
        this._Output1 = value;
      }
      get
      {
        return this._Output1;
      }
    }
    
    public string Output2
    {
      set
      {
        this._Output2 = value;
      }
      get
      {
        return this._Output2;
      }
    }
    #endregion
  }
}

図 2.2-2 「戻り値親クラス2」の実装のテンプレート

3. B層フレームワーク

3.1 「業務コード親クラス2」の準備

「業務コード親クラス2」には、次に示す B 層の共通処理を実装できます。

表 3.1 「業務コード親クラス2」に実装できる B 層の共通処理

項番 処理 メソッド 説明項
1 DB 初期化処理 UOC_ConnectionOpen(DB 接続、閉塞チェック、分離レベル設定、トランザクション開始 ,etc.) 3.2 節
2 開始処理 UOC_PreAction(処理時間の測定、アクセス ログの出力 ,etc.) 3.3 節
3 業務処理メソッドの自動振り分け処理 UOC_DoAction(業務処理メソッドの自動振り分け処理) 3.5 節
4 終了処理 UOC_AfterAction(処理時間の測定、アクセス ログの出力 ,etc.) 3.3 節
5 終了処理2 UOC_AfterTransaction(トランザクション完了 (COMMIT) 後の後処理。処理時間の測定、アクセス ログの出力 ,etc.) 3.4 節
7 例外処理 UOC_ABEND(例外振替、アクセス ログ出力、エラー ログ出力 ,etc.) 3.6 節

基本的に「業務コード親クラス2」は 1 つのシステムに対して 1 つ作成します(クラス名称は変更可能)。以下に実装のテンプレートを示します(サンプルの「MyFcBaseLogic」クラスを参考にできます)。

#region using
// System~
using System;
~
using Touryo.Infrastructure.Business.Util;
#endregion
namespace Touryo.Infrastructure.Business.Business
{
 /// <summary>
 /// 業務コード親クラス2(テンプレート)
 /// </summary>
 public abstract class MyFcBaseLogic : BaseLogic
 {
 }
}

図 3.1 「業務コード親クラス2」の実装のテンプレート

3.2 「DB 初期化処理」を実装する

「DB 初期化処理」は実装必須の処理です。この処理を実装する場合、「UOC_ConnectionOpen」メソッドを「業務コード親クラス2」でオーバーライドします。この UOC メソッドには、「データアクセス制御クラス」の生成、DB 接続、閉塞チェック、分離レベル設定、トランザクション開始 ,etc. の処理を実装します。

/// <summary>データアクセス制御クラス(DAM)の生成し、コネクションを確立、トランザクションを開始する処理を実装</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="iso">分離レベル(DBMS毎の分離レベルの違いを理解して設定すること)</param>
protected override void UOC_ConnectionOpen(
BaseParameterValue parameterValue,
DbEnum.IsolationLevelEnum iso)
{
  // データアクセス制御クラス(DAM)を生成
  BaseDam dam = new Touryo.Infrastructure.Public.Db.DamSqlSvr();
  
  // 接続文字列をロード
  string connstring = GetConfigParameter.GetConnectionString("ConnectionString_SQL");
  
  // コネクションをオープンする。
  dam.ConnectionOpen(connstring);
  
  // 必要であれば、閉塞のチェック処理などを実装する。---------------------
  // ---------------------------------------------------------------------
  
  // 分離レベルの設定。
  if (iso == DbEnum.IsolationLevelEnum.User)
  {
    // ユーザ指定の分離レベルに変更する。
    iso = DbEnum.IsolationLevelEnum.DefaultTransaction;
  }
  
  // トランザクションを開始する。
  dam.BeginTransaction(iso);
  
  // damを設定する。
  this.SetDam(dam);
}

図 3.2 「DB 初期化処理」の実装例

生成 〜 DB 接続 〜 トランザクション開始をした Dam を「SetDam」メソッドによりフレームワークの管理下に置くことで、対応するトランザクション終了 (コミット・ロールバック)・DB 切断の処理は、フレームワーク (「業務コード親クラス1」) により自動的に処理されます。

3.3 「B層処理の開始・終了処理」を実装する

「B層処理の開始・終了処理」は実装必須の処理です。「UOC_PreAction」、「UOC_AfterAction」メソッドを「業務コード親クラス2」でオーバーライドし、処理時間の測定、アクセス ログの出力 ,etc. の処理を実装します。

/// <summary>B層の開始処理を実装</summary>
/// <param name="parameterValue">引数クラス</param>
protected override void UOC_PreAction(BaseParameterValue parameterValue)
{
 //B層の開始処理を実装する。
 //TODO:
}
/// <summary>B層の終了処理を実装</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="returnValue">戻り値クラス</param>
protected override void UOC_AfterAction(BaseParameterValue parameterValue, BaseReturnValue returnValue)
{
 //B層の終了処理を実装する。
 //TODO:
}

図 3.3 「B層処理の開始・終了処理」の実装例

3.4 「トランザクションの終了処理」を実装する

「トランザクションの終了処理」は実装必須の処理です。「UOC_AfterTransaction」メソッドを「業務コード親クラス2」でオーバーライドし、トランザクション処理の完了後に実行する (メッセージ出力・メッセージ送信などの) 処理を実装できます。

/// <summary>B層のトランザクションのコミット後の終了処理を実装</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="returnValue">戻り値クラス</param>
protected override void UOC_AfterTransaction(BaseParameterValue parameterValue, BaseReturnValue returnValue)
{
 //B層のトランザクションのコミット後の終了処理を実装する。
 //TODO:
}

図 3.4 「トランザクションの終了処理」の実装例

3.5 業務処理メソッドの自動振り分け処理を実装する

「業務処理メソッドの自動振り分け処理」は実装必須の処理です (従来はオプション扱いでしたが、以降は推奨方式)。「UOC_DoAction」メソッドを「業務コード親クラス2」でオーバーライドします。

/// <summary>自動振り分け処理</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="returnValue">戻り値クラス</param>
protected override void UOC_DoAction(BaseParameterValue parameterValue, ref BaseReturnValue returnValue)
{
 // メソッド名を生成
 string methodName = "UOC_" + parameterValue.MethodName;
 #region レイトバインドする
 object[] paramSet = new object[] { parameterValue };
 try
 {
   // Latebind
   Latebind.InvokeMethod(this, methodName, paramSet);
 }
 catch (System.Reflection.TargetInvocationException rtEx)
 {
   // InnerExceptionのスタックトレースを保存しておく(以下のリスローで消去されるため)。
   this.OriginalStackTrace = rtEx.InnerException.StackTrace;
   // InnerExceptionを投げなおす。
   throw rtEx.InnerException;
 }
 finally
 {
   // レイトバインドにおいて、
   // ・ 戻り値(in)の場合、下位で生成した戻り値インスタンスは戻らない。
   // ・ 戻り値(ref, out)の場合、例外発生時は戻り値インスタンスは戻らない。
   // という問題がある。
   // ∴ (特に後者の対応のため、)
   // メンバ変数を使用して戻り値インスタンスを戻す。
   returnValue = this.ReturnValue;
 }
 #endregion
}

図 3.5 「業務処理メソッドの自動振り分け処理」の実装例

3.6 「例外処理」を実装する

「例外処理」は実装必須の処理です。以下の 3 つの「UOC_ABEND」メソッドを「業務コード親クラス2」でオーバーライドします。

表 3.6 「業務コード親クラス2」に実装できる、3 つの「UOC_ABEND」メソッド

項番 対応する例外 メソッド シグネチャ
1 業務例外 UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue, BusinessApplicationException baEx)
2 システム例外 UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue, BusinessSystemException bsEx)
3 その他、一般的な例外 UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue, Exception ex)

これらの UOC メソッドに、例外の種類を区別して、例外振替、アクセス ログ出力、エラー ログ出力 ,etc. の処理を実装します。

  • 業務例外の例外処理:特徴は、処理後に例外のリスローをしない点です。ここには「アクセス ログ出力」の処理を実装できます。
/// <summary>B層の業務例外による異常終了の後処理を実装するUOCメソッド。</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="returnValue">戻り値クラス</param>
/// <param name="baEx">BusinessApplicationException</param>
protected override void UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue,
BusinessApplicationException baEx)
{
 // 業務例外発生時の処理を実装
 // TODO:
}

図 3.5-1 「業務例外の例外処理」の実装例

  • システム例外の例外処理:特徴は、処理後に「システム例外」をリスローする点です。ここには「エラー ログ出力」の処理を実装できます。
/// <summary>B層のシステム例外による異常終了の後処理を実装するUOCメソッド。</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="returnValue">戻り値クラス</param>
/// <param name="bsEx">BusinessSystemException</param>
protected override void UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue,
BusinessSystemException bsEx)
{
 // システム例外発生時の処理を実装
 // TODO:
}

図 3.5-2 「システム例外の例外処理」の実装例

  • その他、一般的な例外の例外処理:特徴は、処理後に例外のリスローをしない点です (「その他、一般的な例外」を「システム例外」・「業務例外」へ振り替えるため)。「エラー ログ出力」・「アクセス ログ出力」処理以外にも「例外振替」処理を実装できます。「業務例外」に振り替える場合は「アクセス ログ出力」を、「その他、一般的な例外」・「システム例外」に振り替える場合は「エラー ログ出力」を出力します。
/// <summary>B層の一般的な例外による異常終了の後処理を実装するUOCメソッド。</summary>
/// <param name="parameterValue">引数クラス</param>
/// <param name="returnValue">戻り値クラス</param>
/// <param name="ex">Exception</param>
protected override void UOC_ABEND(BaseParameterValue parameterValue, ref BaseReturnValue returnValue,
Exception ex)
{
 // 一般的な例外発生時の処理を実装
 // TODO:
 // 例外の振替処理
 if (ex.Message == "エラーの型、メッセージなどから振替対象の例外を特定")
 {
   // 業務例外へ振替
   returnValue.ErrorFlag = true;
   returnValue.ErrorMessageID = "振替後のエラーメッセージID";
   returnValue.ErrorMessage = "振替後のエラーメッセージ";
   returnValue.ErrorInfo = "-";
 }
 else if (ex.Message == "エラーの型、メッセージなどから振替対象の例外を特定")
 {
   // システム例外へ振替
   // リスロー
   throw new BusinessSystemException("振替後のエラーメッセージID", "振替後のエラーメッセージ");
 }
 else
 {
   // リスロー
   throw ex;
 }
}

図 3.5-3 「その他、一般的な例外の例外処理」の実装例

4. D層フレームワーク

4.1 「データアクセス親クラス2」の準備

「データアクセス親クラス2」には、次に示す D 層の共通処理を実装できます。

表 4.1 「データアクセス親クラス2」に実装できる D 層の共通処理

項番 処理 メソッド
1 開始処理 UOC_PreQuery(処理時間の測定 ,etc.)
2 終了処理 UOC_AfterQuery(処理時間の測定、SQL トレース ログ出力、エラー ログ出力、例外振替 ,etc.)

基本的に「データアクセス親クラス2」は 1 つのシステムに対して 1 つ作成します。以下に実装のテンプレートを示します(サンプルの「MyBaseDao」クラスを参考にできます)。

#region using
// System~
using System;
~
using Touryo.Infrastructure.Business.Util;
#endregion
namespace Touryo.Infrastructure.Business.Dao
{
 /// <summary>
 /// データアクセス親クラス2(テンプレート)
 /// </summary>
 public abstract class MyBaseDao : BaseDao
 {
 }
}

図 4.1 「データアクセス親クラス2」の実装のテンプレート

4.2 「データアクセス処理の開始・終了処理」を実装する

「データアクセス処理の開始・終了処理」は実装必須の処理です。「UOC_PreQuery」、「UOC_AfterQuery」メソッドを「データアクセス親クラス2」でオーバーライドし、処理時間の測定、SQL トレース ログ出力、エラー ログ出力、例外振替 ,etc. の処理を実装します。

/// <summary>SQL実行開始処理を実装する共通UOCメソッド</summary>
protected override void UOC_PreQuery()
{
 // SQL実行開始処理を実装する。
 //TODO:
}
/// <summary>SQL実行終了処理を実装する共通UOCメソッド(正常時)</summary>
/// <param name="sql">実行したSQLの情報</param>
protected override void UOC_AfterQuery(string sql)
{
 // SQL実行終了処理を実装する(正常時)。
 //TODO:
}
/// <summary>SQL実行終了処理を実装する共通UOCメソッド(異常時)</summary>
/// <param name="sql">実行したSQLの情報</param>
/// <param name="ex">エラー情報</param>
protected override void UOC_AfterQuery(string sql, Exception ex)
{
 // SQL実行終了処理を実装する(異常時)。
 //TODO:
}

図 4.2 「データアクセス処理の開始・終了処理」の実装例

5. P層フレームワーク

5.1 「画面コード親クラス2」の準備

「画面コード親クラス2」には、次に示す P 層の共通処理を実装できます。

表 5.1 「画面コード親クラス2」に実装できる P 層の共通処理

項番 処理 メソッド 説明項
1 初期処理 (ページ ロード処理) UOC_CMNFormInit、UOC_CMNFormInit_PostBack(カスタム認証、権限チェック、閉塞チェック、キャッシュ無効化設定、ページ タイトルの設定、アクセス ログの出力 ,etc.) 5.1.1 項
2 P層イベント処理の前後処理:開始処理 UOC_PreAction(処理時間の測定、アクセス ログの出力 ,etc.) 5.1.2 項
3 終了処理 UOC_AfterAction(処理時間の測定、アクセス ログの出力 ,etc.) 5.1.2 項
4 画面遷移 UOC_Screen_Transition(画面遷移の方法を規定する) 5.1.3 項
5 終了処理2 UOC_Finally(最終処理 ,etc.) -
6 例外処理 UOC_ABEND(メッセージ編集、共通メッセージの表示、アクセス ログ、エラー ログ出力 ,etc.) 5.1.4 項
7 マスタページ上のコントロールの共通の P層イベント処理 UOC_(マスタ ページ ファイル名)(コントロール名)(イベント名) 5.2.2 項

基本的に「画面コード親クラス2」は 1 つのシステムに対して 1 つ作成します。以下に実装のテンプレートを示します(サンプルの「MyBaseController」クラスを参考にできます)。

#region using
// System~
using System;
~
using Touryo.Infrastructure.Business.Util;
#endregion
namespace Touryo.Infrastructure.Business.Presentation
{
 /// <summary>
 /// 画面コード親クラス2
 /// </summary>
 public abstract class MyBaseController : BaseController
 {
 }
}

図 5.1 「画面コード親クラス2」の実装のテンプレート

5.1.1 「ページ ロード処理」を実装する

「ページ ロード処理」は実装必須の処理です。「UOC_CMNFormInit」、「UOC_CMNFormInit_PostBack」メソッドを「画面コード親クラス2」でオーバーライドし、初回ロード時・ポストバック時を区別して、カスタム認証、権限チェック・閉塞チェック、キャッシュ無効化設定、ページ タイトルの設定、アクセス ログの出力 ,etc. の処理を実装します。

/// <summary>ページロードのUOCメソッド(共通:初回ロード)</summary>
/// <remarks>実装必須</remarks>
protected override void UOC_CMNFormInit()
{
 // フォーム初期化(初回ロード)時に実行する処理を実装する
 // TODO:
}
/// <summary>ページロードのUOCメソッド(共通:ポストバック)</summary>
/// <remarks>実装必須</remarks>
protected override void UOC_CMNFormInit_PostBack()
{
 // フォーム初期化(ポストバック)時に実行する処理を実装する
 // TODO:
}

図 5.1.1 「ページ ロード処理」の実装例

5.1.2 「P層イベント処理の開始・終了処理」を実装する

「P層イベント処理の開始・終了処理」は実装必須の処理です。「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

図 5.1.2 「P層イベント処理の開始・終了処理」の実装例

5.1.3 「画面遷移処理」を実装する

「画面遷移処理」は実装必須の処理です。

「UOC_Screen_Transition」メソッドを「画面コード親クラス2」でオーバーライドします。

  • この UOC メソッドは、P 層のイベント処理が返す URL (パス) を引数に指定された状態でフレームワークから呼び出されます。

  • この URL (パス) を使用して画面遷移をするメソッドを実装することで、画面遷移方式をシステム全体で統一できます。

  • なお、画面遷移には、フレームワーク提供の画面遷移制御機能を利用できます (詳細は「各機能編」を参照)。

  • 画面遷移制御機能を利用する場合

    • ScreenTransition メソッド
    • TransitionMethod プロパティ
  • 画面遷移制御機能を利用しない場合

    • FxTransfer メソッド
    • FxRedirect メソッド
#region 画面遷移メソッド
/// <summary>ボタンのクリック・イベントの終了後の画面遷移処理を実装</summary>
/// <param name="url">画面遷移する場合のURL</param>
protected override void UOC_Screen_Transition(string url)
{
  // urlが空の場合、どこにも遷移せず、ポストバックとなる。
  if (url == "")
  {
    // 何もしない。
  }
  else
  {
    if (MyBaseController.TransitionMethod == FxLiteral.OFF)
    {
      // 画面遷移制御部品を使用しない場合
      // 画面遷移方法を取得(テストプログラム用パラメータ)
      string screenTransitionMethod =
      GetConfigParameter.GetConfigValue("ScreenTransitionMethod");
      if (screenTransitionMethod == "1")
      {
        // フレームワーク管理下の画面遷移(Transfer)
        this.FxTransfer(url);
      }
      else if (screenTransitionMethod == "2")
      {
        // フレームワーク管理下の画面遷移(Redirect)
        this.FxRedirect(url);
      }
      else
      {
        // パラメータ指定ミス
      }
    }
    else
    {
      // 画面遷移制御部品を使用して画面遷移
      this.ScreenTransition(url);
    }
  }
}
#endregion

図 5.1.3 「画面遷移処理」の実装例

5.1.4 「例外処理」を実装する

「例外処理」は実装必須の処理です。以下の 3 つの「UOC_ABEND」メソッドを「画面コード親クラス2」でオーバーライドします。

表 5.1.4-a 「画面コード親クラス2」に実装できる、3 つの「UOC_ABEND」メソッド

項番 対応する例外 メソッド シグネチャ
1 業務例外 UOC_ABEND(BusinessApplicationException baEx, FxEventArgs fxEventArgs)
2 システム例外 UOC_ABEND(BusinessSystemException bsEx, FxEventArgs fxEventArgs)
3 その他、一般的な例外 UOC_ABEND(Exception ex, FxEventArgs fxEventArgs)

これらの UOC メソッドに、例外の種類を区別して、メッセージ編集、共通メッセージの表示、アクセス ログ出力、エラー ログ出力 ,etc. の処理を実装します。

  • 業務例外の例外処理:処理後に例外のリスローをしません。「業務例外」を使用した「メッセージ編集」・「共通メッセージの表示」の処理を実装できます。
// <summary>業務例外発生時の処理を実装</summary>
/// <param name="baEx">BusinessApplicationException</param>
/// <param name="fxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_ABEND(BusinessApplicationException baEx, FxEventArgs fxEventArgs)
{
 // 業務例外発生時の処理を実装
 // TODO:
}

図 5.1.4-1 「業務例外の例外処理」の実装例

  • システム例外の例外処理:処理後に「システム例外」をリスローします。「エラー ログ出力」の処理を実装できます (エラー メッセージ表示処理は「共通エラー画面表示処理」に実装)。
/// <summary>システム例外発生時の処理を実装</summary>
/// <param name="bsEx">BusinessSystemException</param>
/// <param name="fxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_ABEND(BusinessSystemException bsEx, FxEventArgs fxEventArgs)
{
 // システム例外発生時の処理を実装
 // TODO:
}

図 5.1.4-2 「システム例外の例外処理」の実装例

  • その他、一般的な例外の例外処理:処理後にリスローします。「エラー ログ出力」の処理を実装できます。
/// <summary>一般的な例外発生時の処理を実装</summary>
/// <param name="ex">例外オブジェクト</param>
/// <param name="fxEventArgs">イベントハンドラの共通引数</param>
protected override void UOC_ABEND(Exception ex, FxEventArgs fxEventArgs)
{
 // 一般的な例外発生時の処理を実装
 // TODO:
}

図 5.1.4-3 「その他、一般的な例外の例外処理」の実装例

  • 「共通エラー画面表示処理」の実装:前述の「システム例外の例外処理」、「その他、一般的な例外の例外処理」から呼び出される「共通エラー画面表示処理」については、サンプルの「TransferErrorScreen」メソッドを参考にできます。
/// <summary>例外発生時に、エラー画面に画面遷移</summary>
private void TransferErrorScreen(Exception ex) {
  if (this.AjaxExtensionStatus == FxEnum.AjaxExtStat.IsAjaxExtension){
    // Ajax Extensionの場合は、エラー画面を戻さないこと!
    throw ex;
  }
  else if (this.IsClientCallback) {
    // Client Callbackの場合は、エラー画面を戻さないこと!
    throw ex;
  }
  else {
    #region 例外型を判別しエラーメッセージIDを取得
    // エラーメッセージ
    string err_msg;
    // エラー情報をセッションから取得
    string err_info;
    // エラーのタイプ
    string[] arrErrType = ex.GetType().ToString().Split('.');
    string errType = arrErrType[arrErrType.Length - 1];
    // エラーメッセージID
    string errMsgId = "";
    if (errType == "BusinessSystemException") {
      // システム例外
      BusinessSystemException bsEx = (BusinessSystemException)ex;
      errMsgId = bsEx.messageID;
    }
    else if (errType == "FrameworkException") {
      // フレームワーク例外
      FrameworkException fxEx = (FrameworkException)ex;
      errMsgId = fxEx.messageID;
    }
    else {
      // それ以外の例外
      errMsgId = "-";
    }
    #endregion
    #region エラー時に、セッションを開放しないで、業務を続行可能にする処理を追加。
    // 不正操作エラー
    if (errMsgId == "IllegalOperationCheckError") {
      // セッションをクリアしない
      HttpContext.Current.Items.Add(FxHttpContextIndex.SESSION_ABANDON_FLAG, false);
    }
    else {
      // セッションをクリアする
      HttpContext.Current.Items.Add(FxHttpContextIndex.SESSION_ABANDON_FLAG, true);
    }
    #endregion
    #region エラー画面に表示するエラー情報を作成
    err_msg = System.Environment.NewLine +
    "エラーメッセージID: " + errMsgId + System.Environment.NewLine +
    "エラーメッセージ: " + ex.Message.ToString();
    err_info = System.Environment.NewLine +
    "対象URL: " + Request.Url.ToString() + System.Environment.NewLine +
    "スタックトレース:" + ex.StackTrace.ToString() + System.Environment.NewLine +
    "Exception.ToString():" + ex.ToString();
    // Form情報を出力するために、遷移方法をServer.Transferに変更。
    // また、情報受け渡しを、HttpContextに変更。
    HttpContext.Current.Items.Add(FxHttpContextIndex.SYSTEM_EXCEPTION_MESSAGE, err_msg);
    HttpContext.Current.Items.Add(FxHttpContextIndex.SYSTEM_EXCEPTION_INFORMATION, err_info);
    #endregion
    // エラー画面へのパスを取得 --- チェック不要(ベースクラスでチェック済み)
    string errorScreenPath = GetConfigParameter.GetConfigValue(FxLiteral.ERROR_SCREEN_PATH);
    // エラー画面へ画面遷移
    Server.Transfer(errorScreenPath);
  }
}

図 5.1.4-4 「共通エラー画面表示処理」の実装例

また、ASP.NET まで抜けた例外に関しては、「Global.asax」の「Application_Error」イベント ハンドラで例外をキャッチして「共通エラー画面」を起動することもできます。

  • 「共通エラー画面」:開発時の「開発用共通エラー画面」は、サンプル付属の「ErrorScreen.aspx」「ErrorScreen.aspx.cs」「Aspx_Common_ErrorScreen」をそのまま使用できます。
図 5.1.4-5 「開発用共通エラー画面」

この「開発用共通エラー画面」は、例外のメッセージ ID・メッセージ、対象 URL・スタック トレース、HTTP リクエストに含まれる Form 情報のキーと値、HTTP セッションに含まれる Session 情報のキーと値、を出力するなど、デバッグが容易になるよう工夫されています。本番環境に移行する際には、この「共通エラー画面表示処理」を修正し、「開発用共通エラー画面」を「本番用共通エラー画面」に置き換える必要があります [9](基盤の処理を壊さないように注意)。

/// <summary>画面起動時に実行されるイベントハンドラ</summary>
protected void Page_Load(object sender, EventArgs e) {
  // 画面にエラーメッセージ・エラー情報を表示する----------------------------
  // エラーメッセージをHTTPコンテキストから取得
  // エラー情報をHTTPコンテキストから取得
  // 画面にエラーメッセージを表示する
  // 画面にエラー情報を表示する
  // ------------------------------------------------------------------------
  // 画面にフォーム情報を表示する--------------------------------------------
  // 画面にセッション情報を表示する------------------------------------------
  // ------------------------------------------------------------------------
  // セッション情報を削除する------------------------------------------------
  if ((bool)HttpContext.Current.Items[FxHttpContextIndex.SESSION_ABANDON_FLAG]) {
    // セッション タイムアウト検出用Cookieを消去
    // ※ Removeが正常に動作しないため、値を空文字に設定 = 消去とする
    // Set-Cookie HTTPヘッダをレスポンス
    Response.Cookies.Set(FxCmnFunction.DeleteCookieForSessionTimeoutDetection());
    try {
      // セッションを消去
      Session.Abandon();
    }
    catch (Exception ex2) {
      // エラー発生時
      // このカバレージを通過する場合、
      // おそらく起動した画面のパスが間違っている。
    }
  }
}

図 5.1.4-6 「エラー画面のコードビハインド」

  • ユーザ向けのメッセージを生成・表示する共通処理の実装箇所を以下の表 5.1.4-b に纏めます。

表 5.1.4-b ユーザ向けのメッセージを生成・表示する共通処理の実装箇所

項番 例外 メッセージ内容/実装箇所
1 業務例外 リトライ可能な例外のメッセージ (業務画面に出力)。「画面コード親クラス2」の「業務例外の例外処理」の UOC メソッド。
2 システム例外 リトライ不可能な例外のメッセージ (共通エラー画面に出力)。「MyBaseController」の「TransferErrorScreen」メソッド、「Global.asax」の「Application_Error」イベント ハンドラ、「共通エラー画面」。
3 その他、一般的な例外 リトライ不可能な例外のメッセージ (共通エラー画面に出力)。「MyBaseController」の「TransferErrorScreen」メソッド、「Global.asax」の「Application_Error」イベント ハンドラ、「共通エラー画面」。

メッセージを生成・表示する共通処理を実装するには、メッセージ取得機能として提供している [Touryo].Infrastructure.Framework.Util 名前空間の「GetMessage」クラスを使用します (詳細は「各機能編」を参照)。

5.2 「マスタ ページ」の準備

「マスタ ページ」は、各画面から共通のデザインやボタン配置を抜き出し、共通化する目的で作成します。基本的に 1 つのシステムに対して複数作成可能です (モジュール名称は変更可能)。

5.2.1 「マスタ ページ」を実装する

以下に「マスタ ページ」の実装のテンプレートを示します。マスタ ページは入れ子にすることも可能ですが、ルートのマスタ ページは必ず下記のように実装する必要があります (Contentplaceholder の数や配置はユーザが自由に変更できます)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
 <title>無題のページ</title>
 
 <!-- レームワークに必要な JavaScript 、JavaScript ファイル、プロジェクト共通の CSS ファイルなどヘのリンクを仕掛ける。-->
 
 <!--FxCode:add-start-->
 <script type="text/javascript" src="/(サイト名)/Framework/js/common.js"></script>
 <script type="text/javascript" src="/(サイト名)/Framework/js/ie_key_event.js"></script>
 
 <!-- onhelpイベントを無効にする。-->
 <script language="javascript" for="document" event="onhelp">
   event.returnValue = false;
 </script>

 <link rel="stylesheet" href="/(サイト名)/Css/style.css" type="text/css"/>
 <!--FxCode:add-end-->
</head>

<!--FxCode:add-js-event--><!-- フレームワークに必要なJavaScript イベントを仕掛ける。-->
<body onload=" Fx_Document_OnLoad();" onunload="Fx_Document_OnClose();">

 <!-- オートコンプリートを指定 -->
 <form id="form1" runat="server" autocomplete="on">

 <!--SampleCode:add-start-->
 <!--SampleCode:Contents--><!-- Contentplaceholder を定義する。-->
 <asp:contentplaceholder id="ContentPlaceHolderA" runat="Server">
 This is Default Content -- Override on Page
 </asp:contentplaceholder>
 <!--SampleCode:add-end-->
 
 <!--FxCode:add-start--><!-- フレームワークに必要なHidden フィールドを仕掛ける。-->
 <asp:HiddenField ID="ChildScreenType" runat="server" Value="0" />
 <asp:HiddenField ID="ChildScreenUrl" runat="server" Value="0" />
 <asp:HiddenField ID="CloseFlag" runat="server" Value="0" />
 <asp:HiddenField ID="SubmitFlag" runat="server" Value="0" />
 <asp:HiddenField ID="ScreenGuid" runat="server" Value="0" />
 <asp:HiddenField ID="FxDialogStyle" runat="server" Value="0" />
 <asp:HiddenField ID="BusinessDialogStyle" runat="server" Value="0" />
 <asp:HiddenField ID="NormalScreenStyle" runat="server" Value="0" />
 <asp:HiddenField ID="NormalScreenTarget" runat="server" Value="0" />
 <asp:HiddenField ID="DialogFrameUrl" runat="server" Value="0" />
 <asp:HiddenField ID="WindowGuid" runat="server" Value="0" />
 <asp:HiddenField ID="RequestTicketGuid" runat="server" Value="0" />
 <!--FxCode:add-end-->
 </form>
</body>
</html>

図 5.2.1 「マスタ ページ」の実装のテンプレート 1

下記は、コード ビハインド ファイル (コード ファイル) のテンプレートです。

「マスタ ベース ページ 」である、BaseMasterController を継承する。

using Touryo.Infrastructure.Framework.Presentation;
/// <summary>ブランクのマスタ ページ</summary>
protected partial class Aspx_Common_TestBlankScreen : BaseMasterController
{
}

図 5.2.1 「マスタ ページ」の実装のテンプレート 2

5.2.2 「マスタ ページ上のコントロールの共通イベント処理」を実装する

「マスタ ページ上のコントロールの共通イベント処理」を実装するには、以下の手順に従います。

  1. 「マスタ ページ」上にコントロール ([prefix] 任意の文字列) を配置する。
  2. UOC メソッドを実装する。
    • 「画面コード親クラス2」上に UOC メソッド UOC_(マスタ ページ ファイル名)_[prefix]任意の文字列_(イベント名) を実装する。
    • 「マスタ ページ」上に UOC メソッド UOC_[prefix]任意の文字列_(イベント名) を実装する。
  • 「マスタ ページ」上にコントロールを配置(ボタンのカスタム コントロールを選択した場合の例)
<cc1:WebCustomButton ID="btnMasterCommon" runat="server" Text="マスタ共通ボタン" Width="220px" /><br />

図 5.2.2-1 「マスタ ページ」上のコントロールの実装例

  • UOC メソッドを実装:コントロール イベントのイベント ハンドラのシグネチャは protected string イベント ハンドラ名(FxEventArgs fxEventArgs) とします。例外として、GridView の RowUpdating/RowDeleting/PageIndexChanging/Sorting イベントは、もう一つのイベント引数としてオリジナルの EventArgs を取り、protected string イベント ハンドラ名(FxEventArgs fxEventArgs, EventArgs e) となります。
    • 「画面コード親クラス2」上に UOC メソッドを実装(マスタ ページ ファイル名=「TestScreen.master」の場合)

イベント処理を実装する。 ※ URL をリターンする場合、画面遷移する。 ※ 空文字列をリターンする場合、画面遷移せず、ポストバックになる。

UOC メソッドは、共通イベントハンドラからレイトバインドで呼び出されるため「public」か「protected」で定義する必要がある(aspx.cs(vb)の「private」は特殊でレイトバインド不可能)。

protected string UOC_TestScreen_btnMasterCommon_Click(FxEventArgs fxEventArgs)
{
 // TODO:
 // 画面遷移しないポストバックの場合は、urlを空文字列に設定する
 return "";
}

図 5.2.2-2 「画面コード親クラス2」上のイベントハンドラの実装例

  • 「マスタ ページ」上に UOC メソッドを実装

こちらは、メソッド名からマスタ ページ名が不要。

protected string UOC_btnMasterCommon_Click(FxEventArgs fxEventArgs)
{
 // TODO:
 // 画面遷移しないポストバックの場合は、urlを空文字列に設定する
 return "";
}

図 5.2.2-3 「マスタ ページ」上のイベントハンドラの実装例

5.3 「ユーザ コントロール」の準備

「ユーザ コントロール」は、各画面から共通のデザインやボタン配置を抜き出し、共通化する目的で作成します。基本的に 1 つのシステムに対して複数作成可能です (モジュール名称は変更可能)。

5.3.1 「ユーザ コントロール上のコントロールの共通イベント処理」を実装する

以下の手順に従います。

  1. 「ユーザ コントロール」上にコントロール ([prefix] 任意の文字列) を配置する。
  2. UOC メソッドを実装する。
    • 「画面コード親クラス2」上に UOC メソッド UOC_(ユーザ コントロール名)_[prefix]任意の文字列_(イベント名) を実装する。
    • 「ユーザ コントロール」上に UOC メソッド UOC_[prefix]任意の文字列_(イベント名) を実装する。
  • 「ユーザ コントロール」上にコントロールを配置(ボタンのカスタム コントロールを選択した場合の例)
<cc1:WebCustomButton ID="btnControlCommon" runat="server" Text="UC 共通ボタン" Width="220px" /><br />

図 5.3.1-1 「ユーザ コントロール」上のコントロールの実装例

  • UOC メソッドを実装(シグネチャは 5.2.2 と同様)
    • 「画面コード親クラス2」上に UOC メソッドを実装(ユーザ コントロール名=「sampleControl1」の場合)

イベント処理を実装する。 ※ URL をリターンする場合、画面遷移する。 ※ 空文字列をリターンする場合、画面遷移せず、ポストバックになる。

UOC メソッドは、共通イベントハンドラからレイトバインドで呼び出されるため「public」か「protected」で定義する必要がある(aspx.cs(vb)の「private」は特殊でレイトバインド不可能)。

protected string UOC_sampleControl1_btnControlCommon_Click(FxEventArgs fxEventArgs)
{
 // TODO:
 // 画面遷移しないポストバックの場合は、urlを空文字列に設定する
 return "";
}

図 5.3.1-2 「画面コード親クラス2」上のイベントハンドラの実装例

  • 「ユーザ コントロール」上に UOC メソッドを実装

こちらは、メソッド名からユーザ コントロール名が不要。

protected string UOC_btnMasterCommon_Click(FxEventArgs fxEventArgs)
{
 // TODO:
 // 画面遷移しないポストバックの場合は、urlを空文字列に設定する
 return "";
}

図 5.3.1-3 「ユーザ コントロール」上のイベントハンドラの実装例

6. その他

6.1 例外クラスのメッセージ ID、メッセージ定義クラス

システム固有の例外に「業務例外」・「システム例外」がありますが、これらの例外の種類は、クラスを派生させるのではなく、メッセージ ID・メッセージにより定義します。例外の種類を定義する場合、[Touryo].Infrastructure.Business 名前空間に、「業務例外」は「MyBusinessApplicationExceptionMessage」クラス、「システム例外」は「MyBusinessSystemExceptionMessage」クラスを作成し、これにメッセージ ID・メッセージを定義します。

例外の種類が増える毎に、これに対応したメッセージID・メッセージを定義する。

namespace Touryo.Infrastructure.Business.Exceptions
{
  /// <summary>業務例外のメッセージID、メッセージに使用する
  /// 文字列定数を定義する定数クラス(ユーザ用)</summary>
  public class MyBusinessApplicationExceptionMessage
  {
    /// <summary>
    /// サンプルの業務例外のメッセージID、メッセージに使用する文字列定数
    /// </summary>
    public static readonly string[] SAMPLE_ERROR = new string[] { "MessageID_SampleError", "Message_SampleError" };
  }
}

図 6.1-1 「業務例外」のメッセージ ID・メッセージを定義するクラス

// xxxエラー
throw new BusinessApplicationException(
 MyBusinessApplicationExceptionMessageMessage.SAMPLE_ERROR[0],
 MyBusinessApplicationExceptionMessageMessage.SAMPLE_ERROR[1]);

図 6.1-2 「業務例外」をスロー

例外の種類が増える毎に、これに対応したメッセージID・メッセージを定義する。

namespace Touryo.Infrastructure.Business.Exceptions
{
  /// <summary>システム例外のメッセージID、メッセージに使用する
  /// 文字列定数を定義する定数クラス(ユーザ用)</summary>
  public class MyBusinessSystemExceptionMessage
  {
    /// <summary>
    /// サンプルのシステム例外のメッセージID、メッセージに使用する文字列定数
    /// </summary>
    public static readonly string[] SAMPLE_ERROR
    = new string[] { "MessageID_SampleError", "Message_SampleError" };
  }
}

図 6.1-3 「システム例外」のメッセージ ID・メッセージを定義するクラス

// xxxエラー
throw new BusinessSystemException(
 MyBusinessSystemExceptionMessage.SAMPLE_ERROR[0],
 MyBusinessSystemExceptionMessage.SAMPLE_ERROR[1]);

図 6.1-4 「システム例外」をスロー

メッセージを外部ファイルで管理したい場合は、「メッセージ取得機能」を併用します (詳細は「各機能編」を参照)。

6.2 二重送信防止時のローディング ダイアログ

二重送信防止機能を有効にしている場合に、ポストバック後、指定時間以上レスポンスが無い場合、下記のローディング ダイアログが表示されます。

図 6.2 ローディング ダイアログ

このローディング ダイアログの表示までの待ち時間、UI (見た目) ,etc. を変更する場合は、JavaScript ファイルを直接修正する必要があります。以下に修正箇所を示します。

表 6.2 ローディング ダイアログ表示の変更と、対応する修正箇所

項番 変更点 修正対象のファイル/修正箇所
1 表示までの待ち時間 ~\root\programs\C#\Samples\WebApp_sample\WebForms_Sample\Framework\Js\common.js。Fx_OnSubmit メソッド中の setTimeout メソッドに指定されるパラメタ (ミリ秒)。また Fx_DisplayProgressDialog メソッドを設定しなければ、ローディング ダイアログは表示されなくなる。
2 UI (見た目) ~\root\programs\C#\Samples\WebApp_sample\WebForms_Sample\Framework\Js\common.js。Fx_InitProgressDialog メソッド中で生成される DIV エレメントの各種プロパティ。

6.3 キーイベント抑止機能のカスタマイズ

キーイベント抑止機能は、ie_key_event.js へのリンクにより自動的に有効になります。これには、Enter によるサブミットの抑止、BackSpace による戻る操作の無効化、alt キー + ← / → による戻る操作の無効化、右クリック (コンテキスト メニュー表示) の抑止、ショートカット/ファンクションキーと画面上のボタンのマップ (テンプレート) が実装されています。このうち「右クリック抑止」や「ショートカット/ファンクションキーのマップ」を行う場合は、JavaScript ファイルを直接修正 (カスタマイズ) します。

表 6.3 キーイベント抑止機能の修正箇所

項番 変更点 修正対象のファイル/修正箇所
1 右クリック (コンテキスト メニュー表示) を抑止する ~\root\programs\C#\Samples\WebApp_sample\WebForms_Sample\Framework\Js\ie_key_event.js。「右クリック(コンテキスト メニュー表示)を抑止」とコメントされた部分の下部のコードのコメントアウトを外す。
2 ショートカットや、PF キーと画面上のボタンをマップ ~\root\programs\C#\Samples\WebApp_sample\WebForms_Sample\Framework\Js\ie_key_event.js。コメント部の下部のコード (テンプレート) に実装を追加する(「PF キーに画面上のボタンをマップする実装テンプレート」「独自ショートカット (ctrl + shift + 〇キー) の実装テンプレート」)。

7. P層イベント処理対応コントロール (イベント) の追加

「共通編」で説明した通り、本フレームワークの P 層イベント処理機能は、下記コントロールのイベント (9 つ) に対応しています [10]。

表 7 P層イベント処理機能に対応するコントロール イベント

項番 コントロール イベント
1 ボタン クリック イベント
2 リンクボタン
3 イメージボタン
4 イメージマップ
5 テキストボックス テキスト チェンジド イベント
6 ドロップダウンリスト セレクト インデックス チェンジド イベント
7 リストボックス
8 ラジオボタン チェック チェンジド イベント
9 ラジオボタンリスト セレクト インデックス チェンジド イベント
10 チェックボタンリスト
11 リピータ アイテム コマンド イベント
12 グリッドビュー ロウ コマンド/セレクト インデックス チェンジド/ロウ アップデーティング/ロウ デリーティング イベント
13 グリッドビュー ページ プロパティ チェンジド/アイテム アップデーティング/アイテム デリーティング/アイテム コマンド イベント

しかし、プロジェクトによっては上記より多くのイベントを使用する場合があります。イベントを追加するには、業務フレームワーク (Business) 名前空間の「画面コード親クラス2」に、P 層イベント処理機能の拡張処理を実装します (サンプルの「MyBaseController」クラスを参考にできます。サンプルでは、チェックボタン コントロールのチェック チェンジ イベントに対応させています)。

まず初めに、「画面コード親クラス2」の「ページ ロード処理」から、次のシーケンスで「イベント追加処理」の「MyBaseController」クラスの「addControlEvent」メソッドを呼び出します。

図 7-1 「イベント追加処理」を「画面コード親クラス2」の「ページ ロード処理」から呼び出す

「addControlEvent」メソッドには、「MyCmnFunction」クラスの「GetCtrlAndSetClickEventHandler」メソッドを呼び出す実装が必要になります (最新版では「GetCtrlAndSetClickEventHandler2」メソッドを使用)。以下は、CheckBox コントロールの CheckedChanged イベントを P 層イベント処理機能の対応コントロール イベントに追加する処理の例です。

はじめに「共通 (集約) イベント ハンドラ」が、コントロール イベント毎に必要になります。「BaseController」クラスに存在すれば流用可能ですが、存在しない場合は「MyBaseController」クラスに次のような実装が必要になります。

現在は、CheckedChanged イベントに対応した、集約イベント ハンドラは、BaseController 側に標準実装されている。

#region 集約イベント ハンドラ
/// <summary> CheckedChangedイベントに対応した集約イベント ハンドラ</summary>
protected void Check_CheckedChanged(object sender, System.EventArgs e) {
 // イベント ハンドラの共通引数の作成
 FxEventArgs fxEventArgs = new FxEventArgs(
 ((System.Web.UI.Control)(sender)).ID,
 0, 0, "",
 this.GetMethodName(((System.Web.UI.Control)(sender)).ID,
 FxLiteral.UOC_METHOD_FOOTER_CHECKED_CHANGED));
 // クリック イベント処理の共通メソッド
 this.CMN_Event_Handler(fxEventArgs);
}
#endregion

図 7-2 「共通(集約)イベント ハンドラ」の実装例

ここでは、「イベント処理の共通メソッド」や「イベント処理の UOC メソッド」に渡す「イベント ハンドラの共通引数」を生成し、「画面コード親クラス1」の「イベント処理の共通メソッド」(「BaseController」クラスの「CMN_Event_Handler」メソッド) を呼び出します。以降の処理はフレームワーク側で処理されるため、既存のコントロールのイベントと同様の方法で P 層イベント処理を実装・処理できるようになります。

さらにコントロール イベントを追加する場合、上記のコードを参考にして、処理を実装する。

/// <summary>イベント追加処理</summary>
private void addControlEvent() {
 // CHECK BOX
 MyCmnFunction.GetCtrlAndSetClickEventHandler(
 this, GetConfigParameter.GetConfigValue(MyLiteral.PREFIX_OF_CHECK_BOX),
 new System.EventHandler(this.Check_CheckedChanged), this.ControlHt);
 ・・・
}

図 7-3 「イベント追加処理」の実装例(1)

「GetCtrlAndSetClickEventHandler2」メソッドを使用する場合は、次のような実装になります。

さらにコントロール イベントを追加する場合、「// CHECK BOX」のコードを参考にして、処理を実装する。

/// <summary>イベント追加処理</summary>
private void addControlEvent() {
 // プレフィックス
 string prefix = "";
 // プレフィックスとイベント ハンドラのディクショナリを生成
 Dictionary<string, object> prefixAndEvtHndHt = new Dictionary<string, object>();
 // CHECK BOX
 prefix = GetConfigParameter.GetConfigValue(MyLiteral.PREFIX_OF_CHECK_BOX);
 if (!string.IsNullOrEmpty(prefix)) {
 prefixAndEvtHndHt.Add(prefix, new System.EventHandler(this.Check_CheckedChanged));
 }
 ・・・
 // コントロール検索&イベントハンドラ設定
 MyCmnFunction.GetCtrlAndSetClickEventHandler2(this, prefixAndEvtHndHt, this.ControlHt);
}

図 7-3 「イベント追加処理」の実装例(2)

ここから呼び出される「MyCmnFunction」クラスの「GetCtrlAndSetClickEventHandler」メソッドは、ページ上のコントロールを再帰的に取得し、イベントに対応する「共通 (集約) イベント ハンドラ」に登録します。

さらにコントロール イベントを追加する場合、以下の「if - else if」のコードブロックを参考にして、処理を実装する。

/// <summary>コントロール取得&イベントハンドラ設定</summary>
internal static void GetCtrlAndSetClickEventHandler(
Control ctrl, string prefix, object eventHandler, Hashtable ControlHt) {
  [チェック処理]
  #region コントロール取得&イベントハンドラ設定
  // 省略~
  // イベントハンドラを設定する。
  if (prefix == GetConfigParameter.GetConfigValue(MyLiteral.PREFIX_OF_CHECK_BOX)) {
    // CHECK BOX
    CheckBox checkBox = null;
    try {
      // キャストできる
      checkBox = (CheckBox)ctrl;
    }
    catch (Exception ex) {
      // キャストできない
      throw new FrameworkException(
      FrameworkExceptionMessage.CONTROL_TYPE_ERROR[0],
      String.Format(FrameworkExceptionMessage.CONTROL_TYPE_ERROR[1], prefix, ctrl.GetType().ToString()), ex);
    }
    checkBox.CheckedChanged += (EventHandler)eventHandler;
    // ディクショナリに格納
    // ControlHt.Add(ctrl.ID, ctrl);
    ControlHt[ctrl.ID] = ctrl; // 2009/08/10-この行
  }
  else if
  ・・・
  // 省略~
  #endregion
  [再帰]
}

図 7-4 「イベント追加処理」の実装例(1)

「GetCtrlAndSetClickEventHandler2」メソッドには、次のような実装が必要になります。

さらにコントロール イベントを追加する場合、以下の「if - else if」のコードブロックを参考にして、処理を実装する。

/// <summary>コントロール取得&イベントハンドラ設定</summary>
internal static void GetCtrlAndSetClickEventHandler(
Control ctrl, string prefix, object eventHandler, Hashtable ControlHt) {
  [チェック処理]
  #region コントロール取得&イベントハンドラ設定
  // 省略~
  // イベントハンドラを設定する。
  if (prefix == GetConfigParameter.GetConfigValue(FxLiteral.PREFIX_OF_BUTTON)) {
    // BUTTON
    Button button = null;
    if(ctrl is Button) {
      // キャストできる
      button = (Button)ctrl;
    }
    else {
      // キャストできない
      throw new FrameworkException(
      FrameworkExceptionMessage.CONTROL_TYPE_ERROR[0],
      String.Format(FrameworkExceptionMessage.CONTROL_TYPE_ERROR[1],
      prefix, ctrl.GetType().ToString()));
    }
    button.Click += (EventHandler)eventHandler;
    // ディクショナリに格納
    controlHt[ctrl.ID] = ctrl;
    reak;
  }
  else if
  ・・・
  // 省略~
  #endregion
  [再帰]

図 7-4 「イベント追加処理」の実装例(2)

脚注

  1. app.config ファイルへのリンクを記述する(<appSettings file="app.config">)。
  2. 二重送信の防止機能。
  3. 不正操作防止機能の画面単位の操作履歴の最大数。
  4. log4net の設定ファイルのアペンダ定義例。
  5. 3層アプリケーション(サービス インターフェイス経由)。
  6. サイズ 10MB 毎にローリングし、2 つのバックアップを保持する。
  7. 日付とサイズを合わせたローリングを行う場合は DatePattern 値に注意する。
  8. 競合が多い場合、ログが欠落する可能性がある。
  9. 本番環境では「開発用共通エラー画面」を「本番用共通エラー画面」に置き換える。
  10. 「共通編」の 2.2.4 項も参照。

-以上-

⚠️ **GitHub.com Fallback** ⚠️