A DAO sẽ cấp quyền truy cập vào một nguồn dữ liệu liên quan và tùy thuộc vào mức độ phức tạp của mô hình kinh doanh của bạn, trả về các đối tượng Kinh doanh chính thức hoặc đối tượng Dữ liệu đơn giản. Dù bằng cách nào, các phương pháp DAO nên phản ánh cơ sở dữ liệu hơi chặt chẽ.
Dịch vụ có thể cung cấp giao diện cấp cao hơn để không chỉ xử lý các đối tượng kinh doanh của bạn mà còn để có quyền truy cập vào chúng ngay từ đầu. Nếu tôi nhận được một đối tượng kinh doanh từ một Dịch vụ, đối tượng đó có thể được tạo từ các cơ sở dữ liệu khác nhau (và các DAO khác nhau), nó có thể được trang trí bằng thông tin được tạo từ một yêu cầu HTTP. Nó có thể có logic kinh doanh nhất định chuyển đổi một số đối tượng dữ liệu thành một đối tượng kinh doanh đơn lẻ, mạnh mẽ.Tôi thường tạo ra một DAO nghĩ rằng nó sẽ được sử dụng bởi bất cứ ai sẽ sử dụng cơ sở dữ liệu đó, hoặc tập hợp dữ liệu liên quan đến kinh doanh, nó thực sự là mã mức thấp nhất bên cạnh các trigger, chức năng và các thủ tục lưu trữ bên trong cơ sở dữ liệu.
Câu trả lời cho câu hỏi cụ thể:
tôi đã tự hỏi liệu một DAO thể chứa phương pháp mà không thực sự có làm nhiều với truy cập dữ liệu, nhưng là cách dễ dàng hơn thực hiện bằng cách sử dụng truy vấn ?
đối với hầu hết các trường hợp không, bạn sẽ muốn logic kinh doanh phức tạp hơn trong lớp dịch vụ, lắp ráp dữ liệu từ các truy vấn riêng biệt. Tuy nhiên, nếu bạn lo ngại về tốc độ xử lý, một lớp dịch vụ có thể ủy thác một hành động cho DAO mặc dù nó phá vỡ vẻ đẹp của mô hình, theo cùng cách mà một lập trình viên C++ có thể viết mã trình lắp ráp để tăng tốc các hành động nhất định.
Nghe có vẻ với tôi để được nhiều hơn một phương pháp lớp dịch vụ, nhưng tôi không chắc chắn nếu sử dụng JPA EntityManager trong lớp dịch vụ là một ví dụ về thực hành tốt ?
Nếu bạn định sử dụng người quản lý thực thể trong dịch vụ của mình, hãy nghĩ về người quản lý thực thể làm DAO của bạn, vì đó là chính xác nó là gì. Nếu bạn cần loại bỏ một số tòa nhà truy vấn dư thừa, đừng làm như vậy trong lớp dịch vụ của bạn, giải nén nó vào một lớp mà sử dụng trình quản lý thực thể và làm cho DAO của bạn. Nếu trường hợp sử dụng của bạn thực sự đơn giản, bạn có thể bỏ qua lớp dịch vụ hoàn toàn và sử dụng trình quản lý tổ chức của bạn hoặc DAO trong bộ điều khiển vì tất cả dịch vụ của bạn sẽ thực hiện là chuyển các cuộc gọi tới getAirplaneById()
tới số findAirplaneById()
CẬP NHẬT - làm rõ đối với các cuộc thảo luận dưới đây, bằng cách sử dụng một người quản lý thực thể trong một dịch vụ có thể không phải là quyết định tốt nhất trong hầu hết các tình huống mà cũng có một lớp DAO vì nhiều lý do được nêu trong các ý kiến. Nhưng theo ý kiến của tôi nó sẽ được trao hoàn toàn hợp lý:
- Dịch vụ này cần phải tương tác với bộ dữ liệu khác nhau
- Ít nhất một tập hợp các dữ liệu đã có một DAO
lớp
- Dịch vụ này nằm trong một mô-đun yêu cầu một số sự kiên trì đủ đơn giản để không đảm bảo đó là DAO
ví dụ sau.
//some system that contains all our customers information
class PersonDao {
findPersonBySSN(long ssn)
}
//some other system where we store pets
class PetDao {
findPetsByAreaCode()
findCatByFullName()
}
//some web portal your building has this service
class OurPortalPetLostAndFoundService {
notifyOfLocalLostPets(Person p) {
Location l = ourPortalEntityManager.findSingle(PortalUser.class, p.getSSN())
.getOptions().getLocation();
... use other DAO's to get contact information and pets...
}
}
cảm ơn câu trả lời chi tiết như vậy. tôi chỉ cần tự hỏi: nó sẽ là ok cho cả hai có một bộ sưu tập của DAO và sử dụng EntityManager trong lớp dịch vụ? –
Tôi không nghĩ rằng có bất cứ điều gì sai trái với điều này, hãy nhớ những gì Bohzo nói về lớp dịch vụ là kiên trì thuyết phục. Nếu mọi thứ trở nên nhỏ hơn tầm thường, tôi chỉ có một DAO duy nhất sử dụng trình quản lý thực thể và giao dịch với tất cả các thực thể. Tôi đã không bao giờ tìm thấy bất kỳ sử dụng cho các mô hình phổ biến mà một DAO là cụ thể cho một thực thể hoặc một bảng, tôi nghĩ rằng một DAO nên được ràng buộc với một cơ sở dữ liệu, nếu lớp trở nên lớn, refactor khi nó rõ ràng những gì là dư thừa – walnutmon
ok. Tôi đã hầu như nhìn thấy DAO đã được kết hợp chặt chẽ với một thực thể duy nhất/bảng và suy nghĩ uncoupling sẽ là một hành vi vi phạm thực hành tốt. vì vậy phương thức getAirlinesOperatingFrom() trong câu trả lời của Qwerky là tốt? –