手軽に利用できる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 件のコメント:
コメントを投稿