特集
Enterprise Library 3.0概説(後編)

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

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

Application Block Software Factory(ABSF)

 ABSFとは、カスタムApplication Blockの作成をある程度自動化してくれるガイダンス・パッケージである。ABSFやガイダンス・パッケージの詳細については「Enterprise Library 3.0が見せる共通ライブラリの未来形」を参考にしてもらうとして、ここでは実際にABSFを使ってカスタムのApplication Blockを作成する手順について解説する。

 ABSFはEntLib 3.0をインストールするだけではまだ使用できず、VS 2005上でABSFを使用できるようにしなければならない。これにはまず、(April 2007版のEntLib 3.0をインストールしている場合は)[スタート]メニューから[プログラム]−[Microsoft patterns & practices]−[Enterprise Library 3.0 - April 2007]−[Enterprise Library Source Code Installer]を選択してABSFのソース・コードをインストールする。次に「<インストール・ドライブ>:\EntLib3Src\Application Block Software Factory」フォルダにインストールされたBlockFactory.slnをVS 2005で開き、ソリューションをビルドする。

 これでABSF用のガイダンス・パッケージが作成されるが、さらにこのガイダンス・パッケージをVS 2005に登録する必要がある。これを行うには、まずVS 2005のIDEのメニュー・バーから[ツール]−[Guidance Package Manager]を選択して起動する。そして[Enable / Disable Package]ボタンを押下して表示されるダイアログから[Guidance Package Development]にチェックを入れて[OK]ボタンを押下し、そのまま[Execute]ボタンを押下すれば登録の準備が整ったことになる。

 最後にソリューション・エクスプローラ上のBlockFactoryプロジェクトを右クリックして表示されるコンテキスト・メニューから[Register Guidance Package]を選択すれば登録は完了である(なお1度登録してしまえば、以降は同メニューから[Quick Register]を選択すればよい)。

 それではいよいよカスタムApplication Blockを作成していくとしよう。ここで作成するApplication BlockはConfigurationコンソールで設定した任意の値をコンソール画面に表示するだけの簡単な機能を提供する。

ランタイム・コンポーネントを作成する

 Application Blockは基本的にランタイム・コンポーネントとデザインタイム・コンポーネントの2つのコンポーネントによって構成され、ABSFを使用する場合はランタイム・コンポーネントから作成する必要がある。ここではまず、これら2つのコンポーネントのためのプロジェクトを作成する。

 これには、VS 2005のメニュー・バーから[ファイル]−[新規作成]−[プロジェクト]を選択する。表示されるダイアログの[プロジェクトの種類]ツリーには新しく「Guidance Packages」ノードが追加されており、さらに下位に「Custom Application Block Software」ノードがある。これを選択すると、右ペインにABSF用のテンプレートが表示される。

VS 2005に登録されたABSF用テンプレートの一覧
左のツリーから[Guidance Packages]−[Custom Application Block Software]を選択して、右から「Application Block (C#) No Tests」を選択する。

 その中から今回は「Application Block (C#) No Tests」を選択し、続いて表示されるダイアログで[完了]ボタンを押下すれば、次の画面のようにデザインタイム・コンポーネントとランタイム・コンポーネントのひな型がソリューションに追加される。

カスタムApplication Blockのひな型が追加されたソリューション
ランタイム・コンポーネント(「MyNewApplicationBlock1」プロジェクト)に加えて、デザインタイム・コンポーネント(「MyNewApplicationBlock1.Configuration.Design」プロジェクト)のひな型が追加されている。
  デザインタイム・コンポーネント・プロジェクト。
  ランタイム・コンポーネント・プロジェクト。

 それではランタイム・コンポーネントを実装していこう。

 最初にMyNewApplicationBlock1プロジェクトを右クリックし、表示されるコンテキスト・メニューから[Application Block Software Factory]−[New Provider Factory and Base]を選択するとダイアログが表示されるので、[Provider Name]に「SampleProviderBase」を、[Provider Type]に「There will be several implementations of this provider type」を設定し、[完了]ボタンを押下する。これにより、プロジェクトにISampleProviderBase.cs(インターフェイス)やSampleProviderBase.csファイル(インターフェイスを実装したクラス)が登録される。

 続いて、ISampleProviderBase.csファイルやSampleProviderBase.csファイルに以下のコード(赤い部分)を追加していく。

[ConfigurationNameMapper(typeof(SampleProviderBaseDataRetriever))]
[CustomFactory(typeof(SampleProviderBaseCustomFactory))]
public interface ISampleProviderBase
{
  string SampleProperty { get; }
}
ISampleProviderBase.csファイル(インターフェイス)に追加するコード
赤字が追加部分)

public abstract class SampleProviderBase : ISampleProviderBase
{
  public abstract string SampleProperty { get; }
}
SampleProviderBase.csファイル(クラス)に追加するコード
赤字が追加部分)

 次にMyNewApplicationBlock1プロジェクトを右クリックしてコンテキスト・メニューから[Application Block Software Factory]−[New Provider (Typed)]を選択し、表示されるダイアログの[Name]に「SampleProvider」を、[Provider Interface]に「ISampleProviderBase」を設定し、[完了]ボタンを押下する。これによりSampleProviderData.csファイルがプロジェクトに追加される。

 続いてこのSampleProviderData.csファイルに以下のプロパティを追加する。

