以下のサンプルを実行する場合は、セットアップを行う必要があります。 Seasar.ExamplesプロジェクトはWindowsアプリケーションとして作成されています。 Seasar.Examplesプロジェクトをスタートアッププロジェクトに設定しF5キーを押して開始すると、 ExamplesExplorerが起動しExampleのソースコードと実行結果を確認することができます。
コンストラクタ・インジェクションを使ってメッセージを表示しましょう。作成するファイルは以下のとおりです。
先ず最初はインターフェースを考えます。インターフェースと実装を分離することで、 コンポーネントの利用者はインターフェースを知っていれば実装のことは知らなくても済むようになります。 また、テストの時には実装をモックに置き換えることで簡単にテストできるようになります。
C#
namespace Seasar.Examples.Reference.Injection { public interface IHello { void 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); } } }
メッセージをコンポーネントに設定するのは、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>
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以下に用意されています。
プロパティ・インジェクションを使ってメッセージを表示しましょう。作成するファイルは以下のとおりです。
インターフェースはコンストラクタ・インジェクションの場合と同じです。 プロパティに対するgetアクセサ、setアクセサを定義する必要はありません。 なぜなら、Dependency Injectionするのにコンストラクタを使うのかsetアクセサを使うのかは実装の問題だからです。
C#
namespace Seasar.Examples.Reference.Injection { public interface IHello { void 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); } } }
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>
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以下に用意されています。
メソッド・インジェクションを使ってメッセージを表示しましょう。作成するファイルは以下のとおりです。
追加のメソッドを複数回呼び出すようなケースが代表的な使い方ですが、 今回の演習では、インターフェースはコンストラクタ・インジェクションの場合と同じにしました。
C#
namespace Seasar.Examples.Reference.Injection { public interface IHello { void 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()); } } }
まずは、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>
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以下に用意されています。
自動バインディングでメッセージを表示してみましょう。作成するファイルは以下のとおりです。
C#
namespace Seasar.Examples.Reference.AutoBinding { public interface IHello { void 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"]); } } }
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>
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以下に用意されています。
自動バインディングでメッセージを表示してみましょう。作成するファイルは以下のとおりです。
C#
namespace Seasar.Examples.Reference.AutoBinding { public interface IHello { void 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"]); } } }
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>
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以下に用意されています。