NinjectとUnity for DI [終了]


104

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

どれが最良のDIフレームワークNinjectまたはUnityであり、それはなぜですか?


94
あなたは彼らのウェブサイトからクールなブランドの磁石を買うことができるので、NInjectはより良いです。
Ivan G.

5
何人かの人々が有用見つけることが、この質問(非常によく似たとにかく)の更新バージョン:stackoverflow.com/questions/4581791/...
ジェイソンダウン

回答:


46

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

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

質問するかもしれませんが、なぜこれらの2つに選択肢を限定しているのですか?Castle.Windsor、Autofac、StructureMapは少なくとも同じかそれ以上に優れていると思います。


47
複数のコンストラクターがあり、どのコンストラクターを使用するかをNinjectに通知する必要がある場合にのみ、Inject属性を使用する必要があります。デフォルトでは、パラメーターの数が最も多いコンストラクターを使用します。
ジェフリーキャメロン

11
その間、公式のNinject.Web.Mvc拡張機能もあります。NinjectHttpApplicationから派生するようにMvcApplicationを変更し、カーネルを起動してRegisterAllControllersIn(Assembly.GetExecutingAssembly())を呼び出して、指定されたアセンブリ内のすべてのコントローラーを処理します。マジック。
Michael Stum

18
この答えはNinject 2のreagrdとはかなり無関係になりました。この不満はNinject 1に対しては正当でしたが、Ninject 2では属性を持つクラスを散らかさずに作業できます。ninject2は、クラスを変更する必要なく透過的に動作します。
チリトム

3
この時点でコードを介して完全に構成可能であるように見えるため、単一性についても同じです(v3.0.1304.1)
Eric

46

これは古い質問であることは承知していますが、私の考えは次のとおりです。

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

StructureMapのObjectFactoryがありませんが、Ninjectに追加する簡単な回避策があります。

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

XMLを回避するだけでなく、影響を受けるものを変更するとコンパイル時エラーが発生するため、流暢なインターフェイスを好むことがわかりました。XML構成は変更され、変更を覚えておかなければならないほど、私はより良い生活を送ることができます。


10

注入手法に関係なく、デバッグが非常に難しいStackOverflowExceptionをスローするだけであるUnityとは対照的に、注入コンストラクターを使用する場合、Ninjectは循環依存関係を検出します。


9

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

インターフェイスとその具体的な実装をセットアップするために両方のxml構成を使用しますが、次に、注入時にコードで次のような属性を使用します。

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

そしてコードで:

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.