private const string PropertyPropertyName = "SampleProperty";

[ConfigurationProperty(PropertyPropertyName)]
public string Property
{
  get { return (string)this[PropertyPropertyName]; }
  set { this[PropertyPropertyName] = value; }
}
SampleProviderData.csファイルに追加するコード

 ここで追加したコードは、Configurationコンソールから構成ファイルに出力されたSampleProperty属性の値を保持するプロパティである。

 これでプロジェクトをビルドすれば、ランタイム・コンポーネントの作成は終了である。次にデザインタイム・コンポーネントを作成する。

デザインタイム・コンポーネントを作成する

 MyNewApplicationBlock1.Configuration.Designプロジェクトを右クリックしてコンテキスト・メニューから[Application Block Software Factory]−[Create Design-Time Base Provider Node]を選択し、表示されるダイアログの[Node Name]に「SampleProviderNodeBase」を、[Runtime Configuration Type]に「SampleProviderData」を設定し、[完了]ボタンを押下する。

 この段階でMyNewApplicationBlock1.Configuration.Designプロジェクトをビルドするとエラーが発生するため、そのエラーになった個所(「SampleProviderProviders」というクラス名)をSampleProviderBaseProvidersに置き換え、もう一度ビルドを実行すればデザインタイム・コンポーネントは完成である。

カスタムApplication Blockを使用してみる

 カスタムApplication Blockを構成する2つのコンポーネントが出来たので、続いては実際にこれを使用してみる。

 まず、VS 2005でカスタムApplication Blockの構成設定ができるように、ランタイム・コンポーネント(サンプルではMyNewApplicationBlock1.dll)とデザインタイム・コンポーネント(サンプルではMyNewApplicationBlock1.Configuration.Design.dll)を、「<インストール・ドライブ>:\Program Files\Microsoft Enterprise Library 3.0 - April 2007\Bin」フォルダの直下にコピーする。

 次に、カスタムApplication Blockを使用するコンソール・アプリケーションを新規に作成し、次の画面のようにConfigurationエディタを使ってカスタムApplication Blockの構成設定を行う。

カスタムApplication Blockの構成設定
SampleProviderNodeBaseノードのプロパティ(Property)に「Hello EntLib」を設定する。

 これでアプリケーション構成ファイルに設定を保存すれば、カスタムApplication Blockを使用する準備はすべて整ったことになる。

 後は以下のサンプル・プログラムを実行すれば、コンソール画面に“Hello EntLib”が表示される。

using System;
using System.Collections.Generic;
using System.Text;
using MyNewApplicationBlock1;

namespace MyNewApplicationBlockDriver
{
  class Program
  {
    static void Main(string[] args)
    {
      ISampleProviderBase provider =
        SampleProviderBaseFactory.CreateSampleProviderBase(
          "SampleProviderNodeBase");
      Console.WriteLine(provider.SampleProperty);
    }
  }
}
カスタムApplication Blockを使用するサンプル・プログラム
以下のアセンブリへの参照設定を追加する必要がある。
・MyNewApplicationBlock1.dll

 ABSFはカスタムApplication Blockの作成以外にも、既存のApplication Block用のカスタム・プロバイダを作成することもできるため、EntLibが標準で提供する機能を拡張したい場合などでも利用するとよいだろう。

 今回紹介したVABやPIABは従来のApplication Blockと比べて随分と大掛かりであることがご理解いただけただろう。これらの新しいApplication Blockをアプリケーションの基盤部品として利用する場合は、アプリケーションの実装そのものにある程度の制約を加えることになる。これはEntLibがアプリケーションの“一共通部品”という位置付けから、ある程度フレームワークとしての側面を持ち合わせたといえるだろう。

 ちなみに、初代EntLibのベースになったACA.NET(アバナードが提供するフレームワーク)は、以前から同様の機能を有しているが、ACA.NETではこれらはロギングや例外処理のようなコア機能とは別にValidation FrameworkおよびAOP Frameworkとして位置付けられている。

 最後に余談となるが、前編で少し紹介した「Application Architecture for .NET」(以下、AAfN)だが、作成された当時の状況から.NETの周辺状況も随分と変わったこともあり、実は今度新しく作り直されるとのこと。その新AAfNでは、EntLibやSoftware Factoryなども考慮されるということなので、マイクロソフトのpatterns & practicesチームがEntLibをどのように新AAfNに取り入れてくるか非常に楽しみである。End of Article

 

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

本日 月間