Enterprice Library 4.1も出たということで、触ってみてる。
まだ、LoggingとUnityくらいしか触れてない。
次は、UnityのInterceptionとかぶってるような気がするPolicy Injection Application Blockにチャレンジしてみる。
こいつは、説明を見る感じだとAOPみたいなことを実現するものらしい。裏側ではProxyクラスを作って、処理の呼び出しの際に間に処理を挟みこむといった感じになってるようだ。
とりあえず、入門用としてメソッドの呼び出しの前後にログ出力を挟み込むようなサンプルを作ってみようとおもう 。
プロジェクト作成
PIABSampleAppという名前でコンソールアプリケーションを作成する。そこに、以下の4つの参照を追加する。
- Enterprise Library Shared Library
- Enterprise Library Policy Injection Application Block
- Enterprise Library Logging Application Block
- Enterprise Library Handlers for Policy Injection Application Block
次に、処理を挟み込まれるターゲットのクラスを作成する。複雑なものにしてもしょうがないのでシンプルな感じにしてみた。
public class Target : MarshalByRefObject
{
public void Greet()
{
Console.WriteLine("Target.Greet Called.");
}
}
PIABで処理を挟み込むクラスは、とりあえずMarshalByRefObjectを継承して作るらしい。
ほかにもインターフェースを実装するとかあるみたいだけど、とりあえず一番無難そうなMarshalByRefObjectにしてみたよ。
次にMainを書いていく。Mainでは、PolicyInjectionというクラスを使ってTargetクラスのインスタンスを作ってGreetを呼び出している。
class Program
{
static void Main(string[] args)
{
// Targetクラスのインスタンスを作成して
var target = PolicyInjection.Create<Target>();
// 処理を呼び出す
target.Greet();
}
}
これが基本形みたい。実行結果は、まだ何も設定してないので「Target.Greet Called.」が表示されるだけ。
ここにプログラムをいじらずに処理を足しこんでみようと思う。
まず、ログ出力をするのでLogging Application Blockの構成を行う。前やったのを参考に構成ファイルをぽちぽち組み立てる。
今回は、超シンプルにコンソールにログを吐くだけの構成にした。そのためSystem.Diagnostics TraceListenerを作って、TypeにSystem.Diagnostics.ConsoleTraceListenerを設定した。
そして、All Eventsに、そのTraceListenerを追加する。
これで、すべてのログがコンソールに出るっていう寸法だ。確認のためMainを下のようにいじって実行結果を確認してみる。
class Program
{
static void Main(string[] args)
{
// Targetクラスのインスタンスを作成して
var target = PolicyInjection.Create<Target>();
// 処理を呼び出す
target.Greet();
// Logging Application Blockのテスト
Logger.Write("Hello world");
}
}
実行結果
Target.Greet Called.
All Events Information: 1 : Timestamp: 2008/11/03 14:46:50
Message: Hello world
Category: General
Priority: -1
EventId: 1
Severity: Information
Title:
Machine: KAZUKI-PC
App Domain: PIABSampleApp.exe
ProcessId: 4152
Process Name: C:\Users\Kazuki\Documents\Visual Studio 2008\Projects\PIABSampleAp
p\PIABSampleApp\bin\Debug\PIABSampleApp.exe
Thread Name:
Win32 ThreadId:2400
Extended Properties:
Logging Application Blockの構成が正しいのがわかったので、テスト用に追加したコードは消しておく。
次に本命のPolicy Injection Application Blockの構成に入る。
Policy Injection Application Blockのセクションを追加。
Policyを追加
MatchingRuleを追加。今回は、特定の型に対して処理を挟み込みたいのでType Matching Ruleを使う。
Type Matching RuleのMatchesプロパティにPIABSampleApp.Targetを追加する。
HandlersにLogging handlerを追加する。

Logging HandlerのAfterMessageとBeforeMessageに適当な文字列を設定する。
これで、App.configを保存してアプリケーションを再実行するとログがメソッド呼び出しの前後に入っているのがわかると思う。実行結果は、長いので省略して下に示します。
実行結果
All Events Information: 0 : Timestamp: 2008/11/03 14:54:21
Message: 前処理
// 省略
Target.Greet Called.
All Events Information: 0 : Timestamp: 2008/11/03 14:54:22
Message: 後処理
// 省略
こんな感じに、構成ファイルから任意のクラスのメソッドの呼び出しの前後に処理を挟み込むことが出来る。
MatchingRuleを変えることで、処理を挟み込む対象を変えたり、Handlerを変えることで挟み込む処理を変えることが出来るようになっている。