Lĩnh vực tiêm là một chút quá "hành động ma quái ở khoảng cách xa" theo sở thích của tôi.
Hãy xem xét ví dụ bạn đã cung cấp trong bài đăng trên Google Groups:
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(); }
...
}
Vì vậy, về cơ bản những gì bạn đang nói là "Tôi có lớp này với trạng thái riêng tư, mà tôi đã đính kèm @injectable
các chú thích, có nghĩa là trạng thái có thể được tự động điền bởi một số đại lý từ bên ngoài, mặc dù tất cả trạng thái của tôi đã được tuyên bố là riêng tư. "
Tôi hiểu những động lực cho việc này. Đó là một nỗ lực để tránh phần lớn buổi lễ vốn có trong việc thiết lập một lớp học đúng cách. Về cơ bản, điều người ta nói là "Tôi mệt mỏi khi viết tất cả bản tóm tắt này, vì vậy tôi sẽ chú thích tất cả trạng thái của mình và để cho container DI đảm nhiệm việc đặt nó cho tôi."
Đó là một quan điểm hoàn toàn hợp lệ. Nhưng đó cũng là một cách giải quyết cho các tính năng ngôn ngữ không nên làm việc xung quanh. Ngoài ra, tại sao dừng lại ở đó? Theo truyền thống, DI đã dựa vào mỗi lớp có Giao diện đồng hành. Tại sao không loại bỏ tất cả các giao diện với chú thích là tốt?
Hãy xem xét lựa chọn thay thế (đây sẽ là C #, vì tôi biết nó tốt hơn, nhưng có lẽ có một tương đương chính xác trong Java):
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;
}
}
Tôi đã biết một số điều về lớp học này. Đó là một lớp học bất biến; trạng thái chỉ có thể được đặt trong hàm tạo (tham chiếu, trong trường hợp cụ thể này). Và bởi vì mọi thứ bắt nguồn từ một giao diện, tôi có thể trao đổi các triển khai trong hàm tạo, đó là nơi mà các giả của bạn xuất hiện.
Bây giờ tất cả các thùng chứa DI của tôi phải làm là phản ánh qua hàm tạo để xác định đối tượng nào nó cần để tạo mới. Nhưng sự phản ánh đó đang được thực hiện trên một thành viên công cộng, theo cách thức hạng nhất; tức là siêu dữ liệu đã là một phần của lớp, đã được khai báo trong hàm tạo, một phương thức có mục đích rõ ràng là cung cấp cho lớp các phụ thuộc mà nó cần.
Cấp cho điều này là rất nhiều nồi hơi, nhưng đây là cách ngôn ngữ được thiết kế. Các chú thích có vẻ như là một bản hack bẩn cho một thứ đáng lẽ phải được tích hợp vào ngôn ngữ.