Chúng tôi có nhiều DAO trong một dự án hiện có (hiện tại không có giao diện, nhưng điều đó có thể thay đổi). Thay vì hệ thống dây điện một Spring bean được quản lý cho mỗi lớp DAO và tiêm chúng vào các lớp dịch vụ, chúng tôi có một DAO "nhà máy" của các loại trông như thế này:Chiến lược cho nhiều DAO trong Spring Java
public class DAOFactory {
private static DAOFactory daoFac;
static{
daoFac = new DAOFactory();
}
private DAOFactory(){}
public static DAOFactory getInstance(){
return daoFac;
}
public MyDAO1 getMyDAO1(){
return new MyDAO1();
}
public MyDAO2 getMyDAO2(){
return new MyDAO2();
}
...
(Lưu ý rằng MyDAO1 và MyDAO2 là lớp bê tông)
Điều này cho phép chúng tôi dễ dàng thêm/gọi các phương thức DAO trong lớp Dịch vụ, mà không cần phải 1.) thêm giao diện DAO làm thuộc tính cho lớp dịch vụ 2.) triển khai DAO vào phương thức dịch vụ thông qua cấu hình. (Và đôi khi chúng tôi sử dụng nhiều DAO trong một lớp dịch vụ).
DAOFactory.getInstance().getMyDAO1().doSomething();
Chiến lược này đã có hiệu quả cho chúng tôi, nhưng tôi tự hỏi liệu có cách nào tốt hơn nếu chúng tôi có thể bắt đầu mới không? Tôi nhìn autowiring DAO như đậu, nhưng tôi vẫn cần phải tạo thuộc tính trong mỗi lớp dịch vụ để đại diện cho những DAO đang được sử dụng. Và trong một dự án lớn, tôi đang do dự để bắt đầu tự động dây đậu anyway - chúng ta cần phải cung cấp khả năng hiển thị cho tất cả các nhà phát triển.
Tôi cảm thấy như tôi đang lật-thả giữa một.) Được kết hợp chặt chẽ với việc triển khai, nhưng ít chi phí mã/cấu hình và b.) Được kết nối lỏng lẻo với giao diện, nhưng đòi hỏi nhiều chi phí mã/cấu hình.
Có cách nào tốt hơn tôi bị thiếu không? Một cái gì đó ở giữa? Ý kiến được hoan nghênh.
Tại sao bạn sử dụng Spring nếu bạn không như tiêm phụ thuộc? Chỉ cần autowire các DAO trong các lớp dịch vụ: đó là những gì Sring và DI là tất cả về. Sau đó viết một bài kiểm tra đơn vị cho dịch vụ của bạn bằng cách tiêm một DAO giả và xem xét việc thử nghiệm nó dễ dàng hơn bao nhiêu so với một nhà máy tĩnh. –
Chúng tôi có một lớp học tương tự như lớp bạn đang cố gắng ở đây, nhưng như JB Nizet đề cập, chúng tôi @Autowired DAOs vào nó. Một điều quan trọng về autowiring DAOs là Spring quản lý chúng tại Singletons theo mặc định, vì vậy bạn sẽ không nhận được rất nhiều sáng tạo đối tượng. Ví dụ mã của bạn tạo ra một bản sao mới của mỗi DAO mỗi khi bạn cần sử dụng một DAO nhất định, và sẽ không cần thiết cho điều đó. – Marvo
@JB Nizet: Chúng tôi sử dụng DI nhiều, không chỉ cho DAO. Tôi không nghĩ ra phương pháp này, nhưng tôi có cơ hội để làm lại nó, do đó câu hỏi. –