กรอบการฉีด. NET Dependency ใดที่ควรพิจารณา [ปิด]


386

C # /. NET Dependency Injection Framework ใดที่ควรพิจารณา? และสิ่งที่คุณสามารถพูดเกี่ยวกับความซับซ้อนและความเร็วของพวกเขา


13
IoC Container Benchmark - การเปรียบเทียบประสิทธิภาพมีตารางเปรียบเทียบประสิทธิภาพและคุณสมบัติสำหรับผลิตภัณฑ์มากกว่า 20 รายการและอัปเดตให้ทันสมัยอยู่เสมอ มันแนะนำSimple Injector
Michael Freidgeim

ฉันขอขอบคุณ Ninject & Maestro ฉันมีความสุขที่คำตอบที่ได้รับการจัดอันดับสูงสุดกล่าวว่าเป็น "ความพึงพอใจสูงสุด"
Razvan Dumitru

6
ฉันขอย้ำว่าก่อนที่คุณจะดูในคอนเทนเนอร์ IoC คุณควรจัดการโดยไม่มี ทำการเดินสายและการฉีดด้วยตนเองมันไม่ซับซ้อนหรือต้องใช้รหัสจำนวนมากเลยเว้นแต่ว่าคุณมีระบบที่ซับซ้อนหรือมีขนาดใหญ่ เมื่อคุณรู้สึกว่าคุณเข้าใจและกลายเป็น combersome คุณจะ fited ดีกว่าที่จะเข้าใจชนิดของกรอบ wuold ช่วยคุณ แต่ไม่มีกฎที่บอกว่าโครงการต้องมีคอนเทนเนอร์ IoC เพื่อให้สามารถทำ DI ได้อย่างถูกต้อง
ร่า

1
เริ่มต้นด้วยไม่มี สร้างกราฟวัตถุที่ต้องการด้วยตนเอง กรอบงานที่แตกต่างกันมีวิธีการที่แตกต่างกันซึ่งขึ้นอยู่กับความต้องการของคุณ ก่อนที่จะเลือกหนึ่งคุณต้องรู้จักคุณสมบัติที่คุณต้องการมากที่สุด
Fabio

เนื่องจาก dotnetcore เป็นอนาคตคุณอาจติดอยู่กับการสนับสนุน DI ในตัว มันดีมากและปรับแต่งได้สูง
ATL_DEV

คำตอบ:


339

แก้ไข (ไม่ใช่โดยผู้เขียน): มีรายการที่ครอบคลุมของกรอบ IoC ที่https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc :

  • Castle Windsor - Castle Windsor เป็นพันธุ์ที่ดีที่สุด Inversion of Control container สำหรับ. NET และ Silverlight
  • Unity - คอนเทนเนอร์การฉีดขึ้นต่อกันแบบพึ่งพาน้ำหนักเบาพร้อมการสนับสนุนคอนสตรัคเตอร์คุณสมบัติและการเรียกเมธอด
  • Autofac -. คอนเทนเนอร์ IoC. NET ที่น่าติดตาม
  • DryIoc - เรียบง่ายรวดเร็วทุกคอนเทนเนอร์ IoC ที่มีคุณสมบัติครบถ้วน
  • Ninject - นินจาของ. NET หัวฉีดพึ่งพา
  • โครงสร้างแผนที่ - คอนเทนเนอร์ IoC / DI ต้นฉบับสำหรับ. Net
  • Spring.Net - Spring.NET เป็นเฟรมเวิร์กแอปพลิเคชันโอเพนซอร์ซ
  • LightInject - คอนเทนเนอร์ IoC น้ำหนักเบาเป็นพิเศษ
  • Simple Injector - Simple Injector เป็นห้องสมุด Dependency Injection (DI) ที่ใช้งานง่ายสำหรับ. NET 4+ ที่รองรับ Silverlight 4+, Windows Phone 8, Windows 8 รวมถึงแอพ Universal และ Mono
  • Microsoft.Extensions.DependencyInject - คอนเทนเนอร์ IoC เริ่มต้นสำหรับแอปพลิเคชัน ASP.NET Core
  • Scrutor - แอสเซมบลีส่วนขยายการสแกนสำหรับ Microsoft ส่วนขยายการอ้างอิงการอ้างอิง
  • VS MEF - การใช้งานกรอบความสามารถในการจัดการ (MEF) ที่ใช้โดย Visual Studio
  • TinyIoC - ใช้งานง่ายไม่ยุ่งยาก Inversion of Control Container สำหรับโครงการขนาดเล็กห้องสมุดและผู้เริ่มต้น

