かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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と出力される
}

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