【C#】【DI】Visual Studio 2010で S2Container.Net(Quill) を使う


■ 手順

S2Container取得とVS2010の環境設定

 [1] S2Containerを以下のURLからダウンロード(この例では「s2container.net-1.3.18」)
http://s2container.net.seasar.org/ja/download.html
 [2] ダウンロードしたファイルを解凍し、以下をを任意のパスにコピーする
* s2container.net-1.3.18\s2container.net\build\net2.0
* Seasar.dll
* Seasar.DynamicProxy.dll
* Seasar.Quill.dll
* s2container.net-1.3.18\s2container.net\build\net2.0\ja-JP
* Seasar.resources.dll
* Seasar.Quill.resources.dll
* s2container.net-1.3.18\s2container.net\lib\net2.0
* Castle.DynamicProxy.dll
* log4net.dll


 [3] VS2010のソリューションエクスプローラの[参照設定]を右クリックして
   [参照の追加]からコピーしたDLLを全て追加
 [4] 対象プロジェクトの右クリックし、「プロパティ」を選択
 [5] [アプリケーション]-[対象のフレームワーク]内の
    「.NET Framework 4 Client Profile」→「.NET Framework 4」に変更

■ 実装例

ReciptEntity.cs

public class ReciptEntity
{
    public string no { get; set; }
    public string name { get; set; }
    public string price { get; set; }
    public string tax { get; set; }
    public string priceWithoutTax { get; set; }
}

IReciptDao.cs(インターフェイス)

using Seasar.Quill.Attrs;
...
[Implementation(typeof(ReciptDao))]
public interface IReciptDao
{
    ReciptEntity GetReciptEntity();
}

ReciptDao.cs

using Seasar.Quill.Attrs;
...
public class ReciptDao : IReciptDao
{
    public ReciptEntity GetReciptEntity()
    {
        ReciptEntity entity = new ReciptEntity();

        entity.no = "1";
        entity.name = "Mike";
        entity.price = "10500";
        entity.tax = "5";
        entity.priceWithoutTax = "10000";

        return entity;
    }
}

IReciptLogic.cs(インターフェイス)

using Seasar.Quill.Attrs;
...
[Implementation(typeof(ReciptDao))]
public interface IReciptDao
{
    ReciptEntity GetReciptEntity();
}

ReciptLogic.cs

using Seasar.Quill.Attrs;
...
public class ReciptLogic : IReciptLogic
{
    public IReciptDao dao;

    public string GetName()
    {
        ReciptEntity ent = dao.GetReciptEntity();

        return ent.name;
    }
}

呼び出し部分の実装例(Form1.cs)

using Seasar.Quill;
...
public Form1()
{
    InitializeComponent();

    // DIを行う
    QuillInjector.GetInstance().Inject(this); // ★追記(ポイント:コンストラクタ内に記述)★
}
...
public IReciptLogic reciptLogic; // ★Class内部に記述★
...
private void button3_Click(object sender, EventArgs e)
{
    this.label1.Text = reciptLogic.GetName(); // ★呼び出し例★
}