かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Enterprise Library入門 その1 「はじめに」

ここ最近、Enterprise Libraryのドキュメントと睨めっこしてたので覚えたことの復習もかねて書いてみようと思います。流行ってるの?と言われるとNO!!ですけど、結構悪くないと思いますよと最初につぶやいておく。

Enterprise Libraryとは

Enterprise Libraryとは、Microsoftのpattern & practiceチームが開発しているエンタープライズアプリケーションの開発のベストプラクティスを集めたライブラリです。このライブラリの特徴は、UnityというDIコンテナを軸にしてEnterprise Libraryが提供している機能(Application Blockと呼ばれる)を組み合わせて使用できるという点です。そのためEnterprise Libraryが提供している機能のうちのごく一部を使うことも、全機能使うことも問題なく出来ます。
また、Unityを使用せずに自分のプログラムから直接使用することも可能なように作成されています。ここでは、UnityをDIコンテナとして使用して各Application Blockの機能を利用する方法を説明します。

Application Blockとは

Application Blockとは、Enterprise Libraryを構成するある程度まとまった機能のことです。Application Block単体でも動作するように作成されていますが、一部のApplication Blockは他のApplication Blockに依存しているものもあります。以下にEnterprise LibraryのApplication Blockを示します。

  • Caching Application Block
    • アプリケーション内でキャッシュ機能を提供します。
  • Cryptography Application Block
    • データの暗号化・複合とハッシュを生成する機能を提供します。
  • Data Access Application Block
    • データベースへのアクセス機能を提供します。
  • Exception Handling Application Block
    • 例外処理の機能を提供します。
  • Logging Application Block
    • ログ出力機能を提供します。
  • Policy Injection Application Block
    • 機能横断的なPolicyをアプリケーションに適用する機能を提供します。
  • Security Application Block
    • 承認の規則(操作の許可や拒否など)を構成・管理する機能を提供します。
  • Validation Application Block
    • 値の妥当性検証の機能を提供します。

説明からもわかるように、Application Blockは特別な機能を提供しているわけではありません。一般的なアプリケーションであれば実装している機能になります。これらの機能の使い方を理解し適切に選択して使用できるようになると、アプリケーションを効率よく開発することが出来るようになると思います。(もしくは、どのような機能セットを提供しているのか、どのような点に留意して作成されているのかという参考にすることも出来ます)

Enterprise Libraryの構成

Enterprise Libraryの基本的な使い方の流れは以下のようになります。

  1. Enterprise Libraryで使用するApplication Blockを選択します。
  2. 関連するアセンブリを参照に追加します。
  3. Enterprise Libraryの構成を行います。以下のような方法があります。
    1. 構成ファイル(app.configやweb.config)を使用する方法
    2. 任意のファイルを使用する方法
    3. コードで構成する方法
  4. Enterprise Libraryのコンテナを初期化します。
  5. Enterprise Libraryのコンテナから必要な機能を取り出して使用します。

Enterprise Libraryには下図のような構成ツールが付属していて、これによりグラフィカルにapp.configやweb.configを設定することが出来ます。ここで設定した内容によって各アプリケーションブロックの機能をカスタマイズすることが出来ます。

Enterprise Libraryでは、app.configなどの構成ファイル以外にもアプリケーションから構成情報を組み立てるFluent APIも提供しています。本書では、サンプルプログラムとしての見通しを優先するためFluent APIによる構成情報の組み立てを優先して使用します。

Hello world

ここでは、Loggin Application Blockを使ってHello worldというログをファイルに出力する方法を通じて基本的なEnterprise Libraryの使い方の流れについて説明します。
HelloWorldという名前でコンソールアプリケーションを作成します。そしてNuGet Package Managerから「EnterpriseLibrary Logging」で検索をして「Enterprise Library 5.0 – Logging Application Block」をプロジェクトに追加します。

プロジェクトに参照が追加されたら、続けて参照の追加からSystem.Configurationを追加します。以上でプロジェクトの参照の設定は終了です。(昔はこの参照設定を整えるだけで一仕事だったのですが、いい時代になったものです…)Program.csを開いて下記のように編集します。

1.	using System.Diagnostics;
2.	using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
3.	using Microsoft.Practices.EnterpriseLibrary.Logging;
4.	
5.	namespace HelloWorld
6.	{
7.	    class Program
8.	    {
9.	        static void Main(string[] args)
10.	        {
11.	            // 構成情報を組み立てる
12.	            var builder = new ConfigurationSourceBuilder();
13.	            builder.ConfigureLogging()
14.	                .SpecialSources
15.	                .AllEventsCategory
16.	                    .SendTo
17.	                    .FlatFile("FlatFileListener")
18.	                    .FormatWith(
19.	                        new FormatterBuilder()
20.	                            .TextFormatterNamed("TextFormatter")
21.	                            .UsingTemplate("{timestamp(local:yyyy/MM/dd HH:mm:ss.fff)}: {message}"))
22.	                    .ToFile("output.txt");
23.	
24.	            // 組み立てた構成情報からConfigurationSourceを作成
25.	            var config = new DictionaryConfigurationSource();
26.	            builder.UpdateConfigurationWithReplace(config);
27.	
28.	            // 構成情報を元にEnterpriseLibraryのコンテナの初期化
29.	            EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(config);
30.	
31.	            // EnterpriseLibraryのコンテナからLogging Application BlockのLog書き込み部品を取得
32.	            var logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
33.	            // ログに出力する
34.	            logger.Write("Hello world");
35.	
36.	            // ログを表示
37.	            Process.Start("output.txt");
38.	        }
39.	    }
40.	}

細かいAPIの利用方法は置いておいてコード全体の流れが、構成→コンテナの初期化→コンテナから部品の取り出し→使用という流れになっていることが確認できると思います。構成とコンテナの初期化をアプリケーションのエントリーポイントなどの初期化処理で行い、残りの部分で適時コンテナから必要な部品を取り出して使用するという流れになります。(もしくは、Dependency Injectionしてもらう)
このプログラムの実行結果は以下のようになります。ログが出力され、ログファイルが開かれます。


次回から、各Application Blockの使用方法を確認していきます。