Ninject vs Unity untuk DI [tertutup]


104

Kami menggunakan ASP.net MVC.

Manakah dari berikut ini yang merupakan kerangka kerja DI terbaik Ninject atau Unity dan mengapa?


94
NInject lebih baik karena Anda dapat membeli magnet bermerek keren dari situs web mereka.
Ivan G.

5
Versi terbaru dari pertanyaan ini (bagaimanapun juga sangat mirip) yang mungkin berguna bagi sebagian orang: stackoverflow.com/questions/4581791/…
Jason Down

Jawaban:


46

Terakhir kali saya melihat salah satu dari mereka, saya menemukan Ninject sedikit lebih baik. Namun keduanya memiliki kekurangan.

Ninject memiliki skema konfigurasi fasih yang lebih baik. Unity tampaknya sebagian besar mengandalkan konfigurasi XML. Kelemahan utama Ninject adalah Anda harus mereferensikan Ninject.Core di mana pun dalam kode Anda untuk menambahkan atribut [Inject].

Jika saya mungkin bertanya, mengapa Anda membatasi pilihan Anda pada dua pilihan ini? Saya pikir Castle.Windsor, Autofac dan StructureMap setidaknya sama baiknya atau lebih baik.


47
Anda hanya perlu menggunakan atribut Inject jika ada lebih dari satu konstruktor dan Anda perlu memberi tahu Ninject konstruktor mana yang akan digunakan. Secara default menggunakan konstruktor dengan jumlah parameter terbanyak.
Jeffrey Cameron

11
Sementara itu, ada juga ekstensi resmi Ninject.Web.Mvc. Anda mengubah MvcApplication Anda untuk diturunkan dari NinjectHttpApplication, putar Kernel di dalamnya dan panggil RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) untuk mengurus semua pengontrol dalam rakitan yang diberikan. Sihir.
Michael Stum

18
Jawaban ini sekarang sangat tidak relevan dengan reagrd ke Ninject 2. Sementara pengaduan itu sah untuk Ninject 1, Ninject 2 memungkinkan seseorang untuk bekerja tanpa mengotori kelas dengan atribut. ninject2 akan beroperasi secara transparan tanpa perlu mengubah kelas Anda.
chillitom

3
Sama untuk kesatuan karena tampaknya sepenuhnya dapat dikonfigurasi melalui kode pada saat ini (v3.0.1304.1)
Eric

46

Saya tahu ini pertanyaan lama, tapi inilah pikiran saya:

Saya pribadi suka Ninject. Saya suka antarmuka yang lancar dan menghindari XML. Saya biasanya suka XML, hanya saja tidak untuk barang konfigurasi semacam ini. Terutama ketika refactoring terlibat, antarmuka yang lancar membuatnya lebih mudah untuk diperbaiki.

Saya merindukan ObjectFactory dari StructureMap, tetapi ada solusi mudah untuk menambahkannya ke Ninject.

Seperti yang ditunjukkan Jeffery, Anda tidak harus menggunakan atribut [Inject] jika Anda hanya memiliki satu konstruktor.

Saya menemukan bahwa saya lebih suka antarmuka yang lancar tidak hanya karena mereka menghindari XML, tetapi karena mereka menyebabkan kesalahan waktu kompilasi ketika saya mengubah sesuatu yang mempengaruhinya. Konfigurasi XML tidak dan semakin sedikit saya harus ingat untuk mengubah saya menjadi lebih baik.


10

Ninject mendeteksi dependensi melingkar jika Anda menggunakan Konstruktor Injeksi sebagai lawan dari Unity yang terlepas dari teknik injeksi hanya melempar StackOverflowException yang sangat sulit untuk di-debug.


9

Saya setuju dengan Mendelt, tidak ada kerangka DI "terbaik". Itu tergantung pada situasinya dan mereka semua memiliki pro dan kontra. pikir David Hayden mengatakan di DotNet Rocks bahwa Unity adalah pilihan yang lebih disukai jika Anda menggunakan EntLib lainnya dan sudah terbiasa dengannya. Saya pribadi menggunakan Unity karena pelanggan saya menyukai kenyataan bahwa dikatakan Microsoft Enterprise Library (Unity) di DLL, jika Anda mengerti apa yang saya katakan.

Saya menggunakan kedua konfigurasi xml untuk menyiapkan antarmuka dan implementasi konkretnya tetapi kemudian saya menggunakan atribut dalam kode saat menyuntikkan, seperti:

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

dan dalam kode:

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

Secara pribadi saya pikir itu membuatnya lebih jelas apa yang terjadi, tetapi tentu saja orang dapat berargumen bahwa Anda akan memiliki referensi tentang persatuan di seluruh aplikasi Anda. Terserah kamu.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.