特集
Enterprise Library 3.0概説(後編)

EntLib 3.0の注目の新機能を実装サンプルで見てみよう

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

Policy Injection Application Block(PIAB)

 PIABが提供する機能を簡単にいえば、アプリケーション横断的な共通機能(Crosscutting Concern:横断的関心事)を、アプリケーション本来の機能(Core Concern)から分離し、外部から注入するための機能ということになる。

 例えば監査などの目的で、あるメソッドを呼び出したときに、どのようなパラメータが渡されたのかをログに出力したい場合があるだろう。これを実現するためにログを取得したいすべてのメソッドにログ出力コードを書いていくことは、メソッドの本来の機能には何も関係のないコードを入り込ませることにつながり、コードの可読性を低下させてしまうことになる。これは保守の観点からもあまり好ましいことではないだろう。

 ここでPIABを使用すれば、メソッドにログ出力という本来の機能と無関係なコードを記述することなく、ログを出力することが可能になる。以下のサンプル・プログラムを見てもらいたい。

public class Customer : System.MarshalByRefObject
{
  public string GetMessage(string name)
  {
    string message = string.Empty;
    try
    {
      if (string.IsNullOrEmpty(name))
        new ArgumentException("パラメータが不正です");
      message = "Hello " + name;
    }
    catch (ApplicationException ex)
    {
      ExceptionPolicy.HandleException(ex, "Exception Policy");
    }
    return message;
  }
}

static void Main(string[] args)
{
  Customer customer = PolicyInjection.Create<Customer>();
  string message = customer.GetMessage("EntLib");
  Console.WriteLine(message);
}
PIABを使用したサンプル・プログラム

 GetMessageメソッドは、渡されたパラメータに“Hello ”という文字列を連結して返すだけの簡単な処理を行うメソッドだが、このメソッドの中にはログを出力するようなコードは一切含まれていないことが分かるだろう。

 次にConfigurationエディタを使って構成ファイルの設定を行う。

VS 2005からのPIABの構成設定

 「Policy Injection Application Block」−「Policies」−「Policy」ノードの配下を見てほしい。

 ここで「Matching Rules」−「Method Signature Matching Rule」ノードを選択したときにプロパティ・ウィンドウに表示される項目の中で、MatchプロパティにはPolicyを注入したいメソッド名を設定し、メソッドがパラメータを持っている場合は、ParameterTypesプロパティにパラメータ名とパラメータの型を設定する(詳しくは次の画面を参照)。

 後は「Handlers」ノードに、注入したいHandler(サンプルでは「Logging Handler」と「Exception Handling Handler」)を追加し、同時に追加される各Application Blockノード(サンプルでは「Logging Application Block」と「Exception Handling Application Block」)で個別の設定を行えばよい。このサンプルの構成設定ではtrace.logという名前でログ・ファイルを出力するようにLogging Application Blockを設定している。

パラメータの設定画面
・Nameプロパティにはパラメータ名を設定する
・Typeプロパティにはパラメータの型を設定する(ただしCTS型:共通型システムの型を指定する必要があることに注意)

 以上の設定後にGetMessageメソッドを呼び出せば、trace.logファイルにログ情報が出力されるのである。なお、このログ・ファイルには出力された日付やパラメータ値などのほかに、任意のメッセージも出力することが可能である。

PIABのメカニズム

 先ほどのサンプル・プログラムでは、CustomerクラスがMarshalByRefObjectクラスを継承していることに気付かれただろうか。MarshalByRefObjectクラスは、.NETリモート処理(=.NET Remoting)などの分散処理においてアプリケーション・ドメインの境界を越えて、任意のオブジェクトの処理を実行させる(つまりマーシャリングする)際に継承する基本クラスである。

 オブジェクトがマーシャリングされると、ランタイムによって透過プロキシが作成され、その中でオブジェクトの処理が実行(Invoke)されるわけだが、PIABはこの透過プロキシ内部に構成ファイルで定義された各Handlerを登録していくことで、結果としてログ出力などの処理を注入しているのである。

 この仕組みをまとめたのが次の図である。

PIABのHandler登録メカニズム

 最後にPIABが標準で提供しているHandlerの一覧を以下に示す。

Handler名 機能概要
Logging Handler ログを出力する
Caching Handler メソッドからの戻り値をキャッシュする
Exception Handler 例外をハンドリングする
Validation Handler パラメータの検証を行う
PIABに標準で用意されているHandler一覧
 

 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 記事ランキング

本日 月間