Seasarプロジェクト ＞ Seasar.NETプロジェクト ＞ S2Container.NET ＞ DIContainer ＞ Examples

以下のサンプルを実行する場合は、セットアップを行う必要があります。 Seasar.ExamplesプロジェクトはWindowsアプリケーションとして作成されています。 Seasar.Examplesプロジェクトをスタートアッププロジェクトに設定しF5キーを押して開始すると、 ExamplesExplorerが起動しExampleのソースコードと実行結果を確認することができます。

# 目次

上へ

- コンストラクタ・インジェクション
- プロパティ・インジェクション
- メソッド・インジェクション
- 自動バインディング（コンストラクタ・インジェクション）
- 自動バインディング（プロパティ・インジェクション）

# コンストラクタ・インジェクション

上へ

コンストラクタ・インジェクションを使ってメッセージを表示しましょう。作成するファイルは以下のとおりです。

- インターフェース(IHello.cs)
- 実装クラス(HelloConstructorInjection.cs)
- diconファイル(HelloConstructorInjection.dicon)
- 実行クラス(HelloConstructorInjection.cs中のHelloconstructorInjectionClientクラス)

## インターフェースの作成

- ShowMessage()を定義します。

先ず最初はインターフェースを考えます。インターフェースと実装を分離することで、 コンポーネントの利用者はインターフェースを知っていれば実装のことは知らなくても済むようになります。 また、テストの時には実装をモックに置き換えることで簡単にテストできるようになります。

C#

    namespace Seasar.Examples.Reference.Injection
    {
        public interface IHello
        {
            void ShowMessage();
        }
    }

## 実装クラスの作成

- 引数がstring型のコンストラクタを定義します。
- ShowMessage()を実装します。

次はいよいよ実装です。コンストラクタでメッセージを受け取り、ShowMessage()で受け取ったメッセージを出力します。

C#

    using System;
    namespace Seasar.Examples.Reference.Injection
    {
        public class HelloConstructorInjection : IHello
        {
            private string message;

            public HelloConstructorInjection(string message)
            {
                this.message = message;
            }

            public void ShowMessage()
            {
                Console.WriteLine(this.message);
            }
        }
    }

## diconファイルの作成

- componentタグでコンポーネントを定義します。
- componentタグの子タグのargタグでコンストラクタの引数値を定義します。

メッセージをコンポーネントに設定するのは、S2Containerの仕事です。 定義ファイルに基づいてコンポーネントを組み立てます。

Seasar.Examples/Reference/Injection/HelloConstructorInjection.dicon

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
    <components>
        <component name="hello"
    class="Seasar.Examples.Reference.Injection.HelloConstructorInjection">
            <arg>"Hello World!"</arg>
        </component>

        <component name="ConstructorInjection"
    class="Seasar.Examples.Reference.Injection.HelloConstructorInjectionClient" />
    </components>

## 実行クラスの作成

- S2ContainerFactory.Create(String path)を呼び出してS2Containerを作成します。
- GetComponent()を使用して、S2Containerからコンポーネントを取り出します。
- 取得したコンポーネントのメソッドを呼び出します。

    using System;

    using Seasar.Framework.Container;
    using Seasar.Framework.Container.Factory;

    namespace Seasar.Examples.Reference.Injection
    {
        public class HelloConstructorInjectionClient
        {
            private static readonly String PATH =
    "Seasar.Examples/Reference/Injection/HelloConstructorInjection.dicon";

            public void Main()
            {
                // 型を指定してコンポーネントを取得する場合
                IS2Container container = S2ContainerFactory.Create(PATH);
                IHello hello = (IHello) container.GetComponent(typeof(IHello));
                hello.ShowMessage();

                // 名前を指定してコンポーネントを取得する場合
                IHello hello2 = (IHello) container.GetComponent("hello");
                hello2.ShowMessage();
            }
        }
    }

## 実行結果

argタグで指定した文字列が正しく表示されていることが確認できます。

    Hello World!
    Hello World!

この演習は、Seasar.ExamplesプロジェクトのSeasar.Examples/Reference/Injection以下に用意されています。

# プロパティ・インジェクション

上へ

プロパティ・インジェクションを使ってメッセージを表示しましょう。作成するファイルは以下のとおりです。

- インターフェース(IHello.cs)（コンストラクタ・インジェクションと同じもの）
- 実装クラス(HelloPropertyInjection.cs)
- diconファイル(HelloPropertyInjection.dicon)
- 実行クラス(HelloPropertyInjection.cs中のHelloPropertyInjectionClientクラス)

## インターフェースの作成

- ShowMessage()を定義します。

