2012-03-15 27 views
9

Tôi hiện đang tái cấu trúc thư viện PHP dựa trên khung công tác Zend của mình từ việc sử dụng một trình định vị dịch vụ tới (dependator) dependency injection (DI). Tôi cảm thấy rằng nó cải thiện mã của tôi rất nhiều, nhưng tôi không chắc chắn nếu tôi nên tiêm tất cả các phụ thuộc. Một định vị dịch vụ có vẻ dễ dàng hơn cho các phụ thuộc được sử dụng rất nhiều và không xác định. Tôi có các phụ thuộc sau mà tôi vẫn truy cập bằng cách sử dụng công cụ định vị dịch vụ:Tiêm phụ thuộc: tôi có nên tiêm mọi thứ hoặc sử dụng bộ định vị dịch vụ cho một số đối tượng không?

  1. Đối tượng Zend_Translate (Tôi cần dịch thư ở khắp mọi nơi).
  2. đối tượng A Zend_Locale (lưu trữ các ngôn ngữ hiện tại)
  3. Một Zend_Config đối tượng (rất nhiều thứ được cấu hình bởi ini-file)
  4. Instances của các tầng lớp tiện ích (đối với mảng và thao tác chuỗi)

Nếu tôi tiêm các phụ thuộc này, chúng sẽ làm lộn xộn các nhà xây dựng của tôi và làm sao lãng các phụ thuộc cụ thể. Để thử nghiệm, tôi chỉ có thể thiết lập các phụ thuộc này trong trình định vị dịch vụ của tôi trước khi chạy thử nghiệm. Người thực dụng trong tôi nói rằng tôi đang làm tốt, nhưng người theo chủ nghĩa thuần túy nói rằng tôi nên đi tất cả con đường với DI.

Bạn có đề xuất DI cho các loại đối tượng này hay không?

+3

không thể trả lời được. Bạn dường như biết rằng có ưu và khuyết điểm. Đó là vào bạn để đưa ra quyết định có ý thức. – Gordon

+0

Vâng, câu hỏi đặt ra là: bạn có muốn giới thiệu DI cho điều đó hay không, do đó, câu hỏi là rõ ràng theo nghĩa đó. – markus

+0

Có rất ít câu hỏi tôi upvote VÀ bỏ phiếu để đóng. Đó là một câu hỏi tuyệt vời, nhưng có vẻ như tùy thuộc vào bạn để quyết định. Đó là ứng dụng của bạn, và bạn biết những ưu và khuyết điểm của chủ đề. –

Trả lời

18

Khi nói đến mối lo ngại về việc làm lộn xộn các nhà thầu, rất có thể là a code smell that the classes are violating số Single Responsibility Principle. Xây dựng tiêm là rất có lợi ở đây bởi vì nó làm cho điều này rõ ràng hơn nhiều.

Một số người cũng lo lắng về việc tiêm phụ thuộc chỉ hiếm khi được sử dụng, nhưng that's not a problem either. Khi nói đến việc tạo đồ thị đối tượng, hiệu suất hiếm khi là một vấn đề, và ngay cả khi nó là, mẫu Proxy ảo có thể sửa chữa nó.

Tóm lại, không có lý do gì để sử dụng Trình định vị dịch vụ. Luôn luôn có một lựa chọn tốt hơn có liên quan đến đảo ngược kiểm soát.

+2

Đúng. Tuy nhiên, có những tình huống khi sử dụng Service Locator là cách duy nhất để thực hiện đảo ngược phụ thuộc. Ví dụ, khi một lớp đang được khởi tạo bởi một khung bên thứ ba không hỗ trợ Dependency Injection. –

Các vấn đề liên quan