サンプルアプリケーションの概要
それでは、s2dotnetを用いたアプリケーションのサンプルを見てみましょう。書籍マスタのメンテナンスを行うWindowsアプリケーションです。[デバッグ]メニューの[開始]にて画面が起動します。
ローカルトランザクションを使用する「MDB版」と分散トランザクションを使用する「SQL Server(MSDE)」版の2種類を用意しています。
ローカルトランザクションを使用する「MDB版」について
「S2dotnetSampleLocalTx.zip」をダウンロードしてください。特にセットアップ作業は不要です。そのまま実行してください。
分散トランザクション(MS-DTC)を使用する「SQL Server版」について
「S2dotnetSampleMsDtcTx.zip」をダウンロードしてください。テーブルとデータを作成するため、「Resources」フォルダのSQLをあらかじめ実行しておいてください。「Dao」フォルダの「DtcTx.dicon.xml」ファイルの「ConnectionString」を読者の環境にあわせて変更してください。また、.NET Frameworkの自動トランザクション機能を使用しています。COM+サービスとMS-DTC環境を必要とするため、Windows2000、WindowsXP、Windows 2003 ServerのOSでのみ動作します。
開発手順
アプリケーションの開発手順を簡単にまとめます。
- コンポーネントのインターフェースを定義する(プログラム)
- コンポーネントの実装クラスを記述する(プログラム)
- DIとAOPの設定を記述する(設定ファイル)
- s2dotnetからコンポーネントを取得し利用する(プログラム)
s2dotnetで生成・管理するクラスは「コンポーネント」と呼ばれます。今回のサンプルのレイヤ構成とs2dotnetの役割について下図に整理します。

インターフェースと実装の分離といっても、全てのオブジェクトの生成をs2dotnetで行わなければいけないわけではありません。一般的には、レイヤ間のオブジェクト生成にs2dotnetを使用します。今回のサンプルでは、プレゼンテーション層、ビジネスロジック層、データアクセス層とレイヤを分けていますので、それぞれの境界でインターフェースを定義しています。
なお、従来の開発でインターフェースを定義する場合は、1つのインターフェースに対して、複数の実装を作成し、Factoryパターンなどで振り分けるケースもありましたが、DIコンテナを用いた開発ではインターフェースと実装クラスは1対1の関係になります。ポリモーフィズムのためのインターフェースというよりも、レイヤの外に対してサービスを明示的に定義するインターフェースの意味合いが強いといえます(例:プレゼンテーション層の開発者はビジネスロジック層の振る舞いを知っているだけで、ビジネスロジックがどのように実装されているかについては知らなくても良い)。
コンポーネントのインターフェースを定義する(プログラム)
ビジネスロジック層の「AUTHOR(著者)」に関するコンポーネントを例にプログラムを見ていきます。
まず、プレゼンテーション層に公開するIAuthorLogicインターフェースを定義します。ここでは、著者全員を取得するgetAuthorsAllメソッドと、著者を追加するaddAuthorメソッドを定義します。
public interface IAuthorLogic { IList getAuthorsAll(); void addAuthor(Author author); }
コンポーネントの実装クラスを記述する(プログラム)
IAuthorLogicをインターフェース継承してAuthorLogicImplを実装します。IAuthorLogicインターフェースで定義したgetAuthorsAllメソッドとaddAuthorメソッドを実装します。
public class AuthorLogicImpl:System.MarshalByRefObject,IAuthorLogic{ //DIによって設定されるプロパティ private IAuthorDao _authorDao = null; public IAuthorDao AuthorDao { set { _authorDao = value; } } //著者取得(複数件)全員 public IList getAuthorsAll() { return _authorDao.getAuthorsAll(); } //著者追加 public void addAuthor(Author author) { _authorDao.addAuthor(author); } }
プロパティのIAuthorDaoにはAuthorDaoImplが注入されているため、各メソッドからは_authorDaoの対応メソッドを呼び出すだけとなります。

