Alan enjeksiyonu zevkime göre biraz "uzak mesafeden ürkütücü hareket" .
Google Grupları yayınınıza verdiğiniz örneği göz önünde bulundurun:
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(); }
...
}
Yani temelde söylediğiniz şudur: "Sınıfımın @injectable
tümü özel olarak ilan edilmiş olsa bile, devletin dışardan bazı ajanlar tarafından otomatik olarak doldurulabileceği anlamına gelen özel sınıflı bir sınıfım var . "
Bunun için motivasyonları anlıyorum. Düzgün bir sınıf oluşturmada doğuştan gelen törenin çoğundan kaçınma girişimidir. Temel olarak, söylediği şudur: "Tüm bu kazan plakasını yazmaktan bıktım, bu yüzden sadece bütün durumumu ekleyeceğim ve DI konteynerinin benim için ayarlaması için bakmasına izin vereceğim."
Mükemmel derecede geçerli bir bakış açısı. Ancak, tartışılmayacak şekilde çalışılması gereken dil özellikleri için bir geçici çözümdür. Ayrıca, neden orada durdun? Geleneksel olarak DI, bir arkadaşı Arabirimi olan her sınıfa güvenmiştir. Neden tüm bu arabirimleri ek açıklamalarla da ortadan kaldırmıyorsunuz?
Alternatifleri düşünün (bu C # olacak, çünkü daha iyi biliyorum ama muhtemelen Java’da tam bir eşdeğer var):
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;
}
}
Zaten bu sınıf hakkında bazı şeyler biliyorum. Değişmez bir sınıftır; durum yalnızca kurucuda ayarlanabilir (bu özel durumda referanslar). Ve her şey bir arayüzden kaynaklandığı için, alaylarınızın bulunduğu yerdeki kurucudaki uygulamaları değiştirebilirim.
Artık DI konteynerimin yapması gereken şey, hangi nesnelerin yenileşmesi gerektiğini belirlemek için yapıcıya yansıtmak. Ancak bu yansıma halka açık bir sınıfta birinci sınıf bir şekilde yapılıyor ; yani metadata zaten sınıfın bir parçasıdır, kurucuda bildirilmiş olup, açık amacı sınıfa ihtiyaç duyduğu bağımlılıkları sağlamaktır.
Bu çok fazla kazan olduğunu kabul etti, ancak dilin nasıl tasarlandığı. Ek açıklamalar, dilin içine yerleştirilmiş olması gereken şeyler için kirli bir hack gibi gözüküyor.