インタフェースを用意
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; }
と変更すると
ニャ〜
と出力されます。
最後に
今回はコードで依存性を注入しました。属性を使った方法では、クラスを切り替えるにはコードを修正してリビルドする必要があるので、使う場面は少ないでしょう。
次は構成ファイルを使って依存性を注入する予定。