คำถามติดแท็ก dependency-injection

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

9
วิธีการหลีกเลี่ยงการพึ่งพาการสร้างบ้าฉีด?
ฉันพบว่าตัวสร้างของฉันเริ่มมีลักษณะเช่นนี้: public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2.... ) ด้วยรายการพารามิเตอร์ที่เพิ่มขึ้น เนื่องจาก "คอนเทนเนอร์" เป็นคอนเทนเนอร์ฉีดที่ขึ้นต่อกันของฉันทำไมฉันจึงทำสิ่งนี้ไม่ได้: public MyClass(Container con) สำหรับทุกชั้น? ข้อเสียคืออะไร? ถ้าฉันทำเช่นนี้มันให้ความรู้สึกเหมือนกำลังใช้ไฟฟ้าสถิตย์ กรุณาแบ่งปันความคิดของคุณเกี่ยวกับ IoC และบ้าคลั่งฉีดพึ่งพา

17
ฉันจะฉีดค่าคุณสมบัติลงใน Spring Bean ซึ่งกำหนดค่าโดยใช้คำอธิบายประกอบได้อย่างไร
ฉันมีถั่วสปริงจำนวนหนึ่งซึ่งหยิบขึ้นมาจาก classpath ผ่านคำอธิบายประกอบเช่น @Repository("personDao") public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao { // Implementation omitted } ในไฟล์ Spring XML มีการกำหนดPropertyPlaceholderConfigurer : <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/app.properties" /> </bean> ฉันต้องการฉีดคุณสมบัติอย่างใดอย่างหนึ่งจาก app.properites ลงในถั่วที่แสดงด้านบน ฉันไม่สามารถทำอะไรได้อย่างง่ายๆ <bean class="com.example.PersonDaoImpl"> <property name="maxResults" value="${results.max}"/> </bean> เนื่องจาก PersonDaoImpl ไม่มีคุณสมบัติในไฟล์ Spring XML (ถูกดึงจาก classpath ผ่านคำอธิบายประกอบ) ฉันได้เท่าที่ต่อไปนี้: @Repository("personDao") public …

5
ทำไมต้องใช้ @PostConstruct
ใน bean ที่@PostConstructถูกจัดการจะถูกเรียกใช้หลังจากตัวสร้างอ็อบเจ็กต์ Java ปกติ ทำไมฉันจะใช้@PostConstructเพื่อเริ่มต้นโดยถั่วแทนนวกรรมิกตัวเอง?

23
ฉีด Mockito mocks ลงใน Spring bean
ฉันต้องการฉีดวัตถุจำลอง Mockito ลงในถั่ว Spring (3+) เพื่อวัตถุประสงค์ในการทดสอบหน่วยกับ JUnit ขณะนี้การพึ่งพาถั่วของฉันถูกฉีดโดยใช้@Autowiredคำอธิบายประกอบในฟิลด์สมาชิกส่วนตัว ฉันได้พิจารณาการใช้ReflectionTestUtils.setFieldแต่อินสแตนซ์ bean ที่ฉันต้องการฉีดเป็นจริงพร็อกซีและดังนั้นจึงไม่ประกาศเขตข้อมูลสมาชิกส่วนตัวของคลาสเป้าหมาย ฉันไม่ต้องการสร้าง setter สาธารณะเพื่อการพึ่งพาเนื่องจากฉันจะทำการปรับเปลี่ยนอินเตอร์เฟสของฉันอย่างหมดจดเพื่อวัตถุประสงค์ในการทดสอบ ฉันได้ทำตามคำแนะนำของชุมชน Spring แล้ว แต่การเยาะเย้ยไม่ได้เกิดขึ้นและการเดินสายอัตโนมัติล้มเหลว: <bean id="dao" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.package.Dao" /> </bean> ข้อผิดพลาดที่ฉันพบในขณะนี้มีดังนี้: ... Caused by: org...NoSuchBeanDefinitionException: No matching bean of type [com.package.Dao] found for dependency: expected at least 1 bean which qualifies as autowire candidate …

4
ไลบรารี Inject (In) Dependency Inject (มิตร)
ฉันไตร่ตรองการออกแบบห้องสมุด C # ที่จะมีฟังก์ชั่นระดับสูงที่แตกต่างกันหลายอย่าง แน่นอนว่าฟังก์ชั่นระดับสูงเหล่านั้นจะถูกนำไปใช้โดยใช้หลักการออกแบบคลาสSOLIDให้มากที่สุด ดังนั้นจึงอาจมีคลาสที่ตั้งใจให้ผู้บริโภคใช้โดยตรงเป็นประจำและ "คลาสที่รองรับ" ที่ขึ้นต่อกันของคลาส "ผู้ใช้ปลายทาง" ทั่วไป คำถามคือวิธีที่ดีที่สุดในการออกแบบห้องสมุดคือ: ผู้ไม่เชื่อเรื่องพระเจ้า - แม้ว่าการเพิ่ม "การสนับสนุน" พื้นฐานสำหรับหนึ่งหรือสองของห้องสมุด DI ทั่วไป (โครงสร้างแผนที่, Ninject, ฯลฯ ) ดูเหมือนว่าสมเหตุสมผลฉันต้องการให้ผู้บริโภคสามารถใช้ห้องสมุดที่มีกรอบ DI ใด ๆ ใช้งานไม่ได้ DI - หากผู้บริโภคของห้องสมุดไม่ใช้ DI ห้องสมุดก็ควรจะใช้งานได้ง่ายที่สุดเท่าที่จะเป็นไปได้ลดปริมาณงานที่ผู้ใช้ต้องทำเพื่อสร้างการพึ่งพา "ไม่สำคัญ" เหล่านี้ทั้งหมดเพียงเพื่อ คลาส "ของจริง" ที่พวกเขาต้องการใช้ ความคิดปัจจุบันของฉันคือการจัดหา "DI registration modules" สองสามข้อสำหรับไลบรารี DI ทั่วไป (เช่นรีจิสทรี StructureMap, โมดูล Ninject) และชุดชั้นเรียนหรือชุดโรงงานที่ไม่ได้เป็น DI …

21
ฉันต้องการการฉีดพึ่งพาใน NodeJS หรือจะจัดการกับ ...
ฉันกำลังสร้างโครงการทดลองบางอย่างที่มี nodejs ฉันได้ตั้งโปรแกรม Java EE เว็บแอพพลิเคชั่นไว้มากมายกับ Spring และชื่นชมความสะดวกในการใช้งานที่นั่น ตอนนี้ฉันอยากรู้อยากเห็น: ฉันจะฉีดพึ่งพาโหนดได้อย่างไร หรือ: ฉันต้องการมันด้วยเหรอ? มีแนวคิดการแทนที่เนื่องจากรูปแบบการเขียนโปรแกรมแตกต่างกันหรือไม่? ฉันกำลังพูดถึงสิ่งที่เรียบง่ายเช่นการแชร์วัตถุการเชื่อมต่อฐานข้อมูลจนถึงตอนนี้ แต่ฉันยังไม่พบวิธีแก้ปัญหาที่ทำให้ฉันพอใจ

5
จะอธิบายการฉีดเข้าสู่ 5 ปีได้อย่างไร? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ เป็นวิธีที่ดีในการอธิบายการฉีดพึ่งพาอะไร ฉันพบบทเรียนหลายอย่างใน Google แต่ไม่มีใครคิดว่าผู้อ่านเป็นเพียงผู้เริ่มต้นจาวา คุณจะอธิบายสิ่งนี้กับสามเณรได้อย่างไร

19
ข้อผิดพลาดการฉีดของ ASP.NET Core Dependency: ไม่สามารถแก้ไขบริการสำหรับประเภทในขณะที่พยายามเปิดใช้งาน
ฉันสร้างแอปพลิเคชั่น. NET Core MVC และใช้ Dependency Injection และ Repository Pattern เพื่อฉีดที่เก็บไปยังคอนโทรลเลอร์ของฉัน อย่างไรก็ตามฉันได้รับข้อผิดพลาด: InvalidOperationException: ไม่สามารถแก้ไขบริการสำหรับประเภท 'WebApplication1.Data.BloggerRepository' ในขณะที่พยายามเปิดใช้งาน 'WebApplication1.Controllers.BlogController' แบบจำลอง (Blog.cs) namespace WebApplication1.Models { public class Blog { public int BlogId { get; set; } public string Url { get; set; } } } DbContext (BloggingContext.cs) using Microsoft.EntityFrameworkCore; using WebApplication1.Models; namespace WebApplication1.Data …

10
ผ่านพารามิเตอร์ JavaFX FXML
ฉันจะส่งพารามิเตอร์ไปที่หน้าต่างรองใน javafx ได้อย่างไร มีวิธีสื่อสารกับคอนโทรลเลอร์ที่เกี่ยวข้องหรือไม่? ตัวอย่างเช่น: ผู้ใช้เลือกลูกค้าจาก a TableViewและหน้าต่างใหม่เปิดขึ้นโดยแสดงข้อมูลลูกค้า Stage newStage = new Stage(); try { AnchorPane page = (AnchorPane) FXMLLoader.load(HectorGestion.class.getResource(fxmlResource)); Scene scene = new Scene(page); newStage.setScene(scene); newStage.setTitle(windowTitle); newStage.setResizable(isResizable); if(showRightAway) { newStage.show(); } } newStageจะเป็นหน้าต่างใหม่ ปัญหาคือฉันไม่สามารถหาวิธีบอกคอนโทรลเลอร์ได้ว่าจะหาข้อมูลของลูกค้าได้ที่ไหน (โดยการส่ง id เป็นพารามิเตอร์) ความคิดใด ๆ

5
Castle Windsor คืออะไรและทำไมฉันถึงต้องแคร์?
ฉันเป็นนักพัฒนา Windows มาเป็นเวลานานโดยตัดฟันของฉันใน win32 และ COM ต้น ฉันทำงานกับ. NET ตั้งแต่ปี 2001 ดังนั้นฉันจึงค่อนข้างคล่องแคล่วใน C # และ CLR ฉันไม่เคยได้ยินเกี่ยวกับ Castle Windsor มาก่อนจนกว่าฉันจะเริ่มมีส่วนร่วมใน Stack Overflow ฉันอ่านคู่มือ "เริ่มต้นใช้งาน" ของ Castle Windsor แล้ว แต่ยังไม่ได้คลิก สอนเทคนิคใหม่ให้กับสุนัขตัวเก่าและบอกฉันว่าทำไมฉันจึงควรรวม Castle Windsor เข้ากับแอพสำหรับองค์กร

7
ใครสามารถอธิบาย Microsoft Unity ได้บ้าง
ฉันได้อ่านบทความเกี่ยวกับ MSDN เกี่ยวกับ Unity (Dependency Injection, Inversion of Control) แต่ฉันคิดว่าฉันต้องการมันอธิบายในคำศัพท์ง่ายๆ (หรือตัวอย่างง่ายๆ) ฉันคุ้นเคยกับรูปแบบ MVPC (เราใช้ที่นี่) แต่ฉันก็ยังไม่เข้าใจสิ่งที่เป็นเอกภาพจริงๆและฉันคิดว่ามันเป็นขั้นตอนต่อไปในการออกแบบแอปพลิเคชันของเรา

14
การฉีดพึ่งพาผู้รับเหมาก่อสร้างหรือผู้ตั้งค่าทรัพย์สิน?
ฉันปรับโครงสร้างห้องเรียนอีกครั้งและเพิ่มการพึ่งพาใหม่ให้กับคลาสนั้น ขณะนี้คลาสกำลังทำการพึ่งพาที่มีอยู่ในตัวสร้าง ดังนั้นเพื่อความมั่นคงฉันจะเพิ่มพารามิเตอร์ให้กับคอนสตรัคเตอร์ แน่นอนว่ามีคลาสย่อยไม่กี่บวกมากยิ่งขึ้นสำหรับการทดสอบหน่วยดังนั้นตอนนี้ฉันกำลังเล่นเกมของการแก้ไขการก่อสร้างทั้งหมดเพื่อให้ตรงกับและมันใช้เวลานาน มันทำให้ฉันคิดว่าการใช้คุณสมบัติกับ setters เป็นวิธีที่ดีกว่าในการรับการพึ่งพา ฉันไม่คิดว่าการพึ่งพาแบบฉีดควรเป็นส่วนหนึ่งของอินเทอร์เฟซเพื่อสร้างอินสแตนซ์ของคลาส คุณเพิ่มการพึ่งพาและในตอนนี้ผู้ใช้ทั้งหมดของคุณ (คลาสย่อยและใครก็ตามที่สร้างอินสแตนซ์ให้คุณโดยตรง) ก็รู้ได้ทันที นั่นให้ความรู้สึกเหมือนการห่อหุ้ม สิ่งนี้ดูเหมือนจะไม่เป็นรูปแบบด้วยรหัสที่มีอยู่ที่นี่ดังนั้นฉันจึงต้องการค้นหาว่าฉันทามติทั่วไปคืออะไรข้อดีข้อเสียของคอนสตรัคเตอร์กับคุณสมบัติ ใช้ตัวตั้งค่าคุณสมบัติดีกว่าหรือไม่

2
InvalidOperationException: ไม่สามารถแก้ไขบริการสำหรับประเภท 'Microsoft.AspNetCore.Http.IHttpContextAccessor'
ฉันเริ่มแปลงโครงการ RC1 หลักของ asp.net เป็น RC2 และประสบกับปัญหาที่IHttpContextAccessorไม่สามารถแก้ไขได้ในขณะนี้ เพื่อประโยชน์ของความเรียบง่ายที่ฉันสร้างโครงการ ASP.NET RC2 ASP.NET Core Web Application (.Net Framework)ใหม่โดยใช้แม่แบบ ฉันเพิ่มตัวสร้างสำหรับ HomeController ซึ่งเทมเพลตที่สร้างขึ้นสำหรับฉัน public HomeController(IHttpContextAccessor accessor) { } และหลังจากฉันเริ่มแอปพลิเคชันฉันได้รับข้อผิดพลาดถัดไป: InvalidOperationException: ไม่สามารถแก้ไขบริการสำหรับชนิด 'Microsoft.AspNetCore.Http.IHttpContextAccessor' ในขณะที่พยายามเปิดใช้งาน 'TestNewCore.Controllers.HomeController' ใน Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) ในการประยุกต์ใช้จริงของฉันฉันต้องการที่จะแก้ปัญหาIHttpContextAccessorในระดับบริการของตัวเองสำหรับการเข้าถึงและ_contextAccessor.HttpContext.Authentication _contextAccessor.HttpContext.UserEverething ทำงานได้ดีใน RC1 แล้วมันจะอยู่ใน RC2 ได้อย่างไร?