คำตอบเดิมมีดังนี้


ฉันคิดว่าฉันอาจจะจู้จี้จุกจิกที่นี่ แต่สิ่งสำคัญที่ควรทราบคือ DI (Dependency Injection) เป็นรูปแบบการเขียนโปรแกรมและอำนวยความสะดวกโดย แต่ไม่ต้องการกรอบ IoC (Inversion of Control) กรอบ IoC เพียงทำให้ DI ง่ายขึ้นและพวกเขาก็ให้ผลประโยชน์อื่น ๆ เป็นจำนวนมากกว่า DI

ที่ถูกกล่าวว่าฉันแน่ใจว่านั่นคือสิ่งที่คุณถาม เกี่ยวกับ IoC Frameworks; ฉันเคยใช้Spring.NetและCastleWindsor บ่อยครั้ง แต่ความเจ็บปวดที่แท้จริงในเบื้องหลังคือสิ่งที่ XML ที่น่ารำคาญที่คุณต้องเขียน! ตอนนี้พวกเขากำลังเคลื่อนไหวด้วยวิธีนี้ดังนั้นฉันจึงใช้StructureMapในปีที่แล้วหรือมากกว่านั้นและเนื่องจากมันได้ย้ายไปยังการตั้งค่าที่คล่องแคล่วโดยใช้ตัวพิมพ์ทั่วไปที่แข็งแกร่งและรีจิสทรีสิ่งกีดขวางความเจ็บปวดในการใช้ IoC ได้ลดลง ต่ำกว่าศูนย์! ฉันได้รับรู้ว่าการกำหนดค่า IoC ของฉันได้รับการรวบรวมในเวลารวบรวม (ส่วนใหญ่) และฉันไม่มีอะไรนอกจากความสุขจากโครงสร้างของแผนที่และความเร็ว ฉันจะไม่พูดว่าคนอื่นช้าในรันไทม์ แต่พวกเขายากสำหรับฉันที่จะติดตั้งและความยุ่งยากมักจะชนะในวันนั้น

ปรับปรุง

ฉันใช้Ninjectกับโปรเจ็กต์ล่าสุดของฉันและรู้สึกยินดีอย่างยิ่งที่ได้ใช้ คำพูดทำให้ฉันผิดหวังเล็กน้อยที่นี่ แต่ (อย่างที่เราพูดกันในสหราชอาณาจักร) กรอบงานนี้คือ 'สุนัข' ฉันขอแนะนำเป็นอย่างยิ่งสำหรับโครงการเขตข้อมูลสีเขียวที่คุณต้องการเปิดใช้งานและทำงานได้อย่างรวดเร็ว ฉันได้รับทั้งหมดที่ฉันต้องการจากชุดมหัศจรรย์ของ Ninject screencastsโดย Justin Etheredge ฉันไม่เห็น Ninject ที่ปรับให้พอดีกับ retro เป็นรหัสที่มีอยู่เป็นปัญหาเลย แต่จากนั้นอาจกล่าวได้เหมือนกันว่าStructureMapในประสบการณ์ของฉัน มันจะเป็นตัวเลือกที่ยากลำบากในการก้าวไปข้างหน้าระหว่างสองสิ่งนี้ แต่ฉันอยากจะมีการแข่งขันมากกว่าความซบเซาและมีการแข่งขันที่ดีต่อสุขภาพ

screencasts IoC อื่น ๆ ยังสามารถพบได้ที่นี่ใน Dimecasts


