Injeksi lapangan agak terlalu "aksi seram di kejauhan" untuk seleraku.
Pertimbangkan contoh yang Anda berikan di pos Google Groups Anda:
public class VeracodeServiceImplTest {
@Tested(fullyInitialized=true)
VeracodeServiceImpl veracodeService;
@Tested(fullyInitialized=true, availableDuringSetup=true)
VeracodeRepositoryImpl veracodeRepository;
@Injectable private ResultsAPIWrapper resultsApiWrapper;
@Injectable private AdminAPIWrapper adminApiWrapper;
@Injectable private UploadAPIWrapper uploadApiWrapper;
@Injectable private MitigationAPIWrapper mitigationApiWrapper;
static { VeracodeRepositoryImpl.class.getName(); }
...
}
Jadi pada dasarnya apa yang Anda katakan adalah bahwa "Saya memiliki kelas ini dengan negara pribadi, yang saya lampirkan @injectable
penjelasan, yang berarti bahwa negara dapat secara otomatis diisi oleh beberapa agen dari luar, meskipun negara saya semuanya telah dinyatakan pribadi. "
Saya mengerti motivasi untuk ini. Ini adalah upaya untuk menghindari banyak upacara yang melekat dalam mendirikan kelas dengan benar. Pada dasarnya, yang dikatakan orang adalah, "Aku bosan menulis semua pelat ini, jadi aku hanya akan membubuhi keterangan tentang negara bagianku, dan biarkan wadah DI mengurus pengaturannya untukku."
Ini sudut pandang yang benar-benar valid. Tapi itu juga solusi untuk fitur bahasa yang bisa dibilang tidak boleh dikerjakan. Juga, mengapa berhenti di situ? Secara tradisional, DI mengandalkan setiap kelas yang memiliki Interface pendamping. Mengapa tidak menghilangkan semua antarmuka itu dengan anotasi juga?
Pertimbangkan alternatifnya (ini akan menjadi C #, karena saya tahu lebih baik, tetapi mungkin ada padanan yang persis sama di Jawa):
public class VeracodeService
{
private readonly IResultsAPIWrapper _resultsApiWrapper;
private readonly IAdminAPIWrapper _adminApiWrapper;
private readonly IUploadAPIWrapper _uploadApiWrapper;
private readonly IMitigationAPIWrapper _mitigationApiWrapper;
// Constructor
public VeracodeService(IResultsAPIWrapper resultsApiWrapper, IAdminAPIWrapper adminApiWrapper, IUploadAPIWrapper uploadApiWrapper, IMitigationAPIWrapper mitigationApiWrapper)
{
_resultsAPIWrapper = resultsAPIWrapper;
_adminAPIWrapper = adminAPIWrapper;
_uploadAPIWrapper = uploadAPIWrapper;
_mitigationAPIWrapper = mitigationAPIWrapper;
}
}
Sudah saya tahu beberapa hal tentang kelas ini. Ini adalah kelas yang tidak berubah; negara hanya dapat diatur dalam konstruktor (referensi, dalam kasus khusus ini). Dan karena semuanya berasal dari sebuah antarmuka, saya bisa menukar implementasi di dalam konstruktor, yang merupakan tempat mengejek Anda.
Sekarang semua yang harus dilakukan wadah DI saya adalah merefleksikan konstruktor untuk menentukan objek apa yang diperlukan untuk memulai. Tapi refleksi itu dilakukan pada anggota publik, dengan cara kelas satu; yaitu metadata sudah menjadi bagian dari kelas, yang telah dinyatakan dalam konstruktor, sebuah metode yang tujuan ekspresinya adalah untuk menyediakan kelas dengan dependensi yang dibutuhkannya.
Memang ini banyak boilerplate, tetapi ini adalah bagaimana bahasa dirancang. Anotasi tampak seperti peretasan kotor untuk sesuatu yang seharusnya sudah ada dalam bahasa itu sendiri.