手軽に利用できる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();
}
}
}
●実行結果