Đây có phải là cấu trúc giải pháp Visual Studio tốt cho thiết kế hướng RESTful dịch vụ web không?


15

Tôi đang xây dựng một giải pháp RESTful .NET 4.5 C # Web API và tôi muốn ai đó cho tôi biết nếu giải pháp dự án của tôi là chính xác và / hoặc khôn ngoan (-enough?) Cho một giải pháp được thiết kế bằng Domain Driven Design, xin vui lòng.

Giải pháp đã được chia thành 6 dự án:

  • /Căn cứ

(Không được tham chiếu bởi bất cứ điều gì)

Dự án web và hình thành giao diện giữa giải pháp và thế giới bên ngoài. Chứa các bộ điều khiển API Web. Chứa hầu như không có logic ngoài việc thu thập các giá trị từ các đối tượng yêu cầu và yêu cầu lớp BizApi làm việc.

  • /Biz.Api

(Được tham chiếu bởi Base])

Cung cấp các dịch vụ miền và cho phép dự án giao diện / Cơ sở có quyền truy cập vào các đối tượng logic nghiệp vụ miền trong dự án /Biz.Domain.

  • /Biz.Domain

(Được tham khảo bởi Biz.Api)

Cung cấp các lớp miền cho lớp Biz.Api. Chúng cung cấp các phương thức để thao tác dữ liệu của doanh nghiệp trong bộ nhớ.

  • /Dal.Db

(Được tham khảo bởi Biz.Api)

Lớp kho lưu trữ cơ sở dữ liệu. Truy cập cơ sở dữ liệu và ánh xạ dữ liệu được trả về vào DTO nội bộ được xác định trong lớp / Giao diện.

  • /Dal.Service

(Được tham khảo bởi Biz.Api)

Cung cấp một lớp proxy cho các phụ thuộc bên ngoài như dịch vụ web và ánh xạ dữ liệu được trả về của chúng thành các DTO nội bộ được xác định trong dự án / Giao diện.

  • / Giao diện

(Được tham khảo bởi hầu hết các dự án trên)

Chứa các lớp DTO để truyền dữ liệu xung quanh giải pháp và giao diện C # để xác định hợp đồng cho những thứ như IoC.


"/Biz.Api Cung cấp dịch vụ tên miền": ý bạn là Dịch vụ Ứng dụng? Ngoài ra, các kho lưu trữ thường không trả về DTO mà là các thực thể (gốc tổng hợp). Và sự phụ thuộc giữa các dự án này cũng sẽ rất tốt để biết;)
guillaume31

Vâng, ý tôi là Dịch vụ ứng dụng. Các kho lưu trữ đang trả về các thể hiện của các lớp không làm gì ngoài việc lưu trữ dữ liệu - dữ liệu này được ánh xạ vào thể hiện bằng cách sử dụng, trong trường hợp này là AutoMapper. Ví dụ được trả về không có các phương thức thao tác mà tôi thu thập các Thực thể có.
Matt W

"Dữ liệu này được ánh xạ": giữa cái gì và cái gì? Bạn có ý nghĩa gì bởi "phương pháp thao túng"?
guillaume31

Câu trả lời:


22

Cấu trúc thư mục này được lấy cảm hứng từ cuốn sách thiết kế hướng thực hiện tên miền nổi tiếng của Vaugh Vernon.

Giải pháp:
├ WebService (REST Services cư trú ở đây)
├ WebServiceTests
├ Ứng dụng (dịch vụ ứng dụng cư trú ở đây)
├ ApplicationTests
├ miền (Entities, VO, dịch vụ tên miền, nhà máy miền, thông số kỹ thuật, domain sự kiện, giao diện Repositories, cơ sở hạ tầng dịch vụ giao diện)
├ DomainTests
├ Cơ sở hạ tầng (Kho lưu trữ, Dịch vụ cơ sở hạ tầng, Bộ điều hợp với các dịch vụ bên ngoài)
Cơ sở hạ tầng

Tôi bắt đầu với một Giải pháp sau đó tạo bốn dự án cho mỗi lớp trong ứng dụng của mình, sau đó bốn dự án khác cho mỗi bài kiểm tra lớp.

Không tạo thư mục interfaceshoặc servicestrong lớp miền của bạn thay vào đó các lớp liên quan sẽ được nhóm theo chức năng trong các mô-đun.


1

Theo như cấu trúc, nó có vẻ ổn với tôi mặc dù tôi đã nghĩ ra những cái tên khác nhau, tự mô tả hơn, chẳng hạn như "YourProjectWebApi"thay vì "Base", "Dal.External"thay vì "Dal.Services"và cứ thế.

Tuy nhiên, có thể có mùi trong phần "DTO nội bộ", vì bạn phải đưa các thực thể ra khỏi kho và có thể thực hiện các hành động tên miền (kinh doanh) trực tiếp trên chúng. Các thực thể không chỉ là DTO.

Tôi tập hợp từ thực tế là Dal.Dbkhông có sự phụ thuộc vào Biz.Domain,lớp Miền đang thực hiện một số ánh xạ giữa các DTO từ dự án Giao diện (được trả về bởi Kho lưu trữ?) Và các đối tượng Miền của chính nó. Điều này sẽ không chính xác trong kiến ​​trúc DDD hiện đại (== "củ hành" hoặc "lục giác") - lớp Miền không nên tham khảo các dự án khác. Vì lý do tương tự, các giao diện Kho lưu trữ phải được khai báo trong Miền và không theo Interfacesnhư tôi đoán.

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.