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

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

3
“ สิ่งต่าง ๆ ” ใดบ้างที่สามารถแทรกเข้าไปในสิ่งอื่นใน Angular.js
ฉันมีเวลาค่อนข้างยากที่จะเข้าใจการพึ่งพาการฉีดในเชิงมุม ดังนั้นคำถามของฉันคือทุกคนสามารถอธิบายว่า "ชนิด" ชนิดใดบ้างเช่นตัวควบคุมโรงงานผู้ให้บริการและอื่น ๆ ที่เราสามารถแทรกเข้าไปในผู้อื่นรวมถึงอินสแตนซ์อื่นของ "ชนิด" เดียวกัน สิ่งที่ฉันกำลังมองหาคือตารางนี้เต็มไปด้วย y / n สำหรับเซลล์ที่มีแถว / คอลัมน์เดียวกันนั่นหมายถึงการฉีดค่า "ชนิด" หนึ่งลงในอีกเซลล์หนึ่งที่มี "ประเภท" เดียวกัน +----------------+----------+------------+-----------+---------+--------+----------+---------+-------+ | Can we inject? | Constant | Controller | Directive | Factory | Filter | Provider | Service | Value | +----------------+----------+------------+-----------+---------+--------+----------+---------+-------+ | Constant | | | | | | …

