การสร้างคอนสตรัคชันมีข้อดีที่ทำให้การอ้างอิงชัดเจนและบังคับให้ไคลเอนต์ให้อินสแตนซ์ นอกจากนี้ยังสามารถรับประกันได้ว่าลูกค้าจะไม่สามารถเปลี่ยนอินสแตนซ์ในภายหลัง ข้อเสียอย่างหนึ่ง (เป็นไปได้) คือคุณต้องเพิ่มพารามิเตอร์ลงในตัวสร้างของคุณ
Setter Injectionมีข้อดีที่ไม่ต้องเพิ่มพารามิเตอร์ใน Constructor นอกจากนี้ยังไม่ต้องการให้ลูกค้าตั้งค่าอินสแตนซ์ สิ่งนี้มีประโยชน์สำหรับการอ้างอิงเพิ่มเติม สิ่งนี้อาจมีประโยชน์หากคุณต้องการให้คลาสสร้างตัวอย่างเช่นที่เก็บข้อมูลจริงโดยค่าเริ่มต้นและจากนั้นในการทดสอบคุณสามารถใช้ setter เพื่อแทนที่ด้วยอินสแตนซ์ทดสอบ
การฉีดอินเทอร์เฟซเท่าที่ฉันสามารถบอกได้นั้นไม่แตกต่างจากการฉีดเซ็ตเตอร์มากนัก ในทั้งสองกรณีคุณ (เป็นทางเลือก) ตั้งค่าการพึ่งพาที่สามารถเปลี่ยนแปลงได้ในภายหลัง
ในท้ายที่สุดมันก็เป็นเรื่องของการตั้งค่าและหรือไม่พึ่งพาถูกต้อง โดยส่วนตัวแล้วฉันใช้คอนสตรัคเตอร์แบบฉีดเกือบเท่านั้น ฉันชอบที่มันทำให้การอ้างอิงของชั้นเรียนชัดเจนโดยการบังคับให้ลูกค้าเพื่อให้เป็นตัวอย่างในการกำหนด ฉันก็ชอบที่ลูกค้าไม่สามารถเปลี่ยนอินสแตนซ์หลังจากข้อเท็จจริง
บ่อยครั้งเหตุผลเดียวที่ฉันผ่านการใช้งานสองแบบแยกกันคือการทดสอบ ในการผลิตผมอาจจะผ่านในแต่ในการทดสอบผมจะผ่านในDataRepository
FakeDataRepository
ในกรณีนี้ผมมักจะให้สองก่อสร้าง: หนึ่งเดียวกับไม่มีพารามิเตอร์, และอื่น ๆ IDataRepository
ที่ยอมรับ new DataRepository()
จากนั้นในคอนสตรัคกับพารามิเตอร์ที่ไม่ฉันจะห่วงโซ่การเรียกร้องให้สร้างที่สองและผ่านใน
นี่คือตัวอย่างใน C #:
public class Foo
{
private readonly IDataRepository dataRepository;
public Foo() : this(new DataRepository())
{
}
public Foo(IDataRespository dataRepository)
{
this.dataRepository = dataRepository;
}
}
เรื่องนี้เป็นที่รู้จักกันในชื่อการพึ่งพาการฉีดของคนจน ฉันชอบเพราะในรหัสลูกค้าที่ใช้งานจริงฉันไม่จำเป็นต้องทำซ้ำตัวเองด้วยการมีคำสั่งซ้ำหลายครั้งที่ดูเหมือน
var foo = new Foo(new DataRepository());
อย่างไรก็ตามฉันยังสามารถผ่านการใช้งานสำรองสำหรับการทดสอบ ฉันรู้ว่าด้วย DI ของ Poor Man ฉันกำลังรหัสอ้างอิงยาก แต่ก็ยอมรับได้สำหรับฉันเพราะส่วนใหญ่ฉันใช้ DI สำหรับการทดสอบ