インターフェースはコンストラクタ・インジェクションの場合と同じです。 プロパティに対するgetアクセサ、setアクセサを定義する必要はありません。 なぜなら、Dependency Injectionするのにコンストラクタを使うのかsetアクセサを使うのかは実装の問題だからです。

C#

    namespace Seasar.Examples.Reference.Injection
    {
        public interface IHello
        {
            void ShowMessage();
        }
    }

## 実装クラスの作成

- プロパティを定義します。
- ShowMessage()を実装します。

次は実装です。プロパティ・メソッドでメッセージを受け取り、ShowMessage()で受け取ったメッセージを出力します。

C#

    using System;

    namespace Seasar.Examples.Reference.Injection
    {
        public class HelloPropertyInjection : IHello
        {
            private string message;

            public HelloPropertyInjection() {}

            public string Message
            {
                get { return this.message; }
                set { this.message = value; }
            }

            public void ShowMessage()
            {
                Console.WriteLine(this.message);
            }
        }
    }

## diconファイルの作成

- componentタグでコンポーネントを定義します。
- componentタグの子タグのpropertyタグでコンポーネントのプロパティ値を定義します。

Seasar.Examples/Reference/Injection/HelloPropertyInjection.dicon

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
    <components>

        <component
    class="Seasar.Examples.Reference.Injection.HelloPropertyInjection">
            <property name="Message">"Hello World!"</property>
        </component>

        <component name="PropertyInjection"
    class="Seasar.Examples.Reference.Injection.HelloPropertyInjectionClient" />

    </components>

## 実行クラスの作成

- S2ContainerFactory.Create(string path)を呼び出してS2Containerを作成します。
- GetComponent()を使用して、S2Containerからコンポーネントを取り出します。
- 取得したコンポーネントのメソッドを呼び出します。

C#

    using System;

    using Seasar.Framework.Container;
    using Seasar.Framework.Container.Factory;

    namespace Seasar.Examples.Reference.Injection
    {
        public class HelloPropertyInjectionClient
        {
            private static readonly String PATH =
                "Seasar.Examples/Reference/Injection/HelloPropertyInjection.dicon";

            public void Main()
            {
                IS2Container container = S2ContainerFactory.Create(PATH);
                IHello hello = (IHello) container.GetComponent(typeof(IHello));
                hello.ShowMessage();
            }
        }
    }

## 実行結果

propertyタグで指定した文字列が正しく表示されていることが確認できます。

    Hello World!

この演習は、Seasar.ExamplesプロジェクトのSeasar.Examples/Reference/Injection以下に用意されています。

# メソッド・インジェクション

上へ

メソッド・インジェクションを使ってメッセージを表示しましょう。作成するファイルは以下のとおりです。

- インターフェース(IHello.cs)
- 実装クラス(HelloMethodInjection.cs)
- diconファイル(HelloMethodInjection.dicon)
- 実行クラス(HelloMethodInjection.cs中のHelloMethodInjectionClientクラス)

## インターフェースの作成

- ShowMessage()を定義します。

追加のメソッドを複数回呼び出すようなケースが代表的な使い方ですが、 今回の演習では、インターフェースはコンストラクタ・インジェクションの場合と同じにしました。

C#

    namespace Seasar.Examples.Reference.Injection
    {
        public interface IHello
        {
            void ShowMessage();
        }
    }

## 実装クラスの作成

- AddMessage()を定義します。
- ShowMessage()を実装します。

次は実装です。AddMessage(string message)でメッセージを複数回追加して、ShowMessage()で受け取ったメッセージを出力します。

C#

    using System;
    using System.Text;

    namespace Seasar.Examples.Reference.Injection
    {
        public class HelloMethodInjection : IHello
        {
            private StringBuilder builder = new StringBuilder();

            public HelloMethodInjection() {}

            public void AddMessage(string message)
            {
                this.builder.Append(message);
            }

            public void ShowMessage()
            {
                Console.WriteLine(this.builder.ToString());
            }
        }
    }

## diconファイルの作成

- componentタグでコンポーネントを定義します。
- componentタグの子タグのinitMethodタグでコンポーネントのメソッドの引数値を定義します。

まずは、argタグを使ってAddMessage(string message)に"Hello "を指定します。 次にJScript.NET式を使ってAddMessage(string message)に"World！"を指定します。

Seasar.Examples/Reference/Injection/HelloMethodInjection.dicon

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
    <components>
        <component
              class="Seasar.Examples.Reference.Injection.HelloMethodInjection">
            <initMethod name="AddMessage">
                <arg>"Hello "</arg>
            </initMethod>
            <initMethod>self.AddMessage("World!")</initMethod>
        </component>

        <component name="MethodInjection"
          class="Seasar.Examples.Reference.Injection.HelloMethodInjectionClient" />
    </components>

