در مفاهیم Dependency Injection، تفاوت Field injection و Constructor Injection چیست؟

+1 رأی

مزایا و معایب هر کدام از روش های Constructor Injection و Field injection در زمان استفاده از Dependency Injection چیست؟

Constructor Injection:

public class Checkout {

   private ShoppingCart cart;

   @Inject
   public Checkout(ShoppingCart cart) {
      this.cart = cart;
   }

}

Field injection:

public class Checkout {

   @Inject
   private ShoppingCart cart;

}
سوال 1 سال قبل در تالار کامپیوتر و اینترنت توسط Saeed Zarinfam (64 امتیاز) 34% درصد پذیرش

1 جواب

+1 رأی

همانطور که مشخص است کد نوشته شده در روش Field injection کوتاه تر از روش Constructor Injection است و به پارامتر Constructor و ... نیازی نیست اما مشکل آن این است که Dependency کلاس مخفی است و از بیرون کلاس مشخص نیست کلاس Checkout به کلاس ShoppingCart وابستگی دارد. مشکل دیگر روش Field injection در زمان تست است، ما حتی برای نوشتن یک تست ساده هم برای satisfy کردن Dependency کلاس Checkout باید از reflection یا یک DI framework استفاده کنیم.

درست است برای روش Constructor Injection باید کد بیشتری نوشته شود ولی چون Dependency های کلاس در سطح Constructor بیان می شود مشکلات Field injection را ندارند و فقط با نگاه کردن به Constructor کلاس، وابستگی های کلاس مشخص می شود. عیب روش Constructor Injection این است که satisfy کردن تمام Dependency ها اجباری است و Dependency اختیاری با آن قابل پیاده سازی نیست. برای Dependency های اختیاری نیز روش Setter Injection پیشنهاد می شود. در روش Setter Injection از متد های setter یک فیلد برای Injection کردن Dependency استفاده می شود.

جواب 1 سال قبل توسط Saeed Zarinfam (64 امتیاز)
ممنون از توضیحات کاملتون.
اگر فیلدها رو به جای private به شکل package access تعریف کنیم در تستهای هم package نیازی به استفاده از reflection نیست.

سوال های مشابه

+1 رأی
1 جواب 157 بازدید
0 رأی
1 جواب 255 بازدید
+1 رأی
1 جواب 348 بازدید
...