2010-01-19 19 views
17

Tôi đã sử dụng để thiết kế ứng dụng của mình xung quanh mô hình miền thiếu máu, vì vậy tôi có nhiều đối tượng kho lưu trữ, được đưa vào lớp dịch vụ nhận biết giao dịch lớn, chất béo. Mẫu này được gọi là tập lệnh Giao dịch. Nó không được coi là một thực hành tốt vì nó dẫn đến mã thủ tục, vì vậy tôi muốn chuyển sang thiết kế hướng miền.Thiết kế và giao dịch định hướng miền trong môi trường Spring

Sau khi đọc vài bài báo trên web, nghe bài nói chuyện của Chris Richardson về Parleys và đọc các chương DDD của POJOs in Action, tôi nghĩ tôi đã có bức tranh lớn.

Vấn đề là tôi không biết, cách tổ chức các giao dịch trong ứng dụng của mình. Chis Richardson trong cuốn sách của ông khẳng định:

Các tầng presentation xử lý các yêu cầu HTTP từ trình duyệt của người dùng bằng cách gọi mô hình miền trực tiếp hoặc gián tiếp thông qua một mặt tiền, mà như tôi được mô tả trong chương trước là hoặc là một POJO hoặc EJB.

Tốt cho đến nay, nhưng Srini Penchikala trên InfoQ article trạng thái:

Một số nhà phát triển thích quản lý các giao dịch trong các lớp DAO mà 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 mang lại sự linh hoạt trong việc quản lý các trường hợp sử dụng trong đó 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ụ nên 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 Service xử lý luồng điều khiển.

Ok, vì vậy nếu tôi hiểu điều này một cách chính xác, lớp lưu trữ không được giao dịch, lớp dịch vụ (hiện nay mỏng hơn nhiều) là giao dịch (như trước đây trong mẫu kịch bản giao dịch). Nhưng nếu đối tượng miền được gọi trực tiếp bởi lớp trình bày thì sao? Có nghĩa là, đối tượng miền của tôi nên có hành vi giao dịch? Và làm thế nào để thực hiện nó trong môi trường Spring hoặc EJB?

Điều này có vẻ kỳ lạ đối với tôi, vì vậy tôi sẽ rất vui nếu có ai đó làm rõ điều đó. Cảm ơn bạn.

+0

Tôi đã thêm thẻ java, vì nó liên quan đến tất cả các loại DI + ORM (không chỉ trong java, nhưng đó là ngữ cảnh của bạn) – Bozho

Trả lời

8

Việc cá nhân tôi áp dụng DDD với Spring và Hibernate, cho đến nay, là có một lớp dịch vụ giao dịch không trạng thái và truy cập các đối tượng miền thông qua đó. Vì vậy, cách tôi đang làm nó mô hình miền không biết về giao dịch ở tất cả, được xử lý hoàn toàn bởi các dịch vụ.

Có một số example application bạn có thể thấy hữu ích khi xem qua. Có vẻ như Eric Evans đã tham gia vào việc tạo ra nó.

+0

Cảm ơn câu trả lời của bạn. Vì vậy, ví dụ khi bạn muốn tồn tại một thực thể, bạn gọi service.save (thực thể). Mục tiêu của tôi là duy trì các thực thể bằng cách gọi entity.save(), như được mô tả bởi Craig Wells tại đây: http://groups.google.ca/group/EtoE/browse_thread/thread/cac1eafe15f06f5b/ – semberal

+0

Bạn nói đúng, mã của tôi những thứ như service.save (thực thể). Tôi không quan tâm đến cách tiếp cận 'entity.save()', tôi sẽ đọc bài viết bạn đã liên kết và chỉnh sửa câu trả lời của tôi bằng một lời giải thích.) –

+1

Và trong trường hợp của service.save (thực thể) logic nào vẫn còn trong đối tượng miền? – Bozho

5

Xem this extremely useful blog-post. Nó giải thích làm thế nào để đạt được DDD trơn tru trong khi không mất khả năng của Spring và JPA. Nó được đặt ở giữa chú thích @Configurable.

Ý kiến ​​của tôi về những vấn đề này hơi không phổ biến. Mô hình dữ liệu thiếu máu thực sự không sai. Thay vì có một đối tượng có dữ liệu + thao tác, bạn có hai đối tượng - một đối tượng có dữ liệu và một đối tượng có hoạt động. Bạn có thể xem chúng dưới dạng một đối tượng - tức là thỏa mãn DDD, nhưng vì mục đích sử dụng dễ dàng hơn, chúng được tách riêng cách nhau. Về mặt logic, chúng giống nhau.

Có, điều này phá vỡ đóng gói, nhưng nó không làm cho bạn sử dụng một số 'ma thuật' (aop + đại lý java) để đạt được mục tiêu của bạn.

Đối với giao dịch - có điều gì đó được gọi là Tuyên truyền giao dịch. Spring hỗ trợ nó với @Transactional(propagation=Propagation.REQUIRED). See this, point 9.5.7. Trong trường hợp bạn muốn các giao dịch của bạn mở rộng nhiều phương thức (của nhiều đối tượng), bạn có thể thay đổi thuộc tính truyền cho phù hợp.Bạn cũng có thể sử dụng @Transactional trong lớp dịch vụ của bạn, nếu thích hợp, nhưng điều này có thể giới thiệu rất nhiều các lớp dịch vụ lò hơi trong trường hợp bạn muốn sử dụng các thao tác đơn giản, một bước như "lưu".

+0

Xin chào, cảm ơn bạn đã trả lời. Tôi đã đọc bài viết đó. Hai giải pháp được đề xuất đầu tiên là không thể chấp nhận được. Tôi không thích giải pháp với các interceptor ngủ đông, bởi vì (theo như tôi đã hiểu) nó chỉ giải quyết việc tiêm đậu hibernate-instantiated. AspectJ giải pháp có vẻ khá tốt. Tôi sẽ chỉ phải tìm hiểu cách sử dụng các giao dịch trong các lớp @Configurable. Nhưng nó không trả lời câu hỏi, liệu mô hình miền của tôi có nên giao dịch hay không. Nếu không, giao dịch được cho là ở đâu. – semberal

+0

Tôi đã thêm một đoạn liên quan đến giao dịch. – Bozho

+0

Tôi biết, nhưng bài viết bạn đã đăng đề cập đến, các lớp @Configurable không hoạt động với @Transactional. – semberal

0

Tôi nghĩ một cách dễ dàng để bắt đầu với DDD và Spring và có các ví dụ tốt về cách xử lý giao dịch bằng cách xem một trong các ứng dụng mẫu được giao với Spring Roo. Roo tung ra mã tuân theo các nguyên tắc DDD. Nó dựa chủ yếu vào AspectJ. Tôi nghi ngờ nó đã được thực hiện xây dựng trên những ý tưởng đưa ra (trở lại trong năm 2006) bởi một trong những nặng ký của SpringSource, Ramnivas Laddad, in this talk.

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