นี่เป็นการนำ IoC ไปใช้อย่างถูกต้องหรือไม่

ฉันกำลังพยายามเพิ่มความรู้ Inversion of Control และพบโค้ดบางอย่างที่ฉันอยากรู้ - นี่คือ IoC จริงหรือไม่

    public class DepartmentLogic : IDepartmentLogic
    {
        private readonly IDepartmentRepository _departmentRepository;

        public DepartmentLogic(IDepartmentRepository repo)
        {
            _departmentRepository = repo;
        }

        public DepartmentLogic()
        {
            _departmentRepository = new DepartmentRepository(Constants.CONNECTION_STRING_NAME);
        }
    }

หากการทดสอบหน่วยเรียกคลาสนี้ มันจะผ่านใน IDepartmentRepository ที่จำลอง อย่างไรก็ตาม รหัสแอปพลิเคชันหลักทั้งหมดใช้คลาสที่มีตัวสร้างเริ่มต้น ซึ่งจากนั้นจะแจ้งข่าวไปยัง DepartmentRepository ที่เป็นรูปธรรม

สิ่งนี้ถูกต้องหรือไม่? ฉันคิดว่าฉันอ่านเจอว่าคุณไม่ควรสร้างคลาสที่ขึ้นต่อกันใหม่ภายในคลาสการโทรของคุณ เหมือนที่เกิดขึ้นในตัวสร้างเริ่มต้น และการใหม่ของ DepartmentRepository ที่เป็นรูปธรรมควรเกิดขึ้นในคลาสที่สร้างคลาสนี้จริงๆ


person Craig    schedule 14.09.2016    source แหล่งที่มา
comment
คุณถูก. รหัสนั้นเอาชนะวัตถุประสงค์ของ IoC อย่างสิ้นเชิงและลงเอยด้วยประเภทที่เชื่อมโยงกันอย่างแน่นหนา ดูเหมือนว่าพวกเขาสร้างตัวสร้าง IoC เพียงเพื่อวัตถุประสงค์ในการทดสอบหน่วยแทนที่จะใช้เป็นวิธีการออกแบบโดยรวม   -  person itsme86    schedule 15.09.2016
comment
ขอบคุณ @itsme86 - นั่นคือสิ่งที่ฉันกังวล เมื่อฉันถาม ฉันถูกถาม นอกจากการทดสอบหน่วยแล้ว ยังไม่มีเหตุผลอื่นสำหรับ IoC และฉันก็ไม่แน่ใจว่าจะตอบอย่างไร ฉันเชื่อว่าข้อความนี้ไม่ถูกต้องและมีเหตุผลหลายประการ แต่ดูเหมือนจะเลือกไม่ได้ คุณช่วยได้ไหม?   -  person Craig    schedule 15.09.2016
comment
ฉันเดาว่า นี่สรุปข้อเสียของการมีเพศสัมพันธ์ที่แน่นแฟ้นได้ค่อนข้างดี   -  person itsme86    schedule 15.09.2016


คำตอบ (1)


คุณกำลังจัดเตรียมความสามารถในการฉีดการพึ่งพาเข้าไปในชั้นเรียน

เมื่อคุณบอกว่าแอปพลิเคชันของคุณใช้ Constructor เริ่มต้น คุณกำลังบอกว่าคุณไม่ได้ฉีดการพึ่งพาจริงๆ มันยังคงเขียนโค้ดยากอยู่

คุณต้องก้าวไปอีกขั้นหนึ่งและจัดเตรียมกลไกบางอย่างสำหรับการสร้างการพึ่งพา ณ รันไทม์แบบ "ไดนามิก" จากนั้นจึงฉีดเข้าไปในคลาส (ผ่านเฟรมเวิร์กการพึ่งพาการฉีดหรือกลไกที่กำหนดเองอื่น ๆ )

person Justin Niessner    schedule 14.09.2016
comment
ขอบคุณ @Justin... เมื่อคุณบอกว่ามีกลไกบางอย่างสำหรับการสร้างการพึ่งพาแบบไดนามิก คุณหมายถึงอะไรเช่น Unity (คอนเทนเนอร์ IoC - สิ่งต่อไปที่ฉันพยายามทำความเข้าใจให้ดีขึ้น) - person Craig; 15.09.2016
comment
@Craig - ถูกต้อง (เพราะฉะนั้นทำไมฉันถึงพูดถึงกรอบงานการฉีดพึ่งพา) ความสามัคคีเป็นเพียงหนึ่งในนั้น ฉันชอบ Autofac และ nInject ด้วย - person Justin Niessner; 15.09.2016
comment
เมื่อใดก็ตามที่คุณใช้คีย์เวิร์ดใหม่ใน Constructor มันจะแนะนำการเชื่อมต่อที่แน่นหนา - person loneshark99; 15.09.2016