2013-01-04 30 views
5

Trong DDD, một thư mục tổng hợp có thể có một kho lưu trữ. Hãy để chúng tôi lấy số Đơn đặt hàng tổng hợp và đối tác không liên tục của nó OrderRepository và đối tác liên tục OrderUoW. Chúng tôi cũng có ProductVariant tổng hợp theo dõi khoảng không quảng cáo của sản phẩm theo thứ tự. Sản phẩm có thể có ProductVariantRepositoryProductVariantUoW.Trong DDD, một UoW cho mỗi Kho hoặc Ngữ cảnh hoặc Giao dịch bị ràng buộc?

Cách đơn đặt hàng và ProductVariant hoạt động là trước khi đơn đặt hàng được duy trì, kiểm tra khoảng không quảng cáo. Nếu có hàng tồn kho, thứ tự sẽ được duy trì bằng cách gọi OrderUoW.Commit(). Có, ProductVariantUoW.Commit() sẽ được gọi bên cạnh để cập nhật khoảng không quảng cáo của sản phẩm.

Những điều không thể xảy ra, người dùng đã mua các sản phẩm tương tự trong thời gian ngắn đó (Hãy xem đây là ứng dụng web nơi hai người dùng đang mua cùng một sản phẩm). Bây giờ toàn bộ giao dịch cho người dùng thứ hai sẽ không thành công bằng cách hoàn nguyên thứ tự vừa tạo. Tôi có nên gọi cho OrderUoW để khôi phục các thay đổi (thứ tự sẽ bị xóa khỏi db) không? Hoặc tôi nên đặt cả hai hoạt động UoW.Commit() trong một phạm vi giao dịch, do đó, không một cam kết() sẽ khôi phục các thay đổi? Hoặc cả hai kho lưu trữ (Order, ProductVariant) chỉ nên có UoW và nó chỉ cần có một phạm vi giao dịch?

Tôi có thể làm cho câu chuyện ngắn gọn bằng cách nói, cách giao dịch được xử lý khi có nhiều kho lưu trữ có liên quan?

Trả lời

1

Một câu hỏi chúng ta có thể hỏi là người đang làm như sau:

Cách Huân và công việc ProductVariant là trước thứ tự được tồn, hàng tồn kho được kiểm tra. Nếu có hàng tồn kho, thứ tự sẽ được giữ nguyên bằng cách gọi OrderUoW.Commit(). Có, ProductVariantUoW.Commit() sẽ được gọi bên cạnh để cập nhật khoảng không quảng cáo của sản phẩm.

Một số người cho rằng loại công việc này thuộc lớp dịch vụ, cho phép lớp dịch vụ đưa mọi thứ qua các đối tượng tổng hợp thành một giao dịch duy nhất.

Theo http://www.infoq.com/articles/ddd-in-practice:

Một số nhà phát triển thích quản lý các giao dịch trong các lớp DAO đó là một thiết kế nghèo. Điều này dẫn đến việc kiểm soát giao dịch quá chi tiết không cung cấp sự linh hoạt trong việc quản lý các trường hợp sử dụng nơi các giao dịch trải rộng trên nhiều đối tượng miền. Các lớp dịch vụ sẽ xử lý các giao dịch; theo cách này, ngay cả khi giao dịch kéo dài nhiều đối tượng miền, thì lớp dịch vụ có thể quản lý giao dịch vì trong hầu hết các trường hợp sử dụng, lớp Dịch vụ xử lý luồng kiểm soát .

Tôi nghĩ thay vì sử dụng một giao dịch duy nhất, bạn có thể xác nhận khoảng không quảng cáo bằng ProductVariant và nếu tất cả các mục khoảng không quảng cáo có sẵn thì bạn có thể thực hiện đơn hàng. Nếu không, (nghĩa là bạn không thể yêu cầu tất cả các sản phẩm bạn cần cho đơn đặt hàng), bạn phải trả lại khoảng không quảng cáo đã được xác nhận quyền sở hữu thành công bằng cách sử dụng giao dịch bù trừ.Kết quả là trong trường hợp cam kết không thành công của một đơn đặt hàng, một số khoảng không quảng cáo sẽ tạm thời không xuất hiện cho các đơn đặt hàng khác, nhưng lợi thế là bạn có thể làm việc mà không có giao dịch phân phối.

