割と普通なブログ

Microsoft Azure や ASP.NET、Java EE 系の話題を記載します

Seasar.NETプロジェクトのQuillを使ってみた(その1)

Java出身のDIコンテナSeaser.NET団体における、純正な.NET版のDIフレームワークであるQuillを試してみた。Quillの持つ基本的な機能は以下な感じ。

ちょっと触った限りでは、JavaのDIフレームワークGoogle Guiceの.NET版という印象を受けた。重要で使いやすい機能のみに実装を絞っており、かなりわかり易い&使いやすいフレームワークになってるんじゃないでしょうか。
ここで、あえて”DIとは!”とか、”AOPとは!”とかは言ったりしませんが、DI機能の一番典型的な使い方としてモックの差し替えサンプルを実装してみました。よろしかったらどぞどぞ。
サンプルコードはプロジェクト毎ここに置いてます。

また、はまり所もメモっておきます。

  • DI対象のインターフェース、クラスはpublicにする事(厳密には違いますが、詳細は本家を見てください)
  • Castle.DynamicProxy.dll アセンブリの参照を忘れないこと(FileNotFound的な例外でます)

DI機能のサンプルコード

using System;
using System.Linq;

using Seasar.Quill;
using Seasar.Quill.Attrs;
using Seasar.Quill.Unit;

class Program
{
    static void Main(string[] args)
    {
        ImplAction();
        MockAction();
        Console.ReadLine();
        //実行結果
        //このDTOの情報は ID=0, Name=さんぷる です。
        //もっくです
    }

    public static void ImplAction()
    {
        QuillInjector injector = QuillInjector.GetInstance();
        SmpAction<SmpDto> smpAction = new SmpAction<SmpDto>();
        injector.Inject(smpAction);
        smpAction.Disp(new SmpDto { ID = 0, Name = "さんぷる" });
    }

    public static void MockAction()
    {
        //MockInjectorはQuillInjectorを継承している
        QuillInjector injector = MockInjector.GetInstance();
        SmpAction<SmpDto> smpAction = new SmpAction<SmpDto>();
        injector.Inject(smpAction);
        smpAction.Disp(new SmpDto { ID = 0, Name = "さんぷる" });
    }
}

public class SmpDto
{
    public int ID { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return "ID=" + ID + ", Name=" + Name;
    }
}

public class SmpAction<T>
{
    private ISmpAction<T> action;
    public void Disp(T dto)
    {
        action.Disp(dto);
    }
}

[Implementation(typeof(SmpActionImpl))]
[Mock(typeof(MockActionImpl))]
public interface ISmpAction<T>
{
    void Disp(T dto);
}

public class MockActionImpl : ISmpAction<SmpDto>
{
    public void Disp(SmpDto dto)
    {
        Console.WriteLine("もっくです");
        //throw new NotImplementedException("未実装、ははん");
    }
}

public class SmpActionImpl : ISmpAction<SmpDto>
{
    public void Disp(SmpDto dto)
    {
        Console.WriteLine("このDTOの情報は {0} です。", dto);
    }
}