ขวาก่อนอื่นมาจัดการกับ "รหัสใด ๆ ที่เรียก ctor จะต้องมีการปรับปรุงเมื่อมีการเพิ่มการอ้างอิงใหม่"; ต้องมีความชัดเจนถ้าคุณกำลังทำฉีดพึ่งพาและคุณมีรหัสการโทรใหม่ () บนวัตถุที่มีการอ้างอิงที่คุณกำลังทำมันผิด
คอนเทนเนอร์ DI ของคุณควรจะสามารถฉีดการอ้างอิงที่เกี่ยวข้องทั้งหมดได้ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับการเปลี่ยนลายเซ็นคอนสตรัคเตอร์ดังนั้นอาร์กิวเมนต์นั้นจึงไม่ถือ
สำหรับแนวคิดต่อวิธีเปรียบเทียบกับวิธีฉีดแบบต่อคลาสนั้นมีสองประเด็นหลักที่เกี่ยวข้องกับวิธีฉีดต่อวิธี
ปัญหาหนึ่งคือวิธีการของชั้นเรียนของคุณควรแบ่งปันการพึ่งพามันเป็นวิธีหนึ่งที่จะช่วยให้แน่ใจว่าชั้นเรียนของคุณจะถูกแยกออกจากกันอย่างมีประสิทธิภาพถ้าคุณเห็นชั้นเรียนที่มีการพึ่งพาจำนวนมาก (อาจมากกว่า 4-5) สำหรับการเปลี่ยนโครงสร้างเป็นสองคลาส
ปัญหาต่อไปคือเพื่อ "ฉีด" การพึ่งพาต่อวิธีคุณจะต้องผ่านพวกเขาในการโทรวิธี ซึ่งหมายความว่าคุณจะต้องแก้ไขการขึ้นต่อกันก่อนที่จะเรียกเมธอดดังนั้นคุณอาจจะต้องจบด้วยโค้ดจำนวนมากดังนี้:
var someDependency = ServiceLocator.Resolve<ISomeDependency>();
var something = classBeingInjected.DoStuff(someDependency);
ทีนี้สมมติว่าคุณกำลังจะเรียกวิธีนี้ใน 10 สถานที่รอบ ๆ แอปพลิเคชันของคุณ: คุณจะมี 10 ตัวอย่าง ถัดไปพูดว่าคุณจะต้องเพิ่มการพึ่งพาอีกอันให้กับ DoStuff (): คุณจะต้องเปลี่ยนข้อมูลโค้ดนั้น 10 ครั้ง (หรือปิดมันด้วยวิธีการซึ่งในกรณีนี้คุณเพียงแค่จำลองพฤติกรรม DI ด้วยตนเองซึ่งเป็นการสูญเปล่า ของเวลา)
ดังนั้นสิ่งที่คุณได้ทำโดยทั่วไปมีการทำชั้นเรียน DI-ใช้ของคุณตระหนักถึงภาชนะ DI ของตัวเองซึ่งเป็นความคิดที่ดีโดยพื้นฐานเป็นมันอย่างรวดเร็วนำไปสู่การออกแบบ clunky ที่ยากที่จะรักษา
เปรียบเทียบกับการฉีดคอนสตรัค ในการสร้างคอนสตรัคเตอร์คุณไม่ได้ผูกติดอยู่กับภาชนะ DI และคุณไม่เคยรับผิดชอบโดยตรงต่อการพึ่งพาชั้นเรียนของคุณดังนั้นการบำรุงรักษาจึงไม่ต้องปวดหัว
ฟังดูเหมือนว่าคุณกำลังพยายามใช้ IoC กับคลาสที่มีเมธอดตัวช่วยที่ไม่เกี่ยวข้องในขณะที่คุณอาจแยกคลาสผู้ช่วยออกเป็นคลาสของบริการตามการใช้งานได้ดีกว่าจากนั้นใช้ผู้ช่วยเพื่อมอบหมาย โทร นี่ยังไม่ใช่วิธีการที่ยอดเยี่ยม (ผู้ช่วยเหลือที่จัดหมวดหมู่ด้วยวิธีการที่ทำสิ่งที่ซับซ้อนกว่าแค่จัดการกับข้อโต้แย้งที่ส่งผ่านพวกเขาโดยทั่วไปเป็นเพียงคลาสบริการที่เขียนไม่ดี) แต่อย่างน้อยมันจะทำให้การออกแบบของคุณสะอาดขึ้นเล็กน้อย .
(NB ฉันได้ทำวิธีที่คุณแนะนำมาก่อนและมันเป็นความคิดที่แย่มากที่ฉันไม่ได้ทำซ้ำนับตั้งแต่กลับกลายเป็นว่าฉันพยายามแยกชั้นเรียนที่ไม่จำเป็นต้องแยกจากกันและจบลงด้วยดี ด้วยชุดอินเทอร์เฟซที่แต่ละการเรียกใช้เมธอดต้องการการเลือกอินเทอร์เฟซอื่นใกล้เคียงคงที่มันเป็นฝันร้ายที่จะรักษาไว้)