ฉันคิดว่าสถานที่ตั้งของคุณสับสนเล็กน้อยที่นี่คุณพูดถึงการฉีดโรงงาน แต่รูปแบบโรงงานเป็นรูปแบบที่สร้างสรรค์ซึ่งมีจุดประสงค์เพื่อทำส่วนย่อยของสิ่งที่เฟรมเวิร์กการฉีดพึ่งพาทำเมื่อกรอบ DI ไม่ได้แพร่หลายรูปแบบนี้ มีประโยชน์สำหรับเหตุผลนั้น อย่างไรก็ตามถ้าคุณมีกรอบ DI คุณไม่จำเป็นต้องใช้โรงงานอีกต่อไปเพราะกรอบ DI สามารถทำตามวัตถุประสงค์ที่โรงงานได้ทำไว้
ที่กล่าวว่าให้ฉันอธิบายเล็กน้อยเกี่ยวกับการฉีดพึ่งพาและวิธีที่คุณมักจะใช้
มีหลายวิธีที่จะทำการฉีดแบบพึ่งพาได้ แต่วิธีที่พบมากที่สุดคือการฉีดคอนสตรัคเตอร์การฉีดคุณสมบัติและไดเร็กตอรี DIContainer โดยตรง ฉันจะพูดเกี่ยวกับการฉีดคอนสตรัคเตอร์เนื่องจากการฉีดคุณสมบัติเป็นวิธีที่ไม่ถูกต้องเกือบตลอดเวลา (วิธีการที่ถูกต้องในบางเวลา) และการเข้าถึง DIContainer ไม่เหมาะสมกว่ายกเว้นเมื่อคุณไม่สามารถทำอย่างใดอย่างหนึ่งได้
การสร้างคอนสตรัคเตอร์เป็นที่ที่คุณมีอินเทอร์เฟซสำหรับการพึ่งพาและ DIContainer (หรือโรงงาน) ที่รู้ถึงการใช้งานที่เป็นรูปธรรมสำหรับการพึ่งพานั้นและไม่ว่าคุณต้องการวัตถุใดที่ขึ้นอยู่กับอินเทอร์เฟซนั้น มัน.
กล่าวคือ
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
เฟรมเวิร์ก DI จำนวนมากสามารถทำให้สิ่งนี้ง่ายขึ้นอย่างมีนัยสำคัญถึงจุดที่ DIContainer ของคุณจะตรวจสอบตัวสร้างของ UserRepository สำหรับอินเทอร์เฟซที่รู้จักการใช้งานที่เป็นรูปธรรมและจะมอบสิ่งเหล่านั้นให้คุณโดยอัตโนมัติ เทคนิคนี้มักถูกเรียกว่า Inversion of Control แม้ว่า DI และ IoC จะเป็นคำศัพท์ทั้งสองที่ได้รับการแลกเปลี่ยนกันมากมายและมีความแตกต่างที่คลุมเครือ
ทีนี้ถ้าคุณสงสัยว่ารหัสที่ครอบคลุมนั้นเข้าถึง DIContainer ได้อย่างไรคุณสามารถมีคลาสแบบคงที่สำหรับการเข้าถึงหรือสิ่งที่เหมาะสมกว่าคือกรอบ DI ส่วนใหญ่อนุญาตให้คุณสร้าง DIContainer ใหม่ซึ่งจริง ๆ แล้วมันจะทำตัวเหมือน wrapper ของพจนานุกรม singleton ภายในสำหรับชนิดที่รู้ว่าเป็นรูปธรรมสำหรับอินเตอร์เฟสที่กำหนด
ซึ่งหมายความว่าคุณสามารถสร้าง DIContainer ใหม่ได้ทุกที่ที่คุณต้องการในรหัสและรับ DIContainer ตัวเดียวกับที่คุณกำหนดค่าไว้แล้วให้รู้จักกับความสัมพันธ์ระหว่างอินเตอร์เฟสกับรูปธรรมของคุณ วิธีการตามปกติในการซ่อน DIContainer จากส่วนของรหัสที่ไม่ควรโต้ตอบกับมันโดยตรงคือเพื่อให้แน่ใจว่าโครงการที่จำเป็นเท่านั้นที่มีการอ้างอิงถึงเฟรมเวิร์ก DI