Dependency Injection とか DI とか依存性注入とかいわれるところの機能を提供する Application Block です。
Enterprise Library に組み込んで使います。
取得先
機能は、
・設定ファイルで指定したオブジェクトの生成
・実行時に指定したオブジェクトの生成
・設定ファイルで指定した静的メソッドの呼び出し
を、依存性を除去して(呼び出し元を修正せずに呼び出し先を変更可能な形で)行うことができます。
適用場面として、
・ユニットテスト時にモックオブジェクトに切り替える
・呼び出し元・先コンポーネントを独立した形で開発・保守する
点が考えられます。
シナリオの前提
・UI部分を書こうとしています。
・ビジネスロジック部分は別の開発者が担当しており、まだ出来上がっていません。
1. とりあえずビジネスロジックの呼び方だけは決めないとしょうがないので、インタフェースを決めます。
/// <summary>
/// 社員情報のファクトリ
/// </summary>
public interface IEmpFactory
{
IEmp GetEmp(int empNo);
}
/// <summary>
/// 社員情報
/// </summary>
public interface IEmp
{
string Name { get; }
}
2. UI部分を作成します。
まずは Pleoh.Common.EnterpriseLibrary.ServiceLocator.dll を参照設定に加え、
using Ploeh.Common.EnterpriseLibrary.ServiceLocator;
...
private IEmpFactory factory;
private void ThisLoad(object sender, System.EventArgs e)
{
// EmpFactory という名前で登録されている IEmpFactory オブジェクトを取得する
factory = (IEmpFactory)ServiceFactory.GetInstance("EmpFactory");
}
private void QueryClick(object sender, System.EventArgs e)
{
// IEmpFactory が取得できているので、普通に使える
IEmp emp = factory.GetEmp(int.Parse(empNo.Text));
MessageBox.Show(emp.Name);
}
3. IEmpFactory, IEmp の実装を用意します。UI部分の動作に必要なだけ、できるだけ単純に実装します。
public class MockEmpFactory: ServiceLocatorTest.IEmpFactory
{
#region IEmpFactory メンバ
public ServiceLocatorTest.IEmp GetEmp(int empNo)
{
return new MockEmp(empNo);
}
}
public class MockEmp: ServiceLocatorTest.IEmp
{
#region Members
private int empNo;
#endregion
#region constructors
public MockEmp(int empNo)
{
this.empNo = empNo;
}
#endregion
#region IEmp メンバ
public string Name
{
get
{
return string.Format("社員{0}", empNo);
}
}
#endregion
}
}
私は、1., 2., 3. それぞれ別アセンブリにしました。理由は、1. はビジネスロジック作成者に渡さなければいけないからで、3.は本番では使われないからです。
このとき、参照関係は 2. → 1. , 3. → 1. で、2. と 3. とは依存しないことに注意してください。
ここで、一旦全てビルドしておきます。
4. Configuration Tool で設定を行います。
App.Config を開き、Application で Action - New - Service Locator Application Block で Service Locator AB セクションを作成します。
次に、そのセクションで Action - New - Construction Service Provider で インスタンス生成サービスを作成します。
これの Name をコードで指定した「EmpFactory」に、InvocationTargetTypeName を 3. で作成した MockEmpFactory に設定します(... を押して、アセンブリをロードしてから選択する必要があるかもしれません)。
5. 保存して 2. を再度ビルドします。
ただし、 2. を実行するためには以下の 2 点が必要です。
・Service Locator Application Block 用の設定ファイル「servicelocatorconfiguration.config」を、bin\debug ディレクトリにコピーする
・3. のアセンブリを 2. の bin\debug ディレクトリにコピーする