Tách logic nghiệp vụ khỏi logic DB với các giao dịch


11

ngành kiến ​​trúc

Chúng tôi có ba lớp trong ứng dụng của chúng tôi. Lớp dịch vụ để cung cấp API bên ngoài. Lớp BO cho logic nghiệp vụ của chúng tôi và lớp DAO cho kết nối cơ sở dữ liệu của chúng tôi.

Giả sử mỗi lần chúng tôi cập nhật Tệp, chúng tôi cũng muốn thay đổi một cái gì đó trong Thư mục, ví dụ: 'ngày sửa đổi lần cuối'. Điều này cần phải được thực hiện trong một giao dịch. Nó thành công và cả Tệp và Thư mục đều được chỉnh sửa. Hoặc có một thất bại và giao dịch được khôi phục để cả hai đối tượng đều ở trạng thái trước đó.

Hoạt động "Chỉnh sửa thư mục khi tệp được chỉnh sửa" hoàn toàn là logic kinh doanh. Vì vậy, điều này có nghĩa là nó thuộc về lớp BO. Tuy nhiên, chúng tôi sử dụng Objectify cho Cơ sở dữ liệu của chúng tôi, vì vậy để bắt đầu giao dịch, chúng tôi cần gọi ofy (). Giao dịch (...). Nếu chúng ta gọi hàm này trong lớp BO, điều này sẽ phá vỡ thiết kế của chúng ta vì sẽ có các cuộc gọi cụ thể Cơ sở dữ liệu (Objectify) trong lớp Business của chúng ta.

Điều gì sẽ là một giải pháp sạch cho vấn đề này?


Không thể FileBOgọi FolderBO.edit(newDate)vì vấn đề giao dịch?
Phát hiện

java không có khả năng tương đương với c # TransactionScope?
Ewan

Trong Java, phạm vi giao dịch phụ thuộc vào khung bạn sử dụng. Trong JEE, nó có thể được quản lý bởi máy chủ ứng dụng nhưng thường được xác định và quản lý các ví dụ khai báo như Spring (chú thích vía, xml, ...)
Laiv

Đừng lo lắng về việc cố gắng tạo ra các "lớp" khác nhau cho ứng dụng của bạn hoạt động độc lập / không biết gì về nhau. Nắm bắt ý tưởng rằng mã của bạn được xây dựng cho kiến ​​trúc mà nó hỗ trợ và thay vào đó tập trung vào việc làm cho mã đó được sáng tác tốt đối với chính nó.
Ant P

Câu trả lời:


5

Làm thế nào bạn cắt giao dịch của bạn thực sự là logic kinh doanh. Vì vậy, hãy để lớp DAO của bạn cung cấp API độc lập khung db cho transactphương thức bạn đã đề cập (và có thể cho những thứ như commitrollback). Sau đó, bạn có thể sử dụng nó từ lớp BO của mình mà không khiến nó phụ thuộc vào cơ sở dữ liệu hoặc khung db của bạn.


4

Có vẻ như Objectify được thiết kế cho các giao dịch giống như nguyên tử ( Giao dịch của Công cụ Ứng dụng Google ). Nó sẽ yêu cầu bạn phát triển sự trừu tượng của riêng bạn về Quản lý giao dịch .

Trong trường hợp này. sự trừu tượng diễn ra Làm thế nào để tôi ủy quyền quản lý giao dịch cho các lớp trên?

Cách tiếp cận @DocBrown xem xét cho tôi giải pháp nhanh hơn và sạch hơn để triển khai kiến ​​trúc đã cho ( kiến trúc phân lớp ).

Do chúng tôi bỏ lỡ quá nhiều thông tin về ứng dụng và bối cảnh của nó, giải pháp của Doc dường như cũng an toàn nhất với tôi.

Tuy nhiên, tôi sẽ khuyên bạn nên xem mẫu thiết kế của UnitOfWork cho lớp doanh nghiệp . Tôi nghĩ rằng nó phù hợp với việc quản lý giao dịch được xác định bởi Objectify .

Tóm tắt ngắn gọn, mô hình nhằm mục đích gói gọn các quy tắc kinh doanh vào Giao dịch kinh doanh (đơn vị công việc). Mẫu cho phép kế thừa giữa các B.T và cho đến nay tôi thấy, Objectify cũng vậy. Nó thậm chí còn hỗ trợ thành phần. Vì vậy, bằng cách thành phần hoặc kế thừa, cách tiếp cận cho phép B.Ts phức tạp .

Áp dụng cho kiến ​​trúc đã cho, sẽ như sau:

FileService -> FileBO : new EditFileTransaction().execute()
                           |-> ofy().transact(...)
                           |--> FileDAO.actionA()
                           |--> FolderDAO.actionA()
                           |-> [ofy().commit(...)|ofy().rollback()]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.