テスターですが何か?

ホビープログラマ略してHPです

S2COntainer(Quill)を利用したサンプル

leave a comment »

S2Containerを利用したASP.NET+VBのサンプルを作成したのでアップします。

http://cid-5549d6c74ffbb345.skydrive.live.com/embedicon.aspx/.Public/S2ContainerSample/Tenohira.zip

プロジェクトは全部で以下2つです
Tenohiraプロジェクト
 aspx,vbファイルとユニットテスト用ファイルです。
 まともに完成しているのは、LogOn.aspxとHome.aspxのみです。
 Core名前空間にあるファイルが実行クラス本体、Test名前空間にあるファイルがユニットテスト用クラスです。
 基本実行パスは、LogOn.aspx.vb→LogOnLogicImpl.vb→LogOnDaoImpl.vbです。ちなみに、データアクセスには、ADO.NET Entity Frameworkを使用しています。
 
 以下、開発手順の解説です。
 
 (1)プロジェクト作成後、DLLへの参照を追加
  ・ソリューションファイルのあるディレクトリにlibフォルダを作成し、DLLをコピー
  ・以下のDLLに対して参照を追加
    log4net.dll
    Seasar.dll
    Seasar.Quill.dll
   ※log4net用にlog4net.configを追加します。
 
 (2)LogOn.aspx, LogOn.aspx.vbファイルを作成
  ・aspxにコントロールを配置し、イベントを追加します(特別なことはしていないので、省略します)
  ・LogOn.aspx.vbのPage_LoadイベントにDI実行を行う処理を追記
    QuillInjector.GetInstance().Inject(Me)
  ・LogOn.aspx.vbのプロパティにビジネスロジッククラスのインターフェースをProtectedで定義
    Protected LogOnLogic As ILogOnLogic
   上記2つの手順(DI実行、プロパティにインターフェースを定義)で、ビジネスロジッククラスのメソッドを呼び出す際に、インスタンスを生成する手順が不要になります。
   LogOn.aspx.vbの92行目
 
 (3)ビジネスロジッククラス、DAOクラスを作成
  ・ビジネスロジッククラス、DAOクラス本体を作成します。(LogOnLogicImpl.vb, LogOnDaoImpl.vb)
   先ほどのLogOn.aspx.vbと同様、インスタンスを生成するクラスのインターフェースをプロパティにProtectedで定義します。
   ※LogOnLogicImpl.vbの20行目
  ・プロパティでProtectedで定義したインターフェースを実装するクラスのメソッドを呼び出す前に、インスタンスを生成する手順が不要になること意外は、通常のクラスの作成と同様です。
  
 (4)ビジネスロジッククラス、DAOクラスを作成
  ・(3)の手順で作成した、ビジネスロジッククラス、DAOクラスのインターフェースを作成します。また(3)で作成したクラスはインターフェースを実装することを定義します。
  ・インターフェースクラスはSeasar.Quill.Attrs名前空間をインポートし、クラスの属性にインターフェースを実装するクラスを以下のように指定します。
   <Implementation(GetType(LogOnLogicImpl))> _
   
 開発手順は以下の通りです。スケルトンを作成して実行/デバッグ実行すると、インスタンスを生成しなくてもDI機能によってプログラムが動作することが確認できると思います。
 (注意)
  S2Container.NETのバージョンが1.3.16未満の場合、動作しない(メソッド呼び出しの部分でNullReferrenceExceptionが発生)可能性があります。
  何らかの理由でDIが正しく機能していないようです。原因は確認していませんが、1.3.16以降であれば正しく動作します。

 ユニットテストクラスの作成(ビジネスロジッククラスをテストするクラスを作成)
 
 (1)DLLへの参照を追加
  ・MbUnit.Framework.dllに参照設定を追加します。
   S2Container.NETに含まれているdllに対して参照を追加しています、最新バージョンのMbUnitに含まれている同名のdllでは以降の手順で正しく動作しなかった記憶があります。(記憶が曖昧ですが)
   
 (2)テスト用クラスの作成(LogOnLogicImplTest.vb)
  ・Seasar.Quill.UnitとMbUnit.Framework名前空間をインポートします
  ・被テストクラス(この場合はLogOnLogicImpl)のインターフェースをテスト用クラスのプロパティに定義します。
   Protected LogOnLogic As ILogOnLogic
  ・Mockクラスの作成
   このままでもユニットテストの実行は可能ですが、データベースに登録されているデータによってテスト結果が左右されてしまいます。
   そのため、DAOクラスのMockクラスを作成し、DAOクラスからの戻り値を固定化します。
  ・インターフェースにMock属性を追加
   DI実行時に先ほど作成したMockクラスが利用できるよう、インターフェースクラス(ILogOnDao.vb)にMock属性を追加します。
   <Mock(GetType(LogOnDaoMock))> _
   これで、DI実行時に本クラス(LogOnDaoImpl.vb)、Mockクラス(LogOnDaoMock.vb)のどちらを利用するか指定することができます。
  ・SetupメソッドにDI実行し、Mockクラスをインジェクションする処理を記載します。
   MockInjector.GetInstance().Inject(Me)
  
  ※ユニットテスト時にMockクラスを利用できるメリットについては@ITの以下の記事を参考にしてください.

   .NET開発者のためのDI&AOP入門(前編)
 
 以上がS2Container.NETでの開発手順です。TenohiraUITestプロジェクトの解説は次回行います。

Written by david9142

2009年9月20日 @ 2:30 PM

カテゴリー: VisualBasic

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。