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

Seasar.NETでDIを始めよう

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

2-3. DIが役立つ場面

 その例の1つとして単体テストが挙げられる。

 単体テスト時には、実際にデータベースを書き換えたくないといった理由により実装クラスをモック・クラス(=疑似的な動作を行うクラス)に置き換えたい場合がある。そんなとき、Quillは単体テスト時にモック・クラスに切り替える仕組みを持っているので便利だ。

 例えば、EmployeeDaoクラスを単体テスト時にMockEmployeeDaoクラスに置き換えたい場合は、IEmployeeDaoインターフェイスにMock属性(Seasar.Quill.Attrs名前空間)を設定してモック・クラスを指定しておき、テスト・コードではQuillInjectorの代わりにMockInjector(Seasar.Quill.Unit名前空間)を使用してDIを行う。その場合のソース・コードは以下のようになる。

 なお、テストを記述している以下のEmployeeLogicTestクラスでは、テスティング・フレームワークとしてMbUnitを使用している。テスティング・フレームワークについては各自使い慣れたものを使えばよいが、もしS2Containerを使う場合は、単体テストをサポートするS2Unit.NETが便利だ。S2Unit.NETはMbUnitを拡張してDIコンテナを用いたテストを助けてくれる。

namespace QuillSample
{
  /// <summary>
  /// 単体テスト時に使用するIEmployeeDaoのMockクラス
  /// </summary>
  public class MockEmployeeDao : IEmployeeDao
  {
    public string GetEmpName(int empNo)
    {
      return "テスト 太郎";
    }
  }
}
MockEmployeeDaoクラスのソース・コード(MockEmployeeDao.cs)

using Seasar.Quill.Attrs;

namespace QuillSample
{
  [Mock(typeof(MockEmployeeDao))]
  [Implementation(typeof(EmployeeDao))]
  public interface IEmployeeDao
  {
    ……省略……
IEmployeeDaoインターフェイスのソース・コード(IEmployeeDao.cs)

using MbUnit.Framework;
using Seasar.Quill.Unit;

namespace QuillSample
{
  [TestFixture]
  public class EmployeeLogicTest
  {
    protected IEmployeeLogic empLogic;

    [Test]
    public void TestGetEmpNameWithTitle()
    {
      MockInjector.GetInstance().Inject(this);
      string empName = empLogic.GetEmpNameWithTitle(123);
      Assert.AreEqual("テスト太郎さん", empName);
    }
  }
}
EmployeeLogicTestクラスのソース・コード(EmployeeLogicTest.cs)

 ほかにもDIが有効なケースとして、業務アプリケーションの納品先によって少しだけロジックを変えたいというようなことがあるかもしれない。Quillでは標準でそのような機能は持っていないが、Quillは非常にシンプルなソース・コードで作成されているため、カスタマイズが容易である。

 例えばImplA属性とImplB属性といった属性を作成しておき、設定ファイルなどの設定値を基に「ImplA属性で指定された実装クラスか」「ImplB属性で指定された実装クラスか」を切り替えるようなInjectorクラスを作成することができる。先ほど出てきたMockInjectorクラスはQuillInjectorのカスタマイズのよいサンプルなので参考にしてほしい。

 また、S2Containerを使えば、設定ファイルでDIの設定を行うため、設定ファイルを切り替えることでそのような要件を標準で満たすことができる。

 以上がS2Container.NETのQuillによるDIの基礎である。引き続き、次回後編ではAOPについての概要を説明する。End of Article


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

本日 月間