Không ít, logic này vẫn thuộc về lớp dịch vụ chứ không thuộc lớp DAO.

+0

Cảm ơn Erik. Hãy để tôi làm rõ rằng bất cứ điều gì tôi đã mô tả trong bài đăng gốc sẽ xảy ra trong lớp dịch vụ ứng dụng, không phải trong lớp miền. Tầng dịch vụ ứng dụng đang điều phối kho lưu trữ, UoW của Order và ProductVariant để gửi một đơn đặt hàng. Câu hỏi của tôi trong bài viết gốc là về thực hiện giao dịch khi có hai UoW có sẵn? –

+0

Tôi nghĩ rằng bạn cần phải soạn UoW nhỏ hơn thành một UoW lớn hơn có hiệu quả làm cho cả hai thành một giao dịch duy nhất. Xem thêm http://stackoverflow.com/a/11658021/471129. –

1

Cách bạn đang sử dụng đơn vị công việc có vẻ hơi chi tiết. Chỉ trong trường hợp bạn chưa đọc Martin Fowler mất: http://martinfowler.com/eaaCatalog/unitOfWork.html

Điều đó đang được nói bạn muốn xử lý giao dịch ở cấp sử dụng. Thực tế là kiểm kê được kiểm tra lên phía trước chỉ đơn giản là một sự thuận tiện (UX) và mức cổ phiếu cần được kiểm tra khi bền bỉ các bit khác nhau. Một ngoại lệ có thể được nâng lên vì không đủ kho.

Mức cách ly giao dịch nên được đặt sao cho hai phần 'đồng thời' được thực hiện một cách serially. Vì vậy, bất cứ ai được cập nhật các mức cổ phiếu đầu tiên sẽ 'giành chiến thắng'. Thứ hai sau đó sẽ tăng ngoại lệ.

+0

Cảm ơn Eben. Kiểm tra khoảng không quảng cáo không chỉ là mối quan tâm về giao diện người dùng. Nó có thể là một mối quan tâm miền như một quy tắc kinh doanh. Tôi đã không giải thích rằng trong vấn đề đó không phải là vấn đề mà tôi đang giải quyết ở đây. –

+0

Chúng ta có nên chỉ có một UoW thực hiện giao dịch hoàn chỉnh cập nhật đơn đặt hàng và biến thể sản phẩm trong một giao dịch duy nhất không? Như bạn đã nói, UOW là tốt trong trường hợp của tôi vì OrderRepository và ProductVariantRepository nằm trong hai Context Contound khác nhau. Vì chúng là các BC khác nhau, chúng sẽ có kho lưu trữ và UoW của riêng chúng. –

+0

Tôi hiểu. Có quá trình đặt hàng span khác nhau BCs thay đổi mọi thứ. Bạn sẽ cần phải theo dõi quá trình và tiểu bang. Đối với quá trình hoàn thành, bạn phải có khả năng 'dự trữ' hoặc 'phát hành' cổ phiếu. Việc phát hành cổ phiếu này sẽ được tuần tự hóa (giao dịch khôn ngoan) và nếu nó không thành công thì bạn sẽ cần hủy đơn đặt hàng. Quá trình hủy cũng phụ thuộc vào việc kinh doanh vì bạn có thể muốn gửi cho người dùng một e-mail có liên kết để đặt mục theo thứ tự trở lại. –

1

Nếu bạn có thể sử dụng một UoW đơn thì hãy làm như vậy, vì nó dễ dàng hơn.

Nếu kho lưu trữ của bạn nằm trên các DB khác nhau (hoặc có thể dựa trên tệp và các tệp khác không) thì bạn có thể bị buộc phải sử dụng nhiều UoW, nhưng sau đó bạn cũng viết các lệnh roll-back, vì nếu UoW1 lưu các thay đổi đối với SqlRepo OK, nhưng sau đó UoW2 không lưu các thay đổi đối với FileRepo thì bạn cần phải khôi phục SqlRepo. Đừng bận tâm viết tất cả các công cụ lệnh rollback nếu bạn có thể tránh nó!

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