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