はじめに
前回は UnityContainer に登録したインスタンスを取り出すだけだったので、
今回は依存性注入の簡単なサンプルを作成してみました。
インタフェースを用意
public interface IAnimal
{
// 鳴き声を出力する
void Cry();
}
鳴き声を出力するメソッドだけのインタフェース。
インタフェースを実装するクラスを用意
// ネコ
public class Cat : IAnimal
{
public void Cry()
{
Console.WriteLine("ニャ~");
}
}
// イヌ
public class Dog : IAnimal
{
public void Cry()
{
Console.WriteLine("バウ!");
}
}
依存性を注入するクラスを用意
public class Person
{
[Dependency("Dog")]
public IAnimal Pet { get;set; }
// ペットを呼ぶ
public void CallPet()
{
Pet.Cry();
}
}
Pet プロパティに Dependency 属性を付けています。
DI コンテナに登録した中で "Dog" に対応するインスタンスが、
このプロパティにセットされます。
依存性注入します!
static void Main(string[] args)
{
// DI コンテナを生成
UnityContainer container = new UnityContainer();
// 名前を指定してインスタンスを登録
container.RegisterInstance<IAnimal>("Dog", new Dog());
container.RegisterInstance<IAnimal>("Cat", new Cat());
Person person = new Person();
// 依存性を注入する
person = container.BuildUp<Person>(person);
// ペットを呼ぶ
person.CallPet();
Console.ReadLine();
}
このコードを実行すると
と出力されます。
Dependency 属性を変更
[Dependency("Cat")]
public IAnimal Pet { get;set; }
と変更すると
と出力されます。
最後に
今回はコードで依存性を注入しました。
属性を使った方法では、クラスを切り替えるにはコードを修正してリビルドする必要があるので、
使う場面は少ないでしょう。
次は構成ファイルを使って依存性を注入する予定。