web-dev-qa-db-ja.com

Ninject vs Unity for DI

ASP.net MVCを使用しています。

これらのうち、最高のDIフレームワークはNinjectとUnityのどちらですか?それはなぜですか?

100
Miral

前回それらのいずれかを見たとき、Ninjectの方がわずかに優れていることがわかりました。しかし、どちらにも欠点があります。

Ninjectには、より流な構成スキームがあります。 Unityは、主にXML構成に依存しているようです。 Ninjectの主な欠点は、[Inject]属性を追加するためにコード内のあらゆる場所でNinject.Coreを参照する必要があることです。

私が尋ねる場合、なぜこれらの2つに選択を制限するのですか? Castle.Windsor、Autofac、StructureMapは、少なくとも同等以上であると思います。

45
Mendelt

これは古い質問ですが、私の考えは次のとおりです。

私は個人的にNinjectが好きです。私は、流れるようなインターフェースとXMLの回避が好きです。私は一般的にXMLが好きですが、この種の構成は好きではありません。特に、リファクタリングが含まれる場合、流interfacesなインターフェイスにより修正が容易になります。

StructureMapのObjectFactoryが恋しいですが、それをNinjectに追加する簡単な回避策があります。

Jefferyが指摘しているように、コンストラクターが1つしかない場合は[Inject]属性を使用する必要はありません。

流れるようなインターフェイスを好むのは、XMLを回避するだけでなく、影響するものを変更するとコンパイル時エラーが発生するためです。 XML構成はそうではなく、覚えておいてくださいを少なくすればするほど、私はより良い状態になります。

44
roberocity

インジェクションテクニックに関係なく、デバッグが非常に難しいStackOverflowExceptionをスローするUnityではなく、インジェクションコンストラクターを使用すると、Ninjectは循環依存関係を検出します。

10
IMLiviu

私はメンデルトに同意します。「最高の」DIフレームワークはありません。それはただ状況に依存し、彼らはすべて長所と短所を持っています。 David HaydenがDotNet Rocksで、EntLibの残りを使用し、それに精通している場合、Unityが推奨される選択肢であると述べたと思います。私が個人的にUnityを使用しているのは、私の言っていることがわかると、顧客がDLLでMicrosoft Enterprise Library(Unity)と言っているという事実が好きだからです。

インターフェースとそれらの具体的な実装の両方を設定するために両方のxml構成を使用しますが、次に、注入するときにコードで属性を使用します。

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

コード内:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

個人的に私はそれが何が起こるかを明確にすると思いますが、もちろん、あなたはあなたのアプリケーション全体で統一への言及を持っていると主張することができます。それはあなた次第です。

9
Johan Leino

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

Unityはより高速ですが、最高ではありません

7
Cantinos