« インストール方法 | メイン | ロードマップ »

2005年04月21日

DI Containerの使い方

AttoContainerはDependency Injection Container(DI Container)の機能を提供します。

まずAttoContainerがアセンブリを探しに行けるように、設定ファイルを編集します。

<?xml version="1.0" encoding="utf-8" ?>
<components>
  <assembly name="TestAttoContainer.exe" />
  <assembly name="TestAttoContainerLib.dll" />
</components>

TestAttoContainer.exeというWindowsアプリケーションと、TestAttoContainerLib.dllというクラスライブラリを登録する場合は、上記のように設定します。

では、Form1クラスのインスタンスをAttoContainerから作成し、ITestLogicインターフェースを実装したTestLogicクラスのインスタンスをセット(Dependency Injection:依存注入)してみます。
AttoContainerではプロパティにインスタンスをセット(DI)します。(Property Injection)
DI Containerにそれほど関連の無いコードは省略します。

ITestLogicインターフェース

namespace TestAttoContainerLib.Logic
{
  public interface ITestLogic
  {
    void ExecuteLogic();
  }
}

TestLogicクラス

namespace TestAttoContainerLib.Logic
{
  public class TestLogic : ITestLogic
  {
    void ITestLogic.ExecuteLogic()
    {
      Console.WriteLine("ExecuteLogic");
    }
  }
}

Form1クラス

namespace TestAttoContainer
{
  public class Form1 : System.Windows.Forms.Form
  {
    // プロパティ
    public ITestLogic TestLogic 
    {
      set
      {
        testLogic = value;
      }
    }
    [STAThread]
    static void Main() 
    {
      // DIContainer作成(設定ファイルのパスと設定ファイルの
      // エンコードを指定します)
      DIContainer container = DIContainer.Instance
          ("../../components.xml" ,Encoding.GetEncoding("utf-8"));
      // コンポーネント取得
      Form1 form = (Form1)container.GetComponent(typeof(Form1));
      // DIContainerを開放
      container.Dispose();
      // ここでブレークポイントで止めてformの中を見てみると、
      // プロパティのTestLogicにTestAttoContainerLib.Logic.TestLogic
      // のインスタンスがセットされています。
      Application.Run(form);
    }
    private void Form1_Load(object sender, System.EventArgs e)
    {
      // Dependency InjectionされたtestLogicのExecuteLogicメソッドを実行します。
      testLogic.ExecuteLogic();
    }
  }
}

設定ファイル

<?xml version="1.0" encoding="utf-8" ?>
<components>
  <assembly name="TestAttoContainer.exe" />
  <assembly name="TestAttoContainerLib.dll" />
  <component name="TestLogic" 
      class="TestAttoContainerLib.Logic.TestLogic">
  </component>
</components>

componentタグのname属性に指定された名前とプロパティ名が一致する場合は、class属性で指定されたクラスのインスタンスを生成し、プロパティにセットします。(Auto Property Injection)

次はプロパティに初期値をセットしてみます。TestLogicクラスが次のようなプロパティを持っているとします。

TestLogicクラス

namespace TestAttoContainerLib.Logic
{
  public class TestLogic : ITestLogic
  {
    private string message;
    private double pi;
    private int num;
    private bool success;
    public string Message
    {
      set { message = value; }
    }
    public double Pi
    {
      set { pi = value; }
    }
    public int Num
    {
      set { num = value; }
    }
    public bool Success
    {
      set { success = value; }
    }
  }
}

これらのプロパティを次の値で初期化するためには、componentタグにpropertyタグを追加します。
Message="Hello World!", Pi=3.14, Num=28, Success=true

設定ファイル

  <component name="TestLogic" class="TestAttoContainerLib.Logic.TestLogic">
    <property name="Message">Hello World!</property>
    <property name="Pi">3.14</property>
    <property name="Num">28</property>
    <property name="Success">true</property>
  </component>

投稿者 sugimotokazuya : 2005年04月21日 21:00

トラックバック

このエントリーのトラックバックURL:
http://attocontainer.sourceforge.jp/cgi-bin/mt-tb.cgi/4

コメント

コメントしてください




保存しますか?