1
มันยอดเยี่ยมมากที่ได้เห็นคุณภาพตอบคำถามที่ดีขึ้นเกี่ยวกับ liners หนึ่งตัว คุณทำให้ฉันมั่นใจที่จะตรวจสอบโครงสร้างแผนที่
Chris Marasti-Georg

7
ดี แต่เป็นธรรม - วินด์เซอร์มีอินเทอร์เฟซที่คล่องแคล่วเต็มเปี่ยมมากตอนนี้เช่นกัน
Krzysztof Kozmic

คุณสามารถอธิบายได้ว่าอะไรคือ "โฮสต์ของผลประโยชน์อื่น ๆ " กรอบ IoC ที่ให้นอกเหนือจากการติดตั้ง DI อย่างง่าย?
fearofawhackplanet

@fearofawhackplanet หนึ่งสิ่งเดียวที่ภาชนะ IoC สามารถทำเช่นนั้นไม่สามารถทำได้ด้วยคนจน DIคือการสกัดกั้น สรุปได้ดีที่นี่: kenneth-truyers.net/2013/05/16/…
Mathieu Guindon

1
ฉันได้อ่านแหล่งข้อมูลสองแห่งที่บอกว่า Ninject นั้นเป็นpalmmedia.de/blog/2011/8/30/…ที่ช้าที่สุดและstackoverflow.com/questions/4581791/…
ลุค T โอไบรอัน

77

ขึ้นอยู่กับสิ่งที่คุณต้องการเพราะแต่ละคนมีข้อดีและข้อเสีย

  1. Spring.NETเป็นผู้ใหญ่ที่สุดเมื่อออกจาก Spring จากโลก Java Spring มีไลบรารีเฟรมเวิร์กมากมายที่ขยายให้รองรับเว็บ, Windows และอื่น ๆ
  2. Castle Windsorเป็นหนึ่งในที่สุดที่ใช้กันอย่างแพร่หลายในแพลตฟอร์ม. NET และมีระบบนิเวศที่ใหญ่ที่สุดมีการกำหนดค่าสูง / ขยายได้มีการจัดการอายุการใช้งานที่กำหนดเองการสนับสนุน AOP ได้รับการสนับสนุน NHibernate โดยธรรมชาติและเป็นภาชนะที่น่ากลัว วินด์เซอร์เป็นส่วนหนึ่งของกองทั้งหมดซึ่งรวมถึงโมโนเรล, Active Record, ฯลฯ NHibernate สร้างขึ้นบนวินด์เซอร์
  3. Structure Map มีการกำหนดค่าที่หลากหลายและละเอียดมากผ่าน DSL ภายใน
  4. Autofacเป็นคอนเทนเนอร์ IoC ของยุคใหม่ที่มีการสนับสนุนการเขียนโปรแกรมการทำงานโดยธรรมชาติทั้งหมด นอกจากนี้ยังใช้แนวทางที่แตกต่างในการจัดการอายุการใช้งานกว่าวิธีอื่น Autofac ยังคงเป็นสิ่งใหม่มาก แต่มันก็ผลักดันบาร์ในสิ่งที่เป็นไปได้ด้วย IoC
  5. Ninject ฉันเคยได้ยินก็คือกระดูกที่เปลือยเปล่ามากขึ้นเมื่อมีความพยายามน้อย
  6. เครื่องมือจำแนกที่ใหญ่ที่สุดUnityคือ: มาจากและสนับสนุนโดย Microsoft (p & p) ความสามัคคีมีประสิทธิภาพที่ดีมากและมีเอกสารที่ยอดเยี่ยม นอกจากนี้ยังสามารถกำหนดค่าได้อย่างมาก มันไม่มีเสียงระฆังและเสียงทั้งหมดของแผนที่ปราสาท / โครงสร้าง

โดยสรุปแล้วมันขึ้นอยู่กับสิ่งที่สำคัญกับคุณ ฉันจะเห็นด้วยกับคนอื่น ๆ ในการไปและประเมินและดูว่าอันไหนเหมาะ สิ่งที่ดีคือคุณมีโดนัทให้เลือกมากกว่าแค่ต้องมีเยลลี่


