2012-02-16 26 views
10

Tôi đã sử dụng khái niệm DI một thời gian, nhưng bây giờ tôi bắt đầu sử dụng một container tiêm phụ thuộc (DIC). Mặc dù có một điều không rõ ràng đối với tôi.Làm thế nào để giữ một thể hiện của một Container Dependency Injection (PHP)

Trong DIC, tôi giữ (ví dụ) đối tượng Config và đối tượng Yêu cầu. Tôi hiểu rằng những đối tượng này trong một phạm vi yêu cầu (Ví dụ tương tự được sử dụng mỗi khi bạn yêu cầu nó từ container này) vẫn giữ nguyên. Nhưng điều này chỉ xảy ra khi tôi tái sử dụng cùng một trường hợp của DIC.

Làm cách nào để vượt qua DIC arround các lớp học của tôi? Nói rằng tôi muốn sử dụng nó trong lớp Router, tôi có cần truyền nó trong constructor của lớp Router không? Nhưng lớp Router được tạo ra trong một lớp khác, và lớp đó cũng đã có đối tượng DIC này.

Hoặc tôi có nên tạo một singleton của DIC này không?

Trả lời

7

Đừng đi tuyến Singleton. Nó mang lại tất cả những lợi thế mà DIC mang lại cho bạn. Thông thường bạn vượt qua các container trong constructor, hoặc như là một tham số phương pháp, nếu có.

Có, điều này yêu cầu bạn phải nỗ lực vượt qua đối tượng vùng chứa xung quanh ứng dụng của bạn, nhưng kết quả là mã của bạn phản ánh tốt rằng các lớp này phụ thuộc vào đối tượng này hoạt động.

+1

Cách tốt nhất là tạo DIC trong bootstrap của ứng dụng của tôi và vượt qua nó khi cần thiết? Có vẻ như là một cách tiếp cận tốt, nhưng quả thực tôi cần phải nỗ lực thêm vào đó. (Các lớp của tôi cũng sẽ rất dễ kiểm thử) – jayv

+0

Đối với một thùng chứa được sử dụng trong toàn bộ ứng dụng, đó có thể là một ý tưởng khá hay. Nó đóng gói tài nguyên/đối tượng một cách hiệu quả, nếu không sẽ cần phải được hiển thị dưới dạng biến toàn cục hoặc Singletons. Hãy nhớ rằng bạn cũng có thể có các thùng chứa DI 'cục bộ', với phạm vi sử dụng giới hạn. Những nội dung đó phải được tạo ra trong phạm vi mà chúng được yêu cầu. – Mchl

+0

Bạn có thể cho tôi một ví dụ thực tế ngắn về việc sử dụng phạm vi giới hạn không? – jayv

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