連載 Unity を使ってコードで依存性を注入する
Unity を使ってコードで依存性を注入する
はじめに
今回は依存性注入の簡単なサンプルを作成してみました。
1 インタフェースを用意
1 namespace UnityDemo002
2 {
3 public interface ILogger
4 {
5 //メッセージを出力する
6 void Write(string message);
7 }
8 }
メッセージを出力するメソッドだけのインタフェース。
2 インタフェースを実装するクラスを用意
1 namespace UnityDemo002
2 {
3 public class TextFileLogger : ILogger
4 {
5 public void Write(string message)
6 {
7 Console.WriteLine("Writed Log To File:\t" + message);
8 }
9 }
10
11 }
12
13 namespace UnityDemo002
14 {
15 public class DatabaseLogger : ILogger
16 {
17 public void Write(string message)
18 {
19 Console.WriteLine("Writed Log To Database:\t" + message);
20 }
21 }
22
23 }
3 注入配置
1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3 <!--Unity配置-->
4 <configSections>
5 <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
6 </configSections>
7 <unity>
8 <!--別名配置-->
9 <typeAliases>
10 <typeAlias alias="DatabaseLogger" type="UnityDemo002.DatabaseLogger, UnityDemo002" />
11 <typeAlias alias="TextFileLogger" type="UnityDemo002.TextFileLogger, UnityDemo002" />
12 <typeAlias alias="IFileLogger" type="UnityDemo002.ILogger, UnityDemo002" />
13 </typeAliases>
14 <!--注入インスタンス配置-->
15 <containers>
16 <container>
17 <types>
18 <type type="IFileLogger" mapTo="TextFileLogger" name="DBL"/>
19 <type type="IFileLogger" mapTo="DatabaseLogger" name="TextFL"/>
20 </types>
21 </container>
22 </containers>
23 </unity>
24 </configuration>
4 依存性注入します!
1 //DI コンテナを生成
2 IUnityContainer container = new UnityContainer();
3
4 //コンテナを配置する
5 UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
6 config.Configure(container);
7
8 //依存性を注入する
9 ILogger databaseLogger = container.Resolve<ILogger>("TextFL");
10 databaseLogger.Write("hello Unity!");
11 Console.ReadKey();
5 このコードを実行すると
と出力されます。
最後に
今回はコードで依存性を注入しました。構造関数を使った方法では、クラスを切り替えるにはコードを修正してリビルドする必要があるので、使う場面は少ないでしょう。
次は属性を使って依存性を注入する予定。
作成日時 2012-03-09 19:24:21