4
Autofac เป็นจริงไม่ใหม่เพื่อให้มันเป็นเรื่องที่เก่ากว่าความสามัคคี :)
นิโคลัส Blumhardt

1
ฉันว่ามันใหม่กว่า Unity ไหม? ฉันบอกว่ามันเป็นยุคใหม่ ... นั่นคือฉันหมายถึงมันเป็นธรรมชาติที่ใช้งานได้ ตกลงสิ่งที่ฉันบอกว่ามันยังใหม่มากสิ่งที่ฉันหมายถึงแม้ว่ามันเป็นธรรมชาติไม่ใช่ว่ามันเป็นเรื่องใหม่ :-)
Glenn Block

2
@Krzysztof - ฉันพบว่า Unity ตายง่าย (อย่างน้อยเมื่อกำหนดค่าอย่างคล่องแคล่วในรหัส) คุณรู้สึกเจ็บปวดอะไร
TrueWill


6
นี่คือมาตรฐานประสิทธิภาพที่น่าสนใจ: palmmedia.de/Blog/2011/8/30/…
Steven

35

Autofac https://github.com/autofac/Autofacมันเร็วและดีจริงๆ นี่คือลิงค์ที่มีการเปรียบเทียบ (ทำหลังจาก Ninject แก้ไขปัญหาการรั่วไหลของหน่วยความจำ)

http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html


ฉันชอบ autofac แต่ก็ไม่เร็วอย่างแน่นอน ในฐานะที่เป็นสตีเว่นเชื่อมโยงด้านบน: palmmedia.de/Blog/2011/8/30/…
Serj Sagan

18

Ninject นั้นยอดเยี่ยม ดูเหมือนว่าจะเร็วมาก แต่ฉันไม่ได้ทำการเปรียบเทียบใด ๆ ฉันรู้ว่า Nate ผู้เขียนทำการเปรียบเทียบระหว่าง Ninject กับกรอบ DI อื่น ๆ และกำลังมองหาวิธีเพิ่มเติมเพื่อปรับปรุงความเร็วของ Ninject

ฉันได้ยินผู้คนมากมายที่ฉันเคารพพูดสิ่งดีๆเกี่ยวกับ StructureMap และ CastleWindsor ในความคิดของฉันมีสามคนที่จะต้องดู


1
Ninject ได้รับความนิยม แต่ไม่เร็วอย่างแน่นอน จริงๆแล้วมันเป็นหนึ่งในสิ่งที่ช้าที่สุดที่นั่น: palmmedia.de/Blog/2011/8/30/…
Serj Sagan

13

ฉันใช้Simple Injector :

Simple Injector เป็นไลบรารีการฉีดที่พึ่งพาง่ายและรวดเร็วซึ่งใช้แนวทางปฏิบัติที่ดีที่สุดเพื่อเป็นแนวทางในการแก้ปัญหาของคุณสู่ความสำเร็จ


4
ระวังบางคนคิดว่า locator ของบริการป้องกันรูปแบบรวมถึงคนที่ใช้มันสำหรับบางเวลาและแม้กระทั่งเขียนห้องสมุดสำหรับมัน: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern
Philippe

4
Steven ยังเป็นผู้สร้าง Simple Injector ... ดังนั้นนี่เป็นคำตอบแบบสแปม ... โดยเฉพาะอย่างยิ่งที่เขาใช้บัญชี alt เพื่อทำ ... Simple Injector นั้นค่อนข้างเร็วทีเดียว: palmmedia.de/Blog/2011/
8/30

8

ฉันเป็นแฟนตัวยงของปราสาท ฉันชอบสิ่งอำนวยความสะดวกที่มีให้นอกเหนือจากเรื่องราว IoC Container มันง่ายมากที่ใช้ NHibernate, การบันทึก, AOP และอื่น ๆ ฉันยังใช้Binsorสำหรับการกำหนดค่าด้วย Boo และตกหลุมรัก Boo เป็นภาษาเพราะมันเป็นเช่นนั้น


