Giả sử tôi có một lớp gọi là PermissionManager chỉ nên tồn tại một lần cho hệ thống của tôi và về cơ bản hoàn thành chức năng quản lý các quyền khác nhau cho các hành động khác nhau trong ứng dụng của tôi. Bây giờ tôi có một số lớp trong ứng dụng của tôi mà cần để có thể kiểm tra một sự cho phép nhất định trong một trong các phương pháp của nó. Phương thức khởi tạo của lớp này hiện công khai, tức là được người dùng API sử dụng.Thực hành Singleton & Dependency Injection question
Cho đến một vài tuần trước, tôi sẽ phải chỉ đơn giản là có lớp học của tôi gọi sau pseudo-code ở đâu đó:
PermissionManager.getInstance().isReadPermissionEnabled(this)
Nhưng kể từ khi tôi đã nhận thấy tất cả mọi người ở đây ghét độc thân + này loại khớp nối, tôi đã tự hỏi giải pháp tốt hơn sẽ là gì, vì các đối số tôi đã đọc đối với các singletons dường như có ý nghĩa (không thể kiểm tra, ghép nối cao, v.v.).
Vì vậy, tôi có thực sự yêu cầu người dùng API chuyển vào một cá thể PermissionManager trong hàm tạo của lớp không? Mặc dù tôi chỉ muốn một cá thể PermissionManager duy nhất tồn tại cho ứng dụng của tôi?
Hoặc tôi đang đi về điều này tất cả sai và nên có một nhà xây dựng ngoài công lập và một nhà máy ở đâu đó mà đi trong trường hợp của PermissionManager cho tôi?
bổ sung thông tin Lưu ý rằng khi tôi nói "Dependency Injection", tôi đang nói về DI Pattern ... Tôi không sử dụng bất kỳ khuôn khổ DI như Guice hoặc mùa xuân. (... chưa)
Điểm về việc tiêm thông qua giao diện là một điểm quan trọng. Khả năng giả lập đối tượng PermissionManager trong các thử nghiệm là điều làm cho DI trở thành một cách tiếp cận mạnh mẽ để có thể kiểm tra được mã. –
nếu PermissionManager chính nó có một phụ thuộc. Có cách nào ít lạ hơn PermissionManager.getInstance (Foo) không? ? –