พูดอย่างเคร่งครัดการพึ่งพาการฉีดจะไม่ต่อต้านการพึ่งพาการฉีดเท่านั้นและดังนั้นกลยุทธ์การจัดการการพึ่งพาใด ๆ ที่ไม่ใช่การฉีดการพึ่งพา
[ไม่ต้องการ] การมีเพศสัมพันธ์แม้ว่าจะไม่ใช่ปัญหามุมฉาก แต่ก็สามารถเกิดขึ้นหรือบรรเทาลงได้ด้วยวิธีใดวิธีหนึ่ง เหล่านี้มีทั้งคู่กับDependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
เป็นคู่กับเฉพาะDependencyClass
ในกรณีนี้ แต่พวกเขากำลังทั้งDependencyClass
คู่ ความชั่วร้ายจริงถ้ามีคนที่นี่ไม่ได้มีเพศสัมพันธ์จำเป็นก็ว่าDependencyLookupConstructor
ต้องการที่จะเปลี่ยนถ้าDependencyClass
จู่ ๆ ก็ต้องการพึ่งพาตัวเองฉีด1
อย่างไรก็ตามคอนสตรัคเตอร์ / คลาสนี้มีการเชื่อมโยงกันอย่างหลวม ๆมากขึ้น :
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
หากคุณทำงานใน C # ข้อมูลด้านบนจะอนุญาตให้คุณServiceLocator
ส่งคืนสิ่งใดก็ตามเมื่อGetMyDoer()
มีการเรียกใช้ตราบใดที่มีdo()
สิ่งที่DependencyLocatingConstructor
มีdo()
อยู่ คุณจะได้รับประโยชน์ในการตรวจสอบลายเซ็นเวลารวบรวมโดยไม่ได้ถูกคู่กับอินเตอร์เฟซที่สมบูรณ์2
ดังนั้นเลือกพิษของคุณ
แต่โดยทั่วไปถ้ามี "ตรงกันข้าม" อย่างเป็นรูปธรรมของการพึ่งพาการฉีดมันจะเป็นอย่างอื่นในขอบเขตของ "กลยุทธ์การจัดการการพึ่งพา" ในบรรดาคนอื่น ๆ ถ้าคุณใช้สิ่งใดสิ่งหนึ่งต่อไปนี้ในการสนทนาฉันจะจำได้ว่ามันไม่ใช่การพึ่งพาการฉีด:
- รูปแบบตัวระบุบริการ
- ที่ตั้งการพึ่งพา / ที่อยู่
- การสร้างวัตถุ / การอ้างอิงโดยตรง
- การพึ่งพาที่ซ่อนอยู่
- "ไม่พึ่งพาการฉีด"
1. แดกดันปัญหาบางอย่างที่ DI แก้ในระดับที่สูงกว่านั้นเป็นผลมาจาก [over-] ใช้ DI ในระดับต่ำกว่า ฉันมีความสุขที่ได้ทำงานกับฐานโค้ดที่มีความซับซ้อนที่ไม่จำเป็นไปทั่วเนื่องจากการรองรับสถานที่ที่ความซับซ้อนนั้นช่วยได้จริง ...
2. การใช้ตำแหน่งบริการยังช่วยให้คุณสามารถระบุการพึ่งพาที่แตกต่างกันของประเภทเดียวกันโดยบทบาทหน้าที่ของพวกเขาจากโค้ดที่เรียกใช้ในขณะที่ยังคงไม่เชื่อเรื่องพระเจ้าเกี่ยวกับวิธีการสร้างการพึ่งพา สมมติว่าคุณต้องแก้ไขUser
หรือIUser
เพื่อจุดประสงค์ที่แตกต่าง: เช่นLocator.GetAdministrator()
กับLocator.GetAuthor()
- หรืออะไรก็ตาม รหัสของฉันสามารถถามสิ่งที่ต้องการใช้งานได้โดยไม่ต้องรู้ว่าอินเตอร์เฟสรองรับอะไร