5

Như tôi đã hiểu, một lớp UnitOfWork có nghĩa là đại diện cho khái niệm về một giao dịch kinh doanh trong miền. Nó không phải là trực tiếp nghĩa vụ để đại diện cho một giao dịch cơ sở dữ liệu, mà là một chi tiết của chỉ có một thực hiện có thể.Mục đích của phương pháp Rollback trong mẫu Đơn vị công việc là gì?

Q: Vậy tại sao quá nhiều tài liệu về mẫu Đơn vị công việc đề cập đến phương pháp "Cam kết" và "Rollback"?

Các khái niệm này không có ý nghĩa gì đối với miền hoặc đối với các chuyên gia tên miền. Một giao dịch kinh doanh có thể được "hoàn thành", và do đó UnitOfWork nên cung cấp một phương thức "Hoàn thành". Tương tự như vậy, thay vì một phương pháp "Rollback", nó có nên được mô hình hóa là "Clear" không?

Cập nhật:

Trả lời: Cả hai câu trả lời dưới đây là chính xác. Họ là hai biến thể của UoW: đăng ký đối tượng và đăng ký người gọi. Trong đăng ký đối tượng, Rollback phục vụ để hoàn tác các thay đổi đối với tất cả các đối tượng trong bộ nhớ. Trong đăng ký người gọi, Rollback phục vụ để xóa tất cả các thay đổi được ghi lại, chẳng hạn như lệnh gọi Commit tiếp theo sẽ không làm gì cả.

Trả lời

2

Mẫu thiết kế Đơn vị công việc, ít nhất được xác định bởi Fowler trong Patterns of Enterprise Application Architecture - là chi tiết triển khai liên quan đến đối tượng quan hệ ánh xạ liên tục . Nó không phải là một thực thể được định nghĩa trong 'Domain Driven Design' của Evans.

Như vậy, nó không phải là một phần của cuộc thảo luận kinh doanh, cũng không phải là một thực thể được tiếp xúc trực tiếp trong mô hình miền - có lẽ ngoại trừ phương thức commit(). Thay vào đó, mục đích của nó là theo dõi các thực thể nghiệp vụ "sạch" và "bẩn" - các đối tượng từ mô hình miền tiếp xúc với khách hàng. Mục đích là cho phép nhiều tương tác - trong các yêu cầu ngữ cảnh web - với một mô hình miền mà không cần phải đọc và ghi từ sự kiên trì (thường là một cơ sở dữ liệu) mỗi lần.

Các pháp nhân kinh doanh gọi nó khi phương pháp của họ được gọi. Khi tình trạng của họ bị thay đổi, họ tự đăng ký là bẩn với Đơn vị Làm việc. Sau đó, Đơn vị Công việc commit() xử lý toàn bộ giao dịch liên tục về cách viết biểu đồ đối tượng và rollback() có nghĩa là khôi phục trạng thái của các thực thể về chúng. Vì vậy, rất nhiều việc thực hiện rò rỉ thông qua "trừu tượng", nhưng ý định của nó là rất rõ ràng.

Mặt khác, "Hoàn tác" và "Hoàn thành" không nhất thiết phải ánh xạ một-với-một với định nghĩa này. Một "Hoàn tác" hoặc "Xóa" chỉ có thể khôi phục một đồ thị đối tượng một phần ví dụ tùy thuộc vào ngữ cảnh kinh doanh. Trong khi "Hoàn thành" cũng có thể được thay đổi trạng thái trên một số thực thể cũng như cam kết đồ thị. Vì vậy, tôi sẽ đặt những phương thức này, với ý nghĩa kinh doanh, trên một Lớp Dịch vụ hoặc đối tượng Gốc tổng hợp.

+0

Thú vị, cảm ơn. Mặc dù tôi có xu hướng không đồng ý rằng UoW chỉ liên quan đến RDBMS (những gì về DB đối tượng, hoặc bộ nhớ giao dịch). Dù sao, câu trả lời của bạn đã nhắc tôi làm nghiên cứu thêm và tôi tình cờ gặp http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html. Tôi thấy có hai loại UoW: đăng ký người gọi và đăng ký đối tượng. Tôi đã sử dụng đối tượng đăng ký (thông qua các phiên NHibernate) nhưng tôi đã không nhận thức rõ ràng về mẫu UoW phía sau nó.Cảm ơn một lần nữa. –

+0

@gWiz: bạn không đồng ý UoW là một chi tiết thực hiện? Nếu bạn đồng ý, thì điểm duy nhất tôi nhận được là các phương pháp bạn thảo luận với người dùng doanh nghiệp không xuất hiện trên UoW. Theo như RDBMS so với sự kiên trì khác, đây là một đối số ngữ nghĩa, người dùng doanh nghiệp của bạn vẫn không quan tâm - UofW áp dụng cho bất kỳ điều gì - câu trả lời của tôi đã được cập nhật vì nó không có nghĩa là chỉ áp dụng cho quan hệ. – orangepips

+0

Thú vị. Tôi nghĩ rằng UoW là một chi tiết thực hiện, nhưng của khái niệm miền "giao dịch kinh doanh", điều quan trọng đối với các chuyên gia miền. Các chuyên gia không nói "Cam kết" hoặc "Rollback", nhưng họ có thể nói "nếu B không được chấp nhận, thì đừng thay đổi A". Đó là chỉ vì ý tưởng của một giao dịch kinh doanh được ẩn/dự kiến ​​cho họ. Tôi sẽ lập luận rằng nhìn chung, các dịch vụ trong DDD phải có "Giao dịch" trong tên (và có thể sử dụng UoW khi triển khai). –

1

Tôi đồng ý. Tôi đoán là nó sử dụng các thuật ngữ "Rollback" và "Commit" bởi vì chúng thực sự là các thuật ngữ đã biết (và có ý định tiết lộ, đặc biệt là cho các lập trình viên). Tuy nhiên tôi nghĩ rằng nó sẽ là chính xác hơn để sử dụng thuật ngữ "Hoàn thành". Liên quan đến "Clear" Tôi không có khuynh hướng đồng ý với bạn. Tôi không nghĩ rằng bất kỳ chuyên gia tên miền nào cũng đồng ý rằng bạn "Xóa" giao dịch kinh doanh. "Hoàn tác" là một thuật ngữ phù hợp hơn trong quan điểm của tôi.

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