Simple Injectorを使ってみた


手軽に利用できるDIコンテナ「Simple Injector」を使ってみました。
パッケージ開発のアドオンの受け口などで活用できそうです。

●このデモで利用するクラス一覧
クラス/インタフェース 説明
Program.cs このクラスで以下の処理を行います。
・コンテナ生成
・注入オプジェクト登録
・コンテナの登録内容の検証
・InjectionTargetClassのメソッドを実行
IProxy.cs 注入オブジェクトのインタフェースです。
HogeProxy.cs 注入オブジェクトの具象クラス。
FooProxy.cs 注入オブジェクトの具象クラス。
BarClass.cs 注入オブジェクトの具象クラス。(IProxyは実装していない。)
InjectionTargetClass.cs オブジェクト注入対象のクラスです。
このクラスで注入されたオブジェクトを利用します。
コンストラクタの引数に注目してください。
コンテナに登録されたオブジェクトが渡されます。

●Program.cs
  1. using SimpleInjector;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. class Program {
  10.  
  11. private static Container container;
  12.  
  13. static void Main(string[] args) {
  14. container = new Container();
  15.  
  16. //デフォルトのLifestyleを確認
  17. Console.WriteLine("デフォルトのLifestyle : " + container.Options.DefaultLifestyle.ToString());
  18.  
  19. container.Register(Lifestyle.Singleton);
  20. //登録をFooProxyに切替えると、利用側のクラスを変更せずに処理を切り替えれます。
  21. //container.Register(Lifestyle.Singleton);
  22. //コンストラクタにRegister()していないTypeの引数を渡す方法
  23. container.Register(() => new BarClass("bar"), Lifestyle.Singleton);
  24. container.Verify();
  25. // Useコンテナに登録していないが、コンストラクタインジェクションを行って必要な
  26. // オブジェクトを設定してインスタンスを作成してくれる。 (auto-wiring)
  27. var a = container.GetInstance();
  28. a.Write();
  29. //自動でコンソールが閉じるの防ぐ
  30. Console.ReadLine();
  31. }
  32. }
  33. }

●IProxy.cs
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// インタフェース
  11. ///
  12. public interface IProxy {
  13. void Write();
  14. }
  15. }

●HogeProxy.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// 注入クラスHoge
  11. ///
  12. class HogeProxy : IProxy {
  13. public void Write() {
  14. Console.WriteLine("hoge");
  15. }
  16. }
  17. }

●FooProxy.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// 注入クラスFoo
  11. ///
  12. class FooProxy : IProxy {
  13. public void Write() {
  14. Console.WriteLine("foo");
  15. }
  16. }
  17. }

●BarClass.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace SimpleInjectorInConsoleApp {
  8. ///
  9. /// 注入クラスBar
  10. /// ※ IProxyを実装していない
  11. ///
  12. public class BarClass {
  13. private string val = "";
  14. public BarClass(string str) {
  15. val = str;
  16. }
  17.  
  18. public void Write() {
  19. Console.Write(val);
  20. }
  21. }
  22. }

●InjectionTargetClass.cs
  1. using SimpleInjector;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace SimpleInjectorInConsoleApp {
  9. ///
  10. /// オブジェクト注入対象クラス
  11. ///
  12. public class InjectionTargetClass {
  13. private readonly IProxy _proxy;
  14. private readonly Container _container;
  15. private readonly BarClass _dummy;
  16.  
  17. public InjectionTargetClass(IProxy proxy, Container container, BarClass dummy) {
  18. _proxy = proxy;
  19. _container = container;
  20. _dummy = dummy;
  21. }
  22.  
  23. public void Write() {
  24. _proxy.Write();
  25. Console.WriteLine("注入コンテナのDefaultLifestyle : " +
  26. _container.Options.DefaultLifestyle);
  27. _dummy.Write();
  28. }
  29. }
  30. }

●実行結果

0 件のコメント:

コメントを投稿

厳選 Visual Studioの便利なショートカット

  エラー箇所にジャンプ 「Ctrl + Shift + F12」 ブレークポイント 設定/解除 「F9」 有効化/無効化 「Ctrl + F9」 ViEmu特有 「:ls」:バッファナンバーのリストを表示。 「:b2」:バッファ2のファイルを開く。 「:n」:次のバッファのファ...