特集
.NET開発者のためのDI&AOP入門(前編)

Seasar.NETでDIを始めよう

株式会社アイビス 杉本 和也
2007/12/10
Page1 Page2 Page3 Page4

1-5. S2Container.NET(Quill)を活用するプロジェクトの作成

 本稿では、開発環境としてMicrosoft Visual Studio 2005(以下VS 2005)を、言語はC#を使用する。

 新しいプロジェクトで利用するテンプレートとしては[Windowsアプリケーション]を選択し、本稿では「C:\VS2005」ディレクトリの配下に「QuillSample」というソリューション・ディレクトリを作成する。

プロジェクトの新規作成
[ソリューションのディレクトリを作成]にチェックを入れておく。

 次にQuillを利用するために必要なアセンブリを1カ所に集めておく。ソリューション・ディレクトリの下に「lib」ディレクトリ(C:\VS2005\QuillSample\lib)を作成して、S2Container.NETフォルダの「s2container.net\build\net2.0」ディレクトリ内にある以下のファイルをコピーする(それぞれの.dllファイルの意味は前掲の表を参照してほしい)。

  • Seasar.dll
  • Seasar.DynamicProxy.dll
  • Seasar.Quill.dll

 また、Seasar.dllとSeasar.Quill.dllには日本語表示用のサテライト・アセンブリ(=*.resources.dllファイル)が用意されているので、「s2container.net\build\net2.0\ja-JP」ディレクトリ内からこれらもコピーする。

  • Seasar.resources.dll
  • Seasar.Quill.resources.dll

 なお、これらのファイルは、コピー先でも(「C:\VS2005\QuillSample\lib」の中に)「ja-JP」ディレクトリを作成して、その中にコピーする必要がある。

 最後に「s2container.net\lib\net2.0」ディレクトリ内にある以下のファイルをコピーする。

  • Castle.DynamicProxy.dll
  • log4net.dll

 なお、Castle.DynamicProxy.dllはSeasar.DynamicProxy.dllによるAOPの実現で利用されるフレームワーク(Castle DynamicProxy)で、log4net.dllはログ出力機能を提供するフレームワーク(Apache log4net)である。

 以上のすべてをコピーし終わると、次の画面のようなフォルダ内容になる。

Quillを利用するために必要なアセンブリを集めた「lib」フォルダの内容

 必要なアセンブリを1個所に集めたところで、QuillSampleプロジェクトに、今回作成するプログラムで使用するアセンブリへの参照を追加する。参照の追加は、次の画面のように、[ソリューション エクスプローラ]で「QuillSample」プロジェクトを右クリックして、表示されるコンテキスト・メニューの[参照の追加]から行う。

[ソリューション エクスプローラ]でのアセンブリへの参照の追加

 [参照の追加]ウィンドウが開いたら、次の画面のように、[参照]タブで「C:\VS2005\QuillSample\lib」ディレクトリの「Seasar.dll」と「Seasar.Quill.dll」を選択して[OK]ボタンをクリックする。

[参照の追加]ダイアログでのアセンブリへの参照の追加

 以上でS2Container.NETのQuillを使用する場合のプロジェクト設定は完了である。

2. ソース・コードで理解するDI

2-1. ソース・コードで考える「DIとは何か?」

 繰り返しになるが、DIとは「Dependency Injection」の略で「依存注入」という意味である。だがこれだけではよく分からない。そこで以下では、ソース・コードを交えて、DIを説明していこう。

 それでは例えば、EmployeeLogicというクラスがEmloyeeDaoというクラスを使用する場合を考えてみよう。

(1)IEmployeeDaoインターフェイスを作成し、EmloyeeDaoクラスはそのIEmployeeDaoインターフェイスを実装する。

(2)そして、EmployeeLogicクラスは、(EmloyeeDaoクラスではなく)IEmployeeDaoインターフェイスを介して、EmloyeeDaoクラスの機能を利用する。

 このようにクラス設計することで、EmployeeLogicクラスはEmloyeeDaoクラスに依存しなくなる。例えば、EmployeeLogicクラスのソース・コードを一切変更することなく、EmloyeeDaoクラスから、別のIEmployeeDaoインターフェイスを実装するクラス(=IEmployeeDao実装クラス)に切り替えられるようになる(以下、「インターフェイスを実装したクラス」を「実装クラス」と表記)。

 次のEmployeeLogicクラスとIEmployeeDaoインターフェイスのコードを見てほしい。EmployeeLogicクラスは、自身が持つ「EmpDao」というIEmployeeDao型のフィールドに、IEmployeeDao実装クラスのインスタンスをセットして利用するようになっており、EmployeeLogicクラス中にEmployeeDaoクラスは一切出てこないことが分かる。

public class EmployeeLogic
{
  public IEmployeeDao EmpDao;

  public string GetEmpNameWithTitle(int empNo)
  {
    string empName = EmpDao.GetEmpName(empNo) + "さん";
    return empName;
  }
}

public interface IEmployeeDao
{
  string GetEmpName(int empNo);
}
EmployeeLogicクラスとIEmployeeDaoインターフェイスのコード

 しかしここで問題である。EmpDaoフィールドにはEmployeeDaoクラスのインスタンスをどこかでセットしなくてはいけない。つまり、どこかのコードでEmployeeDaoクラスのインスタンス化を行う必要があるのだが、「その部分は、結局どうしても実装クラス(EmployeeDaoクラス)に依存してしまう」という問題が発生する。

 では、そのようなインスタンス化の部分(=依存部分)を肩代わりし、外部からEmpDaoフィールドにインスタンスをセット(=注入)してくれる仕組みがあればどうだろうか。このような振る舞いは「依存注入」つまり「DI」と表現され、この仕組みを提供するのがS2ContainerやQuillのようなDIコンテナなのである。DIコンテナは、実装クラスのインスタンスを管理してDIを提供するフレームワークである。

 それではQuillを使ったDIを紹介していく。


 INDEX
  [特集].NET開発者のためのDI&AOP入門
  Seasar.NETでDIを始めよう
    1.DI&AOP開発環境の準備
  2.DIとAOPを理解するためのサンプルの作成
    3.ソース・コードで理解するDI
    4.DIが役立つ場面
 
  コードで簡単に分かる“AOP”
    1.ソース・コードで理解するAOP
    2.AOPの実践


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

本日 月間