7
ServiceLocator เป็นการต่อต้านรูปแบบหรือไม่?
เมื่อเร็ว ๆ นี้ฉันได้อ่านบทความของ Mark Seemannเกี่ยวกับรูปแบบการต่อต้าน Service Locator ผู้เขียนชี้ให้เห็นเหตุผลหลักสองประการที่ว่าทำไม ServiceLocator จึงต่อต้านรูปแบบ: ปัญหาการใช้งาน API (ซึ่งฉันก็สบายดี) เมื่อคลาสใช้ตัวระบุตำแหน่งบริการมันยากมากที่จะเห็นการอ้างอิงเนื่องจากในกรณีส่วนใหญ่คลาสจะมีตัวสร้าง PARAMETERLESS เพียงตัวเดียว ในทางตรงกันข้ามกับ ServiceLocator วิธี DI เปิดเผยการอ้างอิงอย่างชัดเจนผ่านพารามิเตอร์ของตัวสร้างเพื่อให้เห็นการอ้างอิงได้ง่ายใน IntelliSense ปัญหาการบำรุงรักษา (ซึ่งทำให้ฉันงง) พิจารณาตัวอย่างต่อไปนี้ เรามีคลาส'MyType'ซึ่งใช้วิธีการระบุตำแหน่งบริการ: public class MyType { public void MyMethod() { var dep1 = Locator.Resolve<IDep1>(); dep1.DoSomething(); } } ตอนนี้เราต้องการเพิ่มการอ้างอิงอื่นให้กับคลาส 'MyType' public class MyType { public void MyMethod() …

11
รหัสการทดสอบหน่วยที่มีการพึ่งพาระบบไฟล์
ฉันกำลังเขียนองค์ประกอบที่ให้ไฟล์ ZIP ต้อง: แตกไฟล์ ค้นหา dll ที่ระบุในไฟล์ที่คลายซิป โหลด dll นั้นผ่านการสะท้อนกลับและเรียกใช้วิธีการนั้น ฉันต้องการทดสอบหน่วยส่วนนี้ ฉันอยากเขียนโค้ดที่เกี่ยวข้องโดยตรงกับระบบไฟล์: void DoIt() { Zip.Unzip(theZipFile, "C:\\foo\\Unzipped"); System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar"); myDll.InvokeSomeSpecialMethod(); } แต่คนมักพูดว่า "อย่าเขียนการทดสอบหน่วยที่พึ่งพาระบบไฟล์ฐานข้อมูลเครือข่าย ฯลฯ " ถ้าฉันจะเขียนมันด้วยวิธีทดสอบที่เป็นมิตรฉันคิดว่ามันจะเป็นแบบนี้: void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner) { string path = zipper.Unzip(theZipFile); IFakeFile file = fileSystem.Open(path); runner.Run(file); } เย้! ตอนนี้มันทดสอบได้ ฉันสามารถป้อนทดสอบเป็นสองเท่า (mocks) …

4
Field Injection คืออะไรและจะหลีกเลี่ยงได้อย่างไร?
ฉันอ่านในบางโพสต์เกี่ยวกับ Spring MVC และ Portlets ว่าไม่แนะนำให้ใช้การฉีดฟิลด์ ตามที่ฉันเข้าใจแล้วการฉีดสนามคือเมื่อคุณฉีดถั่วด้วย@Autowiredสิ่งนี้: @Component public class MyComponent { @Autowired private Cart cart; } ในระหว่างการวิจัยของฉันฉันยังอ่านเกี่ยวกับการฉีดคอนสตรัคเตอร์ : @Component public class MyComponent { private final Cart cart; @Autowired public MyComponent(Cart cart){ this.cart = cart; } } ข้อดีและข้อเสียของการฉีดทั้งสองประเภทนี้คืออะไร? แก้ไข 1:เนื่องจากคำถามนี้ถูกทำเครื่องหมายว่าซ้ำกับคำถามนี้ฉันจึงตรวจสอบแล้ว สาเหตุที่ไม่มีตัวอย่างโค้ดใด ๆ ทั้งในคำถามหรือในคำตอบมันไม่ชัดเจนสำหรับฉันว่าฉันเดาถูกต้องหรือไม่ว่าฉันใช้การฉีดแบบไหน

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

4
จะฉีดการอ้างอิงลงในวัตถุที่สร้างขึ้นเองในฤดูใบไม้ผลิได้อย่างไร?
สมมติว่าเรามีคลาส: public class MyClass { @Autowired private AnotherBean anotherBean; } จากนั้นเราสร้างวัตถุของคลาสนี้ (หรือเฟรมเวิร์กอื่น ๆ ได้สร้างอินสแตนซ์ของคลาสนี้) MyClass obj = new MyClass(); เป็นไปได้ไหมที่จะฉีดการอ้างอิง? สิ่งที่ต้องการ: applicationContext.injectDependencies(obj); (ฉันคิดว่า Google Guice มีอะไรแบบนี้)

4
Spring Expression Language (SpEL) ที่มี @Value: ดอลลาร์เทียบกับแฮช ($ เทียบกับ #)
ฉันสับสนเล็กน้อยเกี่ยวกับเวลาที่จะใช้${...}เมื่อเทียบกับ#{...}. เอกสารของฤดูใบไม้ผลิใช้เพียงแต่มีมากมายตัวอย่างว่าการใช้งาน#{...} ${...}นอกจากนี้เมื่อฉันเริ่มใช้ SpEL ฉันได้รับคำสั่งให้ใช้${...}และมันก็ใช้ได้ดี สำหรับผู้ที่สับสนตัวอย่างของการใช้งานจะเป็นอย่างไร @Component public class ProxyConfiguration { @Value("${proxy.host}") private String host; @Value("${proxy.port}") private String port; : } และไฟล์คุณสมบัติบางอย่าง: proxy.host=myproxy.host proxy.port=8000 คำถามของฉันคือ: อะไรคือความแตกต่างหรือเหมือนกัน? เวอร์ชันหนึ่งเลิกใช้งานแล้วฉันควรใช้เวอร์ชันอื่นหรือไม่

4
Ioc / DI - เหตุใดฉันจึงต้องอ้างอิงเลเยอร์ / แอสเซมบลีทั้งหมดในจุดเริ่มต้นของแอปพลิเคชัน
(เกี่ยวข้องกับคำถามนี้EF4: เหตุใดจึงต้องเปิดใช้งานการสร้างพร็อกซีเมื่อเปิดใช้งานการโหลดแบบขี้เกียจ ) ฉันยังใหม่กับ DI ดังนั้นอดทนกับฉัน ฉันเข้าใจว่าคอนเทนเนอร์มีหน้าที่ในการสร้างอินสแตนซ์ประเภทที่ลงทะเบียนทั้งหมดของฉัน แต่ในการดำเนินการดังกล่าวจำเป็นต้องมีการอ้างอิงถึง DLL ทั้งหมดในโซลูชันของฉันและการอ้างอิง หากฉันไม่ได้ใช้คอนเทนเนอร์ DI ฉันจะไม่ต้องอ้างอิงไลบรารี EntityFramework ในแอป MVC3 ของฉันมีเพียงเลเยอร์ธุรกิจของฉันซึ่งจะอ้างอิงเลเยอร์ DAL / Repo ของฉัน ฉันรู้ว่าในตอนท้ายของวัน DLL ทั้งหมดจะรวมอยู่ในโฟลเดอร์ bin แต่ปัญหาของฉันคือต้องอ้างอิงอย่างชัดเจนผ่าน "เพิ่มการอ้างอิง" ใน VS เพื่อให้สามารถเผยแพร่ WAP พร้อมไฟล์ที่จำเป็นทั้งหมดได้

3
ContextLoaderListener หรือไม่?
แอพลิเคชันเว็บฤดูใบไม้ผลิมาตรฐาน (สร้างโดยกินตานาโรหรือ "ฤดูใบไม้ผลิ MVC โครงการ" แม่แบบ) สร้าง web.xml ด้วยและContextLoaderListener ทำไมพวกเขาไม่เพียงใช้และทำให้มันโหลดการกำหนดค่าที่สมบูรณ์?DispatcherServletDispatcherServlet ฉันเข้าใจว่าควรใช้ ContextLoaderListener เพื่อโหลดสิ่งที่ไม่เกี่ยวข้องกับเว็บและใช้ DispatcherServlet เพื่อโหลดสิ่งที่เกี่ยวข้องกับเว็บ (Controllers, ... ) และส่งผลให้เกิดสองบริบท: บริบทผู้ปกครองและบริบทย่อย พื้นหลัง: ฉันทำแบบนี้มาหลายปีแล้ว <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> </context-param> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Handles Spring requests --> <servlet> <servlet-name>roo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> …

4
javax.inject.Named คำอธิบายประกอบควรจะใช้สำหรับอะไร
ฉันพยายามทำความเข้าใจกับjavax.injectแพ็คเกจและไม่ชัดเจนว่าjavax.inject.Namedควรใช้คำอธิบายประกอบอะไร Javadoc ไม่ได้อธิบายถึงแนวคิดเบื้องหลัง Javadoc อยู่ที่http://download.oracle.com/javaee/6/api/javax/inject/Named.html ฉันใช้Spring 3.0เพื่อเขียนโปรแกรมตัวอย่างโดยการใส่@Namedbean ดูเหมือนว่าจะเพิ่มลงในโรงงานถั่ว แต่คำอธิบาย Javadoc นั้นเบามากฉันไม่สามารถบอกได้ว่านั่นเป็นพฤติกรรมมาตรฐานหรือพฤติกรรมเฉพาะของ Spring คำถามของฉันคือ: อะไรคือความแตกต่างระหว่าง@Namedและ@Qualifier คุณควรจะบอกระบบ Runtime ได้อย่างไรว่าคลาสควรฉีดในคลาสอื่น ๆ คำอธิบายประกอบสำหรับสิ่งนั้นคืออะไร? เทียบเท่า@Componentในฤดูใบไม้ผลิ? อัปเดต 1มีคำอธิบายที่ยอดเยี่ยม@Namedและ@Qualifierที่ Nice article about @Namedและ@Qualifier https://dzone.com/articles/java-ee6-cdi-named-componentsขอบคุณ @xmedeko สำหรับการเชื่อมโยงไปยังความคิดเห็นด้านล่าง

6
การส่งผ่านข้อมูลไปยังส่วนประกอบลูกของ“ เราเตอร์เต้าเสียบ”
ฉันมีองค์ประกอบหลักที่ไปที่เซิร์ฟเวอร์และดึงวัตถุ: // parent component @Component({ selector : 'node-display', template : ` <router-outlet [node]="node"></router-outlet> ` }) export class NodeDisplayComponent implements OnInit { node: Node; ngOnInit(): void { this.nodeService.getNode(path) .subscribe( node => { this.node = node; }, err => { console.log(err); } ); } และในหนึ่งในจอแสดงผลของเด็ก ๆ : export class ChildDisplay implements OnInit{ …

21
จะฉีดหน้าต่างลงในบริการได้อย่างไร?
ฉันกำลังเขียนบริการ Angular 2 ใน TypeScript ซึ่งจะใช้ประโยชน์จากlocalstorageไฟล์. ฉันต้องการที่จะฉีดอ้างอิงถึงเบราว์เซอร์windowวัตถุในการให้บริการของฉันตั้งแต่ฉันไม่ต้องการที่จะอ้างอิงตัวแปรใด ๆ ทั่วโลกเช่น $window1.x ฉันจะทำอย่างไร?

8
การฉีดแบบพึ่งพาด้วย Jersey 2.0
เริ่มต้นจากศูนย์โดยไม่มีความรู้ Jersey 1.x มาก่อนฉันมีความยากลำบากในการทำความเข้าใจวิธีตั้งค่าการฉีดพึ่งพาในโครงการ Jersey 2.0 ของฉัน ฉันเข้าใจด้วยว่า HK2 มีให้ใน Jersey 2.0 แต่ดูเหมือนว่าฉันไม่พบเอกสารที่ช่วยในการรวม Jersey 2.0 @ManagedBean @Path("myresource") public class MyResource { @Inject MyService myService; /** * Method handling HTTP GET requests. The returned object will be sent * to the client as "text/plain" media type. * * @return String that …

9
วิธีจัดการการพึ่งพาการฉีดในแอปพลิเคชัน WPF / MVVM
ฉันกำลังเริ่มแอปพลิเคชันเดสก์ท็อปใหม่และต้องการสร้างโดยใช้ MVVM และ WPF ฉันตั้งใจจะใช้ TDD ด้วย ปัญหาคือฉันไม่รู้ว่าฉันควรใช้คอนเทนเนอร์ IoC เพื่อฉีดการอ้างอิงกับรหัสการผลิตของฉันอย่างไร สมมติว่าฉันมีคลาสและอินเทอร์เฟซต่อไปนี้: public interface IStorage { bool SaveFile(string content); } public class Storage : IStorage { public bool SaveFile(string content){ // Saves the file using StreamWriter } } แล้วฉันก็มีคลาสอื่นที่มีIStorageการพึ่งพาสมมติว่าคลาสนี้เป็น ViewModel หรือชั้นธุรกิจ ... public class SomeViewModel { private IStorage _storage; public SomeViewModel(IStorage …

16
ประโยชน์ของการฉีดแบบพึ่งพามีอะไรบ้าง?
ฉันเข้าใจประโยชน์ของการฉีดแบบพึ่งพาตัวเอง ยกตัวอย่างเช่น Spring ฉันยังเข้าใจประโยชน์ของคุณสมบัติอื่น ๆ ของ Spring เช่น AOP ตัวช่วยประเภทต่างๆ ฯลฯ ฉันแค่สงสัยว่าการกำหนดค่า XML มีประโยชน์อย่างไรเช่น: <bean id="Mary" class="foo.bar.Female"> <property name="age" value="23"/> </bean> <bean id="John" class="foo.bar.Male"> <property name="girlfriend" ref="Mary"/> </bean> เมื่อเทียบกับรหัสจาวาเก่าธรรมดาเช่น: Female mary = new Female(); mary.setAge(23); Male john = new Male(); john.setGirlfriend(mary); ซึ่งง่ายกว่าการดีบั๊กตรวจสอบเวลาคอมไพล์และทุกคนที่รู้จัก java เท่านั้น ดังนั้นวัตถุประสงค์หลักของกรอบการฉีดพึ่งพาคืออะไร? (หรือโค้ดที่แสดงประโยชน์ของมัน) UPDATE: ในกรณีของ IService myService;// …

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