Unity を使ってコードで依存性を注入する

はじめに

前回は 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; }

と変更すると

ニャ〜

と出力されます。

最後に

今回はコードで依存性を注入しました。属性を使った方法では、クラスを切り替えるにはコードを修正してリビルドする必要があるので、使う場面は少ないでしょう。

次は構成ファイルを使って依存性を注入する予定。