Enterprise Library Unityと他のIoCコンテナー[非公開]
-
03-07-2019 - |
質問
Enterprise Library Unityと他のIoCコンテナ(Windsor、Spring.Net、Autofac ..)を使用する場合の長所と短所は何ですか?
解決
ユーザーグループのプレゼンテーションを準備しています。そういうものとして、私はちょうどそれらの束を通過しました。つまり、AutoFac、MEF、Ninject、Spring.Net、StructureMap、Unity、Windsorです。
私は90%のケース(主に人々がとにかくIOCを使用するものであるコンストラクターインジェクション)を披露したかったのです。 こちらで解決策を確認できます(VS2008)
そのため、いくつかの重要な違いがあります:
- 初期化
- オブジェクトの取得
それぞれに他の機能もあります(一部にはAOPとより優れたギズモがありますが、通常、IOCに必要なのはオブジェクトの作成と取得だけです)
注:CommonServiceLocator: http:// wwwを使用すると、異なるライブラリオブジェクトの取得の違いを打ち消すことができます。 codeplex.com/CommonServiceLocator
これにより、初期化が残ります。これは、コード経由またはXML構成(app.config / web.config / custom.config)の2つの方法で行われます。両方をサポートするものもあれば、1つだけをサポートするものもあります。注意してください:IoCを支援するために属性を使用するものもあります。
だからここに私の違いの評価があります:
Ninject
コードの初期化のみ(属性付き)。ラムダが好きであることを願っています。初期化コードは次のようになります。
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
StructureMap
初期化コードまたはXMLまたは属性。 v2.5も非常にラムダ型です。全体として、これは私のお気に入りの1つです。 StructureMapが属性を使用する方法に関するいくつかの非常に興味深いアイデア。
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = false;
x.ForRequestedType<ICustomerRepository>()
.TheDefaultIsConcreteType<CustomerRepository>()
.CacheBy(InstanceScope.Singleton);
x.ForRequestedType<ICustomerService>()
.TheDefaultIsConcreteType<CustomerService>()
.CacheBy(InstanceScope.Singleton);
x.ForConcreteType<Form1>();
});
Unity
初期化コードとXML。素晴らしいライブラリですが、XML構成は苦痛です。マイクロソフトまたは高速道路店用の優れたライブラリ。 コードの初期化は簡単です:
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
Spring.NET
XMLは、私が知る限りできるだけ近くにあります。ただし、Spring.Netは機能のために、IoCができることをすべて実行します。しかし、ユニット化する唯一の方法はXMLを使用することであるため、一般的に.netショップでは回避されます。ただし、多くの.net / Javaショップは、Spring.Netの.netバージョンとJava Springプロジェクトの類似性のためにSpring.Netを使用しています。
注: Spring.NETの導入により、コードの構成が可能になりました。 CodeConfig 。
ウィンザー
XMLおよびコード。 Spring.Netのように、Windsorはあなたがやりたいことを何でもします。 Windsorは、おそらく最も人気のあるIoCコンテナーの1つです。
IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");
Autofac
XMLとコードの両方を混在させることができます(v1.2で)。素敵なシンプルなIoCライブラリ。それほど大騒ぎせずに基本を行うようです。コンポーネントのローカルスコープと明確に定義されたライフタイム管理を備えたネストされたコンテナをサポートします。
初期化方法は次のとおりです。
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
今日選択する必要がある場合:おそらくStructureMapを使用します。 C#3.0言語機能の最適なサポートと、初期化の柔軟性が最も高くなります。
注:Chris Brandsmaは元の答えをブログ投稿。
他のヒント
私が見た限りでは、いくつかの実装の詳細を除いて、それらはほとんど同じです。 Unityが競合に対して持つ最大の利点は、Microsoftによって提供されていることです。OSSを恐れている企業はたくさんあります。
1つの欠点は、かなり新しいため、古いプレーヤーが既に整理しているバグがある可能性があることです。
とは言っても、こちらをご覧ください。
古いスレッドですが、unity vs spring.netと入力したときにGoogleが最初に示したのはこのためです...
XML構成が気に入らない場合、SpringはCodeConfigを実行します
http://www.springframework.net/codeconfig/doc-latest / reference / html /
また、Springは単なるDIコンテナではありません。ドキュメントの「モジュール」セクションを見ると、DIコンテナはそれが行う膨大なスタックの基盤です。
間違えても訂正してくださいnofollow noreferrer "> Autofac XML設定
Springには、パラメータの名前または位置に基づいて、パラメータをコンストラクタまたはプロパティに注入できる機能が1つあります。これは、パラメーターまたはプロパティが単純なタイプ(整数、ブールなど)の場合に非常に便利です。 こちらの例をご覧ください。これは、Springがコードで設定を行えないことを本当に補うとは思わない。
Windsorもこれを行うことができ、設定ではなくコードで行うことができます。 (間違っている場合は修正してください、ここで聞いたことを経由します)。
Unityでこれができるかどうか知りたい。
注意すべき点が1つあります。Ninjectは、(Webサイトごとに)コンテキスト依存の注入をサポートする唯一のIoCコンテナーです。ただし、他のIoCコンテナーの経験がないため、それが成り立つかどうかはわかりません。
2セントを追加するために、StructureMapとUnityの両方を試しました。私はStructureMapが不十分/誤解されて文書化されており、設定するのが苦痛であり、使用するには不格好であることを発見しました。同様に、解決時のコンストラクター引数オーバーライドのようなシナリオをサポートしていないようです。これは私にとって重要な使用法のポイントでした。だから私はそれを落とし、Unityを使い、約20分でやりたいことをやらせました。
個人的にUnityを使用していますが、それはMicrosoftからであるためです。私は1つの理由で決定を後悔しています:それに対して持っている最大のことは1つの大きな「バグ」ですこれにより、常に例外がスローされます。デバッグ中は例外を無視できます。ただし、例外をスローするとコストのかかる操作になるため、実行するとアプリケーションの動作が非常に遅くなります。たとえば、現在「修正中」ですUnityの例外がページのレンダリング時間に余分な 4秒を追加するコードの1つの場所にこの例外があります。詳細と回避策については、次を参照してください。