2010-03-18 45 views
15

Tôi đã nhìn thấy rất nhiều mã sử dụng mẫu dao dịch vụ, tôi không biết nguồn gốc của mẫu này. Nó buộc các dịch vụ gọi lớp phía trước, sau đó đại biểu một số nhiệm vụ dịch vụ để dao.Thực hành tốt nhất cho mẫu DAO?

Tôi muốn hỏi:

  1. Liệu DAO lớp làm hoàn toàn truy cập dữ liệu công việc có liên quan? Điều gì về những thứ như đóng gói ngoại lệ?
  2. Có mẫu nào khác có thể được sử dụng để thay thế này hoặc tốt hơn thế này không?
  3. Tôi nghĩ rằng các mô hình miền pojo và các kịch bản giao dịch làm cho vấn đề thậm chí đơn giản trở nên phức tạp, có thể loại bỏ hoàn toàn lớp dao không?

Trả lời

16

Lý tưởng nhất là lớp DAO của bạn 'tóm tắt' quyền truy cập vào một số hệ thống lưu trữ dữ liệu (cơ sở dữ liệu, hệ thống tệp, thư mục LDAP, ...). Vì vậy, theo nghĩa đó, nó chỉ được sử dụng cho các nhiệm vụ liên quan đến truy cập dữ liệu. Tuy nhiên, bạn cũng có thể có một lớp DAO truy cập một dịch vụ web hoặc một số thành phần khác bên ngoài ứng dụng của bạn. Đó là điểm mấu chốt, nó cung cấp quyền truy cập vào một số thành phần bên ngoài.

Ý tưởng chính là không có chi tiết triển khai nào của lớp DAO của bạn thoát ra lớp cao hơn (cách ly). Một điểm khởi đầu tốt để suy nghĩ về điều này là: tôi sẽ cần phải làm gì nếu tôi dự định thay thế thành phần (một cơ sở dữ liệu ví dụ) mà lớp DAO của tôi cung cấp quyền truy cập vào? Ví dụ, bạn có một số dữ liệu bên trong các tệp XML và bạn định di chuyển dữ liệu vào cơ sở dữ liệu.

Giả sử bạn có tất cả các loại ngoại lệ liên quan đến XML thoát khỏi lớp DAO của bạn. Sau đó, nó trở nên khá khó khăn để di chuyển lớp XML của bạn vào một lớp cơ sở dữ liệu. Tuy nhiên, nếu bạn đã đóng gói tất cả các chi tiết triển khai của lớp DAO của bạn, điều này sẽ trở nên dễ dàng hơn rất nhiều.

Cuối cùng, đó là về khả năng bảo trì mã của bạn. Bạn càng ít phụ thuộc vào chi tiết triển khai của một lớp cụ thể (dịch vụ, DAO, ...), mã của bạn càng được bảo trì tốt hơn.

+1

"Tôi cần làm gì nếu tôi dự định thay thế thành phần (ví dụ cơ sở dữ liệu)" - nếu tôi nhớ chính xác, đó là về Lớp truy cập dữ liệu trong kiến ​​trúc 3 tầng (theo Fowler). – Roman

4

Mục tiêu chính của lớp như vậy là cung cấp sự trừu tượng của back-end bền vững. tuy nhiên, hầu hết thời gian, do các đặc tính của sự kiên trì back-end, tổng số ẩn là không thể; Một ví dụ điển hình là xử lý truy vấn. Để truy vấn một DB bằng cách sử dụng hibernate, bạn sẽ viết một số loại mã truy vấn (sử dụng HQL, API truy vấn, ...) và một mô hình hoàn toàn khác khi sử dụng JCR, BigTable hoặc một thứ khác. Kết quả là, hầu hết thời gian, mô hình này không thành công.

Bên cạnh đó cũng có vấn đề - gây phiền toái hơn của DAO/DTO. Sau đó bạn được đẩy về phía trước để viết một lớp đầu tiên giữ dữ liệu của bạn, sau đó một dữ liệu sao chép thứ hai từ số đầu tiên của bạn mà không có bất kỳ giá trị gia tăng nào chỉ vì mục đích cách ly lớp.

Tuy nhiên, một số công việc đã được thực hiện trong trường này. Đối với một vi-khung tôi đã bắt đầu và thực hiện cho google-app-engine, tôi đã thực hiện một little list của cái gọi là khuôn khổ dao dễ dàng mã này khá trần tục.

Lưu ý rằng tôi dự định trong tương lai có thể cung cấp tính minh bạch hoàn toàn thông qua định nghĩa dịch vụ của gaedo, nhưng đó chỉ là hy vọng ;-) (và không phải bạn quan tâm ngay).

+0

@Riduidel: Tôi có thể tải tài liệu về thiết kế gaedo của bạn ở đâu? – Sawyer

+0

Khám phá blog đã cho, có một số thông tin rải rác trong các tin nhắn khác nhau. Bạn có thể vào trang chủ của gaedo blog (http://gaedo.origo.ethz.ch/blog) và duyệt qua danh sách để có một cái nhìn tổng quan đầy đủ. Nếu bất cứ điều gì là thiếu, đừng ngần ngại gửi tin nhắn! – Riduidel

2

Truy cập vào dữ liệu thay đổi tùy thuộc vào nguồn dữ liệu. Truy cập lưu trữ liên tục, chẳng hạn như cơ sở dữ liệu, thay đổi tùy thuộc vào loại lưu trữ (cơ sở dữ liệu quan hệ, cơ sở dữ liệu hướng đối tượng, tệp phẳng, vv) và triển khai nhà cung cấp.

Sử dụng Đối tượng truy cập dữ liệu (DAO) để trừu tượng hóa và đóng gói tất cả quyền truy cập vào nguồn dữ liệu. DAO quản lý kết nối với nguồn dữ liệu để lấy và lưu trữ dữ liệu.

DAO triển khai cơ chế truy cập cần thiết để làm việc với nguồn dữ liệu. Nguồn dữ liệu có thể là một kho lưu trữ lâu dài như RDBMS, một dịch vụ bên ngoài như trao đổi B2B, kho lưu trữ như cơ sở dữ liệu LDAP hoặc dịch vụ doanh nghiệp được truy cập thông qua giao thức CORBA Internet Inter-ORB Protocol (IIOP) hoặc cấp thấp. Các thành phần kinh doanh dựa trên DAO sử dụng giao diện đơn giản tiếp xúc bởi DAO cho khách hàng của mình. DAO hoàn toàn ẩn các chi tiết thực hiện nguồn dữ liệu từ các máy khách của nó. Bởi vì giao diện mà DAO tiếp xúc với các máy khách không thay đổi khi các thay đổi thực thi nguồn dữ liệu bên dưới, mẫu này cho phép DAO thích ứng với các lược đồ lưu trữ khác nhau mà không ảnh hưởng đến các thành phần kinh doanh hoặc khách hàng của nó. Về cơ bản, DAO hoạt động như một bộ điều hợp giữa thành phần và nguồn dữ liệu.

+2

Phần còn lại của bài viết tại đây: http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html – polypiel

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