5

ฉันสามารถแนะนำ Ninject มันเหลือเชื่อใช้งานง่ายและรวดเร็ว แต่ถ้าคุณไม่ต้องการการกำหนดค่า XML มิฉะนั้นคุณควรใช้วินด์เซอร์


1
ไม่เร็ว! มันเป็นหนึ่งในเฟรมเวิร์ก DI ที่ช้าที่สุดที่นั่น! palmmedia.de/Blog/2011/8/30/…
Serj Sagan

@Serj Sagan เพื่อความยุติธรรมผลลัพธ์เหล่านั้นเป็นแบบโบราณ (ตอนนี้ 6 ปี)
Timothy Kanski


5

ฉันใช้เวลาส่วนที่ดีกว่าของวันที่ต้องดิ้นรนไม่ประสบความสำเร็จเพื่อให้ตัวอย่าง Spring.NET ที่ง่ายที่สุดทำงานได้ ไม่สามารถหาวิธีหาชุดประกอบของฉันจากไฟล์ XML ได้ ในอีกประมาณ 2 ชั่วโมงฉันก็สามารถใช้งาน Ninject ได้รวมถึงการทดสอบการรวมกับ NUnit และ MSTest


4

ฉันเคยใช้Spring.NETมาก่อนและประสบความสำเร็จอย่างมาก ฉันไม่เคยสังเกตเห็นค่าใช้จ่ายที่เป็นกอบเป็นกำ แต่โครงการที่เราใช้มันค่อนข้างหนักในตัวของมันเอง ใช้เวลาเพียงเล็กน้อยในการอ่านเอกสารเพื่อติดตั้ง


2

สิ่งที่ยอดเยี่ยมเกี่ยวกับ C # คือการติดตามเส้นทางที่ถูกตีโดยนักพัฒนา Java เป็นเวลาหลายปีก่อนหน้านี้ ดังนั้นคำแนะนำของฉันโดยทั่วไปเมื่อพูดถึงการมองหาเครื่องมือในลักษณะนี้คือการหาคำตอบที่มั่นคงของ Java และดูว่ามีการดัดแปลง. NET หรือไม่

ดังนั้นเมื่อมันมาถึงการ DI (และมีตัวเลือกมากมายออกมีนี้จริงๆเป็นเรื่องของรสชาติ) เป็นSpring.NET นอกจากนี้ยังเป็นการฉลาดที่จะทำการวิจัยผู้คนที่อยู่เบื้องหลังโครงการ ฉันไม่มีปัญหาในการแนะนำผลิตภัณฑ์ SourceGear สำหรับการควบคุมแหล่งที่มา (นอกการใช้งาน) เพราะฉันนับถือ Eric Sink ฉันเคยเห็นมาร์คพอลแล็คพูดแล้วฉันจะพูดยังไงดี

ในท้ายที่สุดมีกรอบ DI จำนวนมากและทางออกที่ดีที่สุดของคุณคือการทำตัวอย่างโครงการที่มีไม่กี่โครงการและเลือกการศึกษา

โชคดี!


2

ฉันคิดว่าจุดเริ่มต้นที่ดีคือ Ninject เป็นเรื่องใหม่และคำนึงถึงการปรับจูนอย่างรวดเร็วและเร็วมาก เนทนักพัฒนามีเว็บไซต์ที่ยอดเยี่ยมและการสนับสนุนที่ยอดเยี่ยม


ทำไมคุณพูดว่ารวดเร็ว มันเป็นหนึ่งในสิ่งที่ช้าที่สุดที่มี! palmmedia.de/Blog/2011/8/30/…
Serj Sagan

2

Spring.Net ค่อนข้างแข็งแกร่ง แต่เอกสารใช้เวลาพอสมควรในการลุย Autofac นั้นดีและในขณะที่รองรับ. Net 2.0 คุณต้องใช้ VS 2008 เพื่อคอมไพล์หรือใช้บรรทัดคำสั่งเพื่อสร้างแอปของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.