## 実行クラスの作成

- S2ContainerFactory.Create(string path)を呼び出してS2Containerを作成します。
- GetComponent()を使用して、S2Containerからコンポーネントを取り出します。
- 取得したコンポーネントのメソッドを呼び出します。

C#

    using System;

    using Seasar.Framework.Container;
    using Seasar.Framework.Container.Factory;

    namespace Seasar.Examples.Reference.Injection
    {
        public class HelloMethodInjectionClient
        {
            private static readonly String PATH =
                "Seasar.Examples/Reference/Injection/HelloMethodInjection.dicon";

            public void Main()
            {
                IS2Container container = S2ContainerFactory.Create(PATH);
                IHello hello = (IHello) container.GetComponent(typeof(IHello));
                hello.ShowMessage();
            }
        }
    }

## 実行結果

initMethodタグで指定した文字列が正しく表示されていることが確認できます。

    Hello World!

この演習は、Seasar.ExamplesプロジェクトのSeasar.Examples/Reference/Injection以下に用意されています。

# 自動バインディング(コンストラクタ・インジェクション)

上へ

自動バインディングでメッセージを表示してみましょう。作成するファイルは以下のとおりです。

- インターフェース(IHello.cs)
- インターフェースの実装クラス(AutoHelloConstructorInjection.cs)
- diconファイル(AutoHelloConstructorInjection.dicon)
- 実行クラス(AutoHelloConstructorInjection.cs中のAutoHelloConstructorInjectionClientクラス)

## インターフェースの作成

- ShowMessage()を定義します。

C#

    namespace Seasar.Examples.Reference.AutoBinding
    {
        public interface IHello
        {
            void ShowMessage();
        }
    }

## 実装クラスの作成

- 引数がIDictionaryのコンストラクタを定義します。
- ShowMessage()を実装します。

コンストラクタでIDictionaryを受け取り、 ShowMessage()でhelloをキーとしてIDictionaryから値を取得して出力します。

C#

    using System;
    using System.Collections;

    namespace Seasar.Examples.Reference.AutoBinding
    {
        public class AutoHelloConstructorInjection : IHello
        {
            private IDictionary dictionary;

            public AutoHelloConstructorInjection(IDictionary dictionary)
            {
                this.dictionary = dictionary;
            }

            public void ShowMessage()
            {
                Console.WriteLine(dictionary["hello"]);
            }
        }
    }

## diconファイルの作成

- componentタグでSystem.Collections.IDictionaryの実装クラスである System.Collections.Hashtableをコンポーネント定義します。
- componentタグの子タグであるinitMethodタグで Hashtableにキーとして"hello"、値として"Hello World!"を定義します。
- componentタグでAutoHelloConstructorInjectionをコンポーネント定義します。 autoBinding属性にautoを指定します。 演習であるため auto を明示的に指定していますが、 autoBinding属性のデフォルト値であるため本来は省略します。

AutoHelloConstructorInjectionには、argタグが定義されていないことに注目してください。 コンストラクタ・インジェクションを行う場合、argタグを定義する必要がありますが、 S2Container内にIDictionaryの実装クラスが登録されていれば、 S2Containerがコンテナ内を検索して自動的に引数を設定します。 ただし、引数の型がインターフェースでない場合、自動バインディングはできません。

Seasar.Examples/Reference/AutoBinding/AutoHelloConstructorInjection.dicon

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
    <components>

        <component class="System.Collections.Hashtable">
            <initMethod name="Add">
                <arg>"hello"</arg>
                <arg>"Hello World!"</arg>
            </initMethod>
        </component>

        <component name="hello" autoBinding="auto"
    class="Seasar.Examples.Reference.AutoBinding.AutoHelloConstructorInjection" />

        <component name="AutoConstructorInjection" class=
    "Seasar.Examples.Reference.AutoBinding.AutoHelloConstructorInjectionClient" />

    </components>

## 実行クラスの作成

- S2ContainerFactory.Create(string path) を呼び出してS2Containerを作成します。
- GetComponent()を使用して、S2Containerからコンポーネントを取り出します。
- 取得したコンポーネントのメソッドを呼び出します。

C#

    using System;
    using Seasar.Framework.Container;
    using Seasar.Framework.Container.Factory;
    namespace Seasar.Examples.Reference.AutoBinding
    {
        public class AutoHelloConstructorInjectionClient
        {
            private static readonly String PATH =
    "Seasar.Examples/Reference/AutoBinding/AutoHelloConstructorInjection.dicon";

            public void Main()
            {
                IS2Container container = S2ContainerFactory.Create(PATH);
                IHello hello = (IHello) container.GetComponent(typeof(IHello));
                hello.ShowMessage();
            }
        }
    }

