Simple Injectorを使ってみた


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

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

●Program.cs
using SimpleInjector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInjectorInConsoleApp {
    class Program {

        private static Container container;

        static void Main(string[] args) {
            
            container = new Container();

            //デフォルトのLifestyleを確認
            Console.WriteLine("デフォルトのLifestyle : " + container.Options.DefaultLifestyle.ToString());

            container.Register(Lifestyle.Singleton);
            //登録をFooProxyに切替えると、利用側のクラスを変更せずに処理を切り替えれます。
            //container.Register(Lifestyle.Singleton);

            //コンストラクタにRegister()していないTypeの引数を渡す方法
            container.Register(() => new BarClass("bar"), Lifestyle.Singleton);

            container.Verify();

            // Useコンテナに登録していないが、コンストラクタインジェクションを行って必要な
            // オブジェクトを設定してインスタンスを作成してくれる。 (auto-wiring)
            var a = container.GetInstance();
            a.Write();

            //自動でコンソールが閉じるの防ぐ
            Console.ReadLine();
        }
    }
}

●IProxy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInjectorInConsoleApp {
    /// 
    /// インタフェース
    /// 
    public interface IProxy {
        void Write();
    }
}

●HogeProxy.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInjectorInConsoleApp {
    /// 
    /// 注入クラスHoge
    /// 
    class HogeProxy : IProxy {
        public void Write() {
            Console.WriteLine("hoge");
        }
    }
}

●FooProxy.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInjectorInConsoleApp {
    /// 
    /// 注入クラスFoo
    /// 
    class FooProxy : IProxy {
        public void Write() {
            Console.WriteLine("foo");
        }
    }
}

●BarClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInjectorInConsoleApp {
    /// 
    /// 注入クラスBar
    /// ※ IProxyを実装していない
    /// 
    public class BarClass {
        private string val = "";
        public BarClass(string str) {
            val = str; 
        }

        public void Write() {
            Console.Write(val);
        }
    }
}

●InjectionTargetClass.cs
using SimpleInjector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInjectorInConsoleApp {
    /// 
    /// オブジェクト注入対象クラス
    /// 
    public class InjectionTargetClass {
        private readonly IProxy _proxy;
        private readonly Container _container;
        private readonly BarClass _dummy;

        public InjectionTargetClass(IProxy proxy, Container container, BarClass dummy) {
            _proxy = proxy;
            _container = container;
            _dummy = dummy;
        }

        public void Write() {
            _proxy.Write();
            Console.WriteLine("注入コンテナのDefaultLifestyle : " + 
                _container.Options.DefaultLifestyle);
            _dummy.Write();
        }
    }
}

●実行結果

0 件のコメント:

コメントを投稿

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

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