特集
Enterprise Library 3.0概説(前編)

自身のセオリーから飛び出した新生EntLib 3.0とは?

アバナード株式会社 市川 龍太(Microsoft MVP − Solutions Architect)
2007/05/22
Page1 Page2 Page3 Page4

EntLib 2.0と3.0の相違点

 それではEntLib 3.0になって従来のApplication Block(EntLibにおける機能の単位)がどのように変わったのかについて、まず見ていくことにしよう。

Logging Application Block

 EntLibを構成する既存のApplication Blockの中でLogging Application Block(以下LoggingAB)は、最も機能の変更が多くなっている。主な変更点は以下のとおりである。

・Rolling Flat File Trace Listener
 Rolling Flat File Trace Listenerは、Configurationコンソール(以下Configコンソール)で設定された任意のしきい値を基にして、ログ・ファイルを自動的にローリングさせる(=ファイル名を任意の規則に従って変更する)ことができるトレース・リスナ(=画面やファイル、イベント・ログなどに実際にログ出力を行う機能)である。

 ログ・ファイルを自動的にローリングさせる機能自体は、以前からRolling Flat Sinkとして存在してはいたのだが、これはコミュニティによって独自に開発された拡張機能であり(Hisham Baz氏によって開発)、Rolling Flat File Trace Listenerとして正式にLoggingABに組み込まれたわけである。

 Rolling Flat File Trace Listenerは、テキスト・ファイルへのログ出力に加えて、以下の機能を備えている。

  • ログ・ファイルが任意のサイズ(単位はKbytes)を超えた場合に、自動的にローリングさせる機能
  • ログ・ファイルが任意の相対時間(単位はYear、Month、Week、Day、Hour、Minute)を経過した場合に、自動的にローリングさせる機能
  • ログ・ファイルの日付書式を任意に設定できる(デフォルトは「yyyy-MM-dd」)

・WCF統合
 Windows Communication Foundation(詳細については、Windows Communication Foundation概説を参照。以下WCF)は、トレース・ソース(System.Dianostics名前空間のTraceSourceクラス)へ直接ログを出力することができる。これらWCFからトレース・ソースへ出力されたログ情報はLoggingABが提供するEntLibLoggingProxyTraceListenerクラスを通して取得することができる。

 EntLibLoggingProxyTraceListenerクラスを利用し、アプリケーション構成ファイルのcategoriesXPathQueries属性にXPathクエリを指定すれば(セミコロンで複数のXPathクエリを記述可能)、XML形式のログ情報から任意の情報を取得することなどが可能になる。以下にその記述例を示す。

<add name="entlibproxysample"
type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EntLibLoggingProxyTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
categoriesXPathQueries="//MessageLogTraceRecord/@Source;//MessageLogTraceRecord/@Source2" namespaces="xmlns:pre='urn:test' xmlns:pre2='urn:test2'"/>
アプリケーション構成ファイルに複数のXPathクエリを指定するサンプル
なお、現状ではConfigコンソールからWCF統合のための構成設定を行うことができないため、任意のエディタなどで手動で設定する必要がある。

・ReflectedPropertyTokenクラス
 LoggingABにはログ情報として出力される各項目(これをトークンと呼ぶ)の書式を整えるために、いくつかのTokenクラス(KeyValueToken、TimeStampToken、DictionaryToken)が用意されているが、EntLib 3.0版からは、新しくReflectedPropertyTokenクラスが追加された。ReflectedPropertyTokenクラスの詳細を解説する前に、まずログ・ファイルを出力させるための以下のサンプル・コードを見てもらいたい。

LogEntry entry = new LogEntry();
entry.Title = "Hello EntLib";
entry.Message = "Sample Message";
entry.Priority = 1;
Logger.Write(entry);
LogEntryクラスを使ったログ出力のサンプル・コード

 LoggerクラスのWriteメソッドに渡されたLogEntryクラス内の情報は、最終的にFormatterクラスに送られ、LogEntryクラスのプロパティを介して出力されることになる。

 しかし既存のFormatterクラス(TextFormatterクラスなど)は、LogEntryクラスが公開するプロパティから取得できる値のみを出力するため、例えば既存のLogEntryクラスに新しくプロパティを追加した場合や、LogEntryクラスを継承した派生クラスに新しく追加されたプロパティの値などは出力することができなかった。

 そこでEntLib 3.0から用意されたのがReflectedPropertyTokenである。ReflectedPropertyTokenで、LogEntry(またはその派生クラス)と出力させたいプロパティ名を渡すことで、任意のプロパティの値を出力させることができる。

LogEntry entry = new LogEntry();
entry.Title = "Hello EntLib";
entry.Message = "Sample Message";
entry.Priority = 1;
Logger.Write(entry, "SampleProperty");
ReflectedPropertyTokenを使ってログ出力させるためのサンプル・コード

 これは文字どおりリフレクションを使ってプロパティ値を取得しているのだが、実際の利用に当たってReflectedPropertyTokenを特に意識する必要はなく、Configコンソールでプロパティ名を設定するだけでReflectedPropertyTokenの機能を利用することができるようになっている。

 以下はLogEntryクラスに新しくSamplePropertyプロパティを追加した場合のConfigコンソールの設定例である。