## 実行結果

Hashtableの値が表示されていることから、自動的にコンストラクタの引数を設定していることが確認できます。

    Hello World!

この演習は、Seasar.ExamplesプロジェクトのSeasar.Examples/Reference/AutoBinding以下に用意されています。

# 自動バインディング(プロパティ・インジェクション)

上へ

自動バインディングでメッセージを表示してみましょう。作成するファイルは以下のとおりです。

- インターフェース(IHello.cs)
- インターフェースの実装クラス(AutoHelloPropertyInjection.cs)
- diconファイル(AutoHelloPropertyInjection.dicon)
- 実行クラス(AutoHelloPropertyInjection.cs中のAutoHelloPropertyInjectionClientクラス)

## インターフェースの作成

- ShowMessage()を定義します。

C#

    namespace Seasar.Examples.Reference.AutoBinding
    {
        public interface IHello
        {
            void ShowMessage();
        }
    }

## 実装クラスの作成

- IDictionary型のプロパティを定義します。
- ShowMessage()を実装します。

IDictionary MessageのsetアクセサでIDictionaryを受け取り、 ShowMessage()でhelloをキーとしてIDictionaryから値を取得して出力します。

C#

    using System;
    using System.Collections;

    namespace Seasar.Examples.Reference.AutoBinding
    {
        public class AutoHelloPropertyInjection : IHello
        {
            private IDictionary dictionary;

            public AutoHelloPropertyInjection()
            {
            }

            public IDictionary Message
            {
                set { dictionary = value; }
            }

            public void ShowMessage()
            {
                Console.WriteLine(dictionary["hello"]);
            }
        }
    }

## diconファイルの作成

- componentタグでSystem.Collections.IDictionaryの実装クラスであるSystem.Collections.Hashtableをコンポーネント定義します。
- componentタグの子タグであるinitMethodタグでHashtableにキーとして"hello"、値として"Hello World!"を定義します。
- componentタグでAutoHelloPropertyInjectionをコンポーネント定義します。 autoBinding属性にautoを指定します。 演習であるため auto を明示的に指定していますが、 autoBinding属性のデフォルト値であるため本来は省略します。

AutoHelloPropertyInjectionには、propertyタグが定義されていないことに注目してください。 プロパティ・インジェクションを行う場合、propertyタグで任意のプロパティを定義する必要がありますが、 S2Container内にIDictionaryの実装クラスが登録されていれば、S2Containerがコンテナ内を検索して自動的にプロパティを設定します。 ただし、 プロパティの型がインターフェースでない場合、自動バインディングはできません。

Seasar.Examples/Reference/AutoBinding/AutoHelloPropertyInjection.dicon

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
    <components>

        <component class="System.Collections.Hashtable">
            <initMethod name="Add">
                <arg>"hello"</arg>
                <arg>"Hello World!"</arg>
            </initMethod>
        </component>

        <component name="hello" autoBinding="auto"
    class="Seasar.Examples.Reference.AutoBinding.AutoHelloPropertyInjection" />

        <component name="AutoPropertyInjection" class=
    "Seasar.Examples.Reference.AutoBinding.AutoHelloPropertyInjectionClient" />

    </components>

## 実行クラスの作成

- S2ContainerFactory.Create(string path) を呼び出してS2Containerを作成します。
- GetComponent()を使用して、S2Containerからコンポーネントを取り出します。
- 取得したコンポーネントのメソッドを呼び出します。

C#

    using System;
    using Seasar.Framework.Container;
    using Seasar.Framework.Container.Factory;
    namespace Seasar.Examples.Reference.AutoBinding
    {
        public class AutoHelloPropertyInjectionClient
        {
            private static readonly String PATH =
    "Seasar.Examples/Reference/AutoBinding/AutoHelloPropertyInjection.dicon";

            public void Main()
            {
                IS2Container container = S2ContainerFactory.Create(PATH);
                IHello hello = (IHello) container.GetComponent(typeof(IHello));
                hello.ShowMessage();
            }
        }
    }

## 実行環境

Hashtableの値が表示されていることから、自動的にプロパティを設定していることが確認できます。

    Hello World!

この演習は、Seasar.ExamplesプロジェクトのSeasar.Examples/Reference/AutoBinding以下に用意されています。

© Copyright The Seasar Project and the others 2004-2009, all rights reserved.