Nói một cách chính xác, Dependency Injection chỉ thực sự phản đối KHÔNG phụ thuộc vào tiêm chích - và do đó, bất kỳ chiến lược quản lý phụ thuộc nào không phải là Dependency Injection.
Khớp nối [không mong muốn], mặc dù không chính xác là một vấn đề trực giao, có thể xảy ra hoặc được giảm nhẹ theo một trong hai cách. Cả hai đều được kết hợp với DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
được kết hợp với một cụ thể DependencyClass
trong trường hợp này. Nhưng, cả hai đều được ghép nối với DependencyClass
. Tội ác thực sự, nếu có một ở đây, không nhất thiết phải là khớp nối, nó DependencyLookupConstructor
cần phải thay đổi nếu DependencyClass
đột nhiên cần sự phụ thuộc của chính nó vào 1 .
Tuy nhiên, hàm tạo / lớp này thậm chí còn được ghép lỏng lẻo hơn :
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Nếu bạn đang làm việc trong C #, những điều trên sẽ cho phép bạn ServiceLocator
trả lại bất cứ thứ gì khi GetMyDoer()
được gọi, miễn là nó có thể có do()
những gì DependencyLocatingConstructor
có do()
. Bạn nhận được lợi ích của xác thực chữ ký thời gian biên dịch mà thậm chí không được ghép nối với giao diện hoàn chỉnh 2 .
Vì vậy, chọn chất độc của bạn.
Nhưng về cơ bản, nếu có một "đối nghịch" cụ thể của Dependency Injection, thì đó sẽ là một thứ khác trong lĩnh vực "Chiến lược quản lý phụ thuộc". Trong số những người khác, nếu bạn đã sử dụng bất kỳ điều nào sau đây trong cuộc trò chuyện, tôi sẽ nhận ra đó là việc KHÔNG phụ thuộc vào tiêm:
- Mẫu định vị dịch vụ
- Định vị phụ thuộc / Địa điểm
- Đối tượng trực tiếp / phụ thuộc xây dựng
- Phụ thuộc ẩn
- "Không phụ thuộc tiêm"
1. Trớ trêu thay, một số vấn đề mà DI giải quyết ở các cấp cao hơn là kết quả của việc [sử dụng quá mức] khi sử dụng DI ở các cấp thấp hơn. Tôi đã có những niềm vui của làm việc trên codebases với độ phức tạp không cần thiết trên khắp như là kết quả của sức chứa số ít các nơi phức tạp mà thực sự giúp ... Tôi phải thừa nhận là thiên vị do tiếp xúc xấu.
2. Sử dụng vị trí dịch vụ cũng cho phép bạn dễ dàng chỉ định các phụ thuộc khác nhau cùng loại theo vai trò chức năng của chúng từ mã gọi , trong khi vẫn không rõ ràng về cách thức phụ thuộc được xây dựng. Giả sử bạn cần giải quyết User
hoặc IUser
cho các mục đích khác nhau: Ví dụ, Locator.GetAdministrator()
so với Locator.GetAuthor()
- hoặc bất cứ điều gì. Mã của tôi có thể yêu cầu những gì nó cần về chức năng mà không cần biết nó hỗ trợ giao diện nào.