ReflectedPropertyTokenの設定例
赤枠のSamplePropertyの個所を出力させたいプロパティ名に変更する。

・ローカル時間サポート
 実は既存のLoggingABを使用してログを出力すると、ファイルのタイムスタンプがUTC(Coordinated Universal Time:協定世界時)時間になって出力されていた。

 EntLib 3.0版からはUTCでもローカル・タイムでも利用者の好きな方を選択して、出力できるようになっている。

ローカル・タイムを使ってログを出力させるための設定例
デフォルトはUTCに設定されているため、赤枠のTimestampプロパティを{timestamp(local)}に変更するとよい。
ほかにも以下の設定が可能である。

・Timestamp local: {timestamp(local)} ⇒ 「1/22/2006 6:24:18 PM」と表示される
・Timestamp F: {timestamp(F)} ⇒ 「Monday, January 23, 2006 2:24:18 AM」と表示される
・Timestamp local:F {timestamp(local:F)} ⇒ 「Sunday, January 22, 2006 6:24:18 PM」と表示される

Data Access Application Block

・TransactionScope対応
 EntLib 3.0版のData Access Application Block(以下DAAB)は、TransactionScopeクラス使用時に適切に動作するよう変更された。以下のDAABとTransactionScopeクラスを使用したサンプル・コードを見てほしい。

using (TransactionScope scope = new TransactionScope())
{
    Database db = DatabaseFactory.CreateDatabase(“Connection1”);
    db.ExecuteNonQuery(/* 任意のクエリ1 */);
    db.ExecuteNonQuery(/* 任意のクエリ2 */);

    scope.Complete();
}
TransactionScope内でDAABを使用するサンプル・コード

 従来のDAABでこのサンプル・コードを実行すると、DAABはExecuteNonQueryメソッドが実行されるたびに接続の開閉を行うため、TransactionScopeオブジェクトは自動的にローカル・トランザクションから、(よりパフォーマンスが劣る)分散トランザクションへ昇格させてしまっていた。

 しかしEntLib 3.0版では、TransactionScopeオブジェクトがアクティブの場合は、再利用のためにコネクションがDAAB内でキャッシュされるようになったため、結果として分散トランザクションへ昇格されないようになっているのである。

・SQL Server Compact Editionサポート
 EntLib 3.0から組み込み型のSQL ServerであるSQL Server Compact Editionに対応するようになった。DAABからSQL Server Compact Editionへアクセスする場合は、SqlCeDatabaseクラスを利用することになる。ちなみにSQL Server Compact Editionの仕様上、ストアド・プロシージャを利用できないことには注意する必要がある。

 以下はDAABからSQL Server Compact Editionを利用する場合のサンプル・コードだ。

SqlCeDatabase database =
  (SqlCeDatabase)DatabaseFactory.CreateDatabase("Connection String1");
string query = "INSERT INTO [Genres] (Title) VALUES (@Title)";
DbParameter parameter =
  database.CreateParameter("Title", DbType.String, 50, "Action");
database.ExecuteNonQuerySql(insertSql, parameter);

SqlCeConnectionPool.CloseSharedConnections();
DAABからSQL Server Compact Editionを利用するためのサンプル・コード

・Database.UpdateDatabaseオーバーロード追加
 DatabaseクラスのUpdateDatabaseメソッドに、1回のバッチで実行可能なコマンド数を指定できるパラメータ(updateBatchSize)を持つオーバーロードが追加された。ここでいうバッチ処理とは、データセットおよびデータテーブルの変更内容を、データアダプタを介してデータベースに反映させるときに、CRUD(Create、Read、Update、Delete)操作のコマンドを1つずつ送信していくのではなく、任意の数のコマンドをグループ化して、まとめて送信することにより、データベースへのラウンドトリップの回数を減少させ、パフォーマンスを向上させる機能のことである。この機能はSystem.Data.SqlClientデータプロバイダやSystem.Data.OracleClientデータプロバイダでサポートされている。


 INDEX
  [特集]Enterprise Library 3.0概説(前編)
  自身のセオリーから飛び出した新生EntLib 3.0とは?
    1.EntLib 3.0とは?
  2.EntLib 2.0と3.0の相違点
    3.EntLib 3.0から新しく追加された機能(1)
    4.EntLib 3.0から新しく追加された機能(2)
 
  [特集]Enterprise Library 3.0概説(後編)
  EntLib 3.0の注目の新機能を実装サンプルで見てみよう
    1.Validation Application Block(VAB)
    2.VABのSelf Validation機能/ASP.NET統合
    3.Policy Injection Application Block(PIAB)
    4.Application Block Software Factory(ABSF)
 
インデックス・ページヘ  「Enterprise Library」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間