Tôi muốn:ServiceLocator và Mở/Đóng Nguyên tắc
- Hãy thường đòi hỏi các dịch vụ có thể nhìn thấy tất cả các lớp học cần đến chúng,
- với tối thiểu là soạn sẵn, và
- mà không bị mất testability !
Đó là một dự án nhỏ và tôi nghĩ DI có thể quá mức cần thiết, nhưng có thể tôi đã sai? Nhưng dù sao, tôi đã được tập trung vào các ServiceLocator pattern as described by Martin Fowler
Trong một lớp khách hàng xây dựng, tôi có một cái gì đó như thế này:
this->db = Locator::getDb();
this->log = Locator::getLogger();
Sau đó, phần còn lại của lớp phương pháp truy cập dịch vụ thông qua các thuộc tính những thành viên, ví dụ như :
this->fooModel = new fooModel(this->db);
fooItem1234 = this->fooModel->findById(1234);
Tuy nhiên tôi cũng sẽ giống như mức độ tầm nhìn cho "mô hình" đối tượng (như fooModel ở trên) vì chúng được truy cập từ nhiều nơi khác nhau và không có cần thiết phải có nhiều hơn một ví dụ. Vì vậy, suy nghĩ ban đầu của tôi là mở rộng Locator để có một ::getFooModel()
nhưng bây giờ có vẻ như tôi đang vi phạm Nguyên tắc Mở/Đóng, vì tôi sẽ phải sửa đổi Locator mỗi khi tôi giới thiệu một lớp mô hình mới.
Để thỏa mãn OCP, tôi có thể sử dụng Trình định vị dịch vụ động (cũng được mô tả trên trang của Fowler), tuy nhiên tôi không hoàn toàn được bán vì lý do tương tự như ông, tức là nó không đủ rõ ràng.
Một giải pháp khác là chỉ làm cho tất cả các phương thức của mô hình của tôi tĩnh. Vì vậy:
fooItem1234 = FooModel::findById(1234);
Tôi thích điều này vì không có bản mẫu. Tôi chỉ có thể tạo một lớp mô hình mới và bắt đầu gọi nó từ bất kỳ đâu bằng một dòng. Nhưng bây giờ mô hình phụ thuộc vào Locator để tìm kết nối DB của nó và tôi không chắc tôi cảm thấy thế nào về điều đó. Đối với một, nếu tôi đã bao giờ cần phải có hai fooModels mở trên các kết nối cơ sở dữ liệu riêng biệt, nó sẽ là một mớ hỗn độn và/hoặc không thể. Điều đó nói rằng, tôi không thực sự cần phải làm điều đó hiện tại vì vậy tùy chọn này có vẻ hơi hấp dẫn.
Cuối cùng, có DI. Nhưng như tôi đã nói ở trên, tôi nghĩ rằng nó có thể là quá nhiều cho dự án nhỏ này.
Kết luận: Tôi hơi bị kẹt ở đây và sẽ đánh giá cao một số lời khuyên từ các chuyên gia về StackOverflow!
Có nghĩa là tôi sử dụng hộp chứa khi tôi nói tôi nghĩ DI sẽ quá mức, xin lỗi. Và cảm ơn câu trả lời! Tôi lấy nó khi bạn nói Constructor Injection bạn đang nói tôi chỉ nên vượt qua các đối tượng dbconn và logger của tôi vào các hàm tạo của các lớp phụ thuộc vào chúng? Nếu vậy, đây thực sự là những gì tôi đang làm. Sau đó, vì lý do nào đó, tôi quyết định phải thêm logger vào prototype của constructor của mỗi class là xấu. Nhưng bây giờ bạn đã làm cho tôi suy nghĩ về nó, nó có vẻ có ý nghĩa hơn nhiều so với những gì tôi đã cố gắng để làm với ServiceLocator này. – oops
Tuyệt. Sau đó, những gì bạn thường kết thúc làm là để ngăn xếp hoặc bọc phụ thuộc. Có thể bạn sẽ có rất nhiều dịch vụ cấp thấp, nhưng bạn thường có thể quấn hai hoặc ba trong số này trong các đối tượng có ý nghĩa, và sau đó chỉ tiêm một trong các dịch vụ này thay vì ba dịch vụ cấp thấp. Bạn có thể lặp lại điều này nhiều lần vì bạn muốn giữ số phụ thuộc giảm cho các lớp riêng lẻ. –
Điều gì về xếp chồng/gói không hoàn toàn liên quan đến những thứ - ví dụ như DBconn và logger từ ví dụ của tôi ở trên - vào một đối tượng gọi là "config" hoặc là hình thức xấu? – oops