Cả hai Dependency Injection (DI) và Service Locator (SL) đều tuân theo DIP principle. Nó giúp chúng ta tạo ra ứng dụng ít kết dính, dễ hiểu, dễ viết test, dễ mở rộng, bảo trì.
Sự khác biệt giữa DI và SL:
- Sự khác biệt chủ yếu giữa DI và SL là cách cài đặt (implement) để cung cấp một thể hiện cho các lớp của ứng dụng. DI sử dụng một builder object để khởi tạo các đối tượng và cung cấp (inject) các phụ thuộc được yêu cầu cho đối tượng từ lớp bên ngoài. SL sử dụng một locator object để giải quyết (resolve) sự phụ thuộc trong một lớp.
- Khi sử dụng SL, các đối tượng được yêu cầu một cách rõ ràng để nhận một thể hiện của đối tượng và mỗi class có một dependency với SL. Trong khi sử dụng DI không có yêu cầu rõ ràng, dependency injector chỉ được gọi một lần dựa vào config tại thời điểm startup để inject các dependency vào main class.
- SL có thể ẩn các dependency với class client, nhưng client cần phải thấy được Locator. Với DI, client không thấy được class Injector.
- SL cần cung cấp ít nhất một tham số để nhận về thể hiện của một đối tượng do đó gây khó khăn khi viết unit test hơn. Với DI, chúng ta có thể pass một mock object để test.
Hạn chế của DI so với SL là cần phải cấu hình và cần một container để inject các dependency.