かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

AutofacというDIコンテナを触ってみた

Windows Azure Mobile Servicesの.NETクライアントがPreviewで公開されてwktkして触ってみたら、AutofacというDIコンテナがついてるみたい。何だろう?と思ってそっちが気になってみました。まずは基本的な使い方から。

初期化

どうも、構成ファイルで設定するというのは、初めのチュートリアルを見た限りだとないっぽいです(あるのかもしれないけど、最初に紹介する機能ではないみたい)基本的には、ContainerBuilderに対して型を登録していって、Buildメソッドでコンテナを作って、Resolveで型を取り出して使う。

たとえば、コンテナに登録するために以下のようなメンドクサイインターフェースをいちいち定義した型があるとします。

interface IGreeter
{
    string Greet();
}

class Greeter : IGreeter
{
    public string Greet() { return "Hello world"; }
}

interface IGreeterClient
{
    void SayHello();
}

class GreeterClient : IGreeterClient
{
    private IGreeter greeter;

    public GreeterClient(IGreeter greeter)
    {
        this.greeter = greeter;
    }


    public void SayHello()
    {
        Console.WriteLine(this.greeter.Greet());
    }
}

何も考えずにコンストラクタでインスタンスを受け取るようにしておくと、よきに計らってくれるみたいです。

そして、使う側。

static void Main(string[] args)
{
    // コンテナを組み立ててくれるクラス
    var builder = new ContainerBuilder();
    // GreeterクラスをIGreeterとして登録
    builder.RegisterType<Greeter>().As<IGreeter>();
    // GreeterClientクラスをIGreeterClientとして登録
    builder.RegisterType<GreeterClient>().As<IGreeterClient>();

    // コンテナ作成
    var container = builder.Build();
    // コンテナからIGreeterClientを取り出してメソッドを呼ぶ
    var greeter = container.Resolve<IGreeterClient>();
    greeter.SayHello(); // Hello worldと出力される
}

まぁ、コンテナへの型の登録とコンテナから組み立てられた型の取り出しはいけるっぽいですね。ふむふむ。