2012-07-09 27 views
13

Tôi đang cố gắng giải thích sự khác biệt giữa ba thư mục này và những gì tôi nên đặt vào chúng.Sự khác biệt giữa grails-app/services, grails-app/utils và thư mục src

Hiện tại, tôi đã ném lớp, giao diện và bất kỳ thứ gì khác liên quan trực tiếp đến cấu trúc của các lớp miền của tôi (bằng cách mở rộng hoặc triển khai) vào thư mục src. Bất cứ điều gì liên quan đến logic giao dịch bổ sung ngoài những gì một bộ điều khiển Grails làm theo mặc định tôi đã được đưa vào thư mục grails-app/services. Cuối cùng, bất kỳ lớp nào chứa các phương thức "trợ giúp" (tức là so sánh các thứ khác nhau, các hoạt động chuỗi đặc biệt, v.v.) Tôi đã đưa vào thư mục grails-app/utils.

Nếu tôi đã bỏ lỡ nhãn hiệu cho những thư mục này nên được sử dụng cho xin vui lòng đặt cho tôi trên con đường bên phải.

+0

Bài viết này cũng hữu ích: [link] (http://www.infoq.com/articles/grails-best-practices) – Arrowsmith

Trả lời

11

Điều đó khá gần. grails-app/utils dành cho các lớp Codec - nó được đặt tên kỳ lạ và không có giấy tờ. Tôi muốn di chuyển các lớp trợ giúp trở lại src/groovy.

Sử dụng dịch vụ để thực hiện công việc giao dịch là rất tốt, nhưng bạn cũng có thể sử dụng dịch vụ cho các phương thức không giao dịch. Thêm static transactional = false vào các lớp dịch vụ có các phương thức tiện ích không cần giao dịch. Lưu ý rằng không có giao dịch trong bộ điều khiển, vì vậy bạn nên di chuyển tất cả sự kiên trì sang các dịch vụ giao dịch.

Phương thức tiện ích tĩnh trong lớp trợ giúp src/groovy và phương thức không giao dịch trong dịch vụ tương đương nhau, vì vậy tôi quyết định tuyến đường nào sẽ đi xuống phụ thuộc. Nếu lớp phụ thuộc vào Spring bean, hãy làm cho nó trở thành một dịch vụ và tham khảo chúng thông qua tiêm phụ thuộc. Nếu không, chỉ cần làm cho nó một lớp trợ giúp.

+2

Tôi nghĩ rằng tôi đang bối rối như những gì thực sự xác định một giao dịch. Ở đây (http://grails.1312388.n4.nabble.com/Post-authorization-method-hook-for-Spring-Security-plugin-td4631011.html) Tôi không thể truy cập bất cứ điều gì từ DB của tôi cho đến khi tôi sử dụng 'withTransaction' như bạn đã đề xuất, vì vậy tôi cho rằng bất kỳ logic nào truy cập DB đều là "giao dịch". Bây giờ có vẻ như giả định của tôi là sai. Bạn có thể làm rõ bằng cách xác định những gì được coi là "giao dịch"? – ubiquibacon

+0

Đó là một khái niệm khá phổ biến, không chính xác một cái gì đó bạn muốn xác định trên SO. Google nó :) –

+1

Trích từ [Spring Transaction Management] (http://www.tutorialspoint.com/spring/spring_transaction_management.htm): *** Một giao dịch cơ sở dữ liệu là một chuỗi các hành động được coi là một đơn vị công việc duy nhất . Những hành động này hoàn toàn hoặc hoàn toàn không có hiệu lực. Quản lý giao dịch là một phần quan trọng và các ứng dụng doanh nghiệp định hướng RDBMS để đảm bảo tính toàn vẹn và nhất quán của dữ liệu. Khái niệm giao dịch có thể được mô tả với bốn thuộc tính chính sau đây được mô tả là ACID ... *** – ubiquibacon

2

Nếu bạn thấy mình thêm phương thức vào lớp miền có phụ thuộc vào các lớp không thuộc miền, hãy tự hỏi tại sao phương thức này có thể có trong dịch vụ thay thế. Điều này dẫn đến việc có một dịch vụ tương ứng cho hầu hết các lớp miền.

Điều này giúp đơn giản hóa việc đưa các lớp miền của bạn vào một plugin để bạn có thể mở rộng chức năng bằng cách xây dựng một số ứng dụng sử dụng cùng một mô hình miền thay vì tạo ra một khối bùn lớn không thể duy trì. Nó cũng phù hợp với mô hình ứng dụng được mô tả bởi Bác Bob Martin trong những năm mất tích của kiến ​​trúc http://www.youtube.com/watch?v=WpkDN78P884

Vì bạn đang nghĩ về Kiến trúc, nên đọc một số công việc của chú Bob và Martin Fowler .

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