5
มีรูปแบบสำหรับการเริ่มต้นวัตถุที่สร้างผ่านคอนเทนเนอร์ DI หรือไม่
ฉันพยายามรับ Unity เพื่อจัดการการสร้างวัตถุของฉันและฉันต้องการมีพารามิเตอร์การกำหนดค่าเริ่มต้นบางอย่างที่ไม่รู้จักจนกระทั่งเวลาใช้งาน: ในขณะนี้วิธีเดียวที่ฉันสามารถคิดวิธีทำคือมีวิธี Init บนอินเทอร์เฟซ interface IMyIntf { void Initialize(string runTimeParam); string RunTimeParam { get; } } จากนั้นให้ใช้ (ใน Unity) ฉันจะทำสิ่งนี้: var IMyIntf = unityContainer.Resolve<IMyIntf>(); IMyIntf.Initialize("somevalue"); ในสถานการณ์สมมตินี้runTimeParamจะกำหนดพารามิเตอร์ขณะใช้งานโดยยึดตามข้อมูลผู้ใช้ กรณีเล็ก ๆ น้อย ๆ ที่นี่เพียงคืนค่าrunTimeParamแต่ในความเป็นจริงพารามิเตอร์จะเป็นชื่อไฟล์และวิธีการเริ่มต้นจะทำอะไรกับไฟล์ สิ่งนี้สร้างปัญหาจำนวนหนึ่ง ได้แก่ Initializeวิธีนี้มีอยู่ในส่วนต่อประสานและสามารถเรียกได้หลายครั้ง การตั้งธงในการดำเนินการและการขว้างปาข้อยกเว้นในการเรียกซ้ำInitializeดูเหมือนว่าวิธีที่อุ้ยอ้าย เมื่อถึงจุดที่ฉันแก้ไขอินเทอร์เฟซของฉันฉันไม่ต้องการรู้อะไรเกี่ยวกับการใช้งาน IMyIntfเมื่อมาถึงจุดที่ผมแก้ไขอินเตอร์เฟซของฉันฉันไม่ต้องการที่จะรู้อะไรเกี่ยวกับการดำเนินงานของสิ่งที่ฉันต้องการคือความรู้ที่ว่าอินเตอร์เฟสนี้ต้องการพารามิเตอร์การกำหนดค่าเริ่มต้นที่แน่นอน มีวิธีการอย่างใดคำอธิบายประกอบ (คุณสมบัติ?) อินเตอร์เฟซที่มีข้อมูลนี้และส่งผ่านไปยังกรอบเมื่อวัตถุถูกสร้างขึ้น? แก้ไข: อธิบายอินเตอร์เฟสอีกเล็กน้อย

2
ฤดูใบไม้ผลิ: ทำไมเราถึงได้รับอินเทอร์เฟซโดยอัตโนมัติและไม่ใช่คลาสที่นำมาใช้
ตัวอย่าง interface IA { public void someFunction(); } @Resource(name="b") class B implements IA { public void someFunction() { //busy code block } public void someBfunc() { //doing b things } } @Resource(name="c") class C implements IA { public void someFunction() { //busy code block } public void someCfunc() { //doing …

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