Tôi đang xây dựng một dự án hiện có 3 cụm:Kiến trúc cho dự án web MVC/sử dụng các loại khác nhau của mô hình
- UI
- Core (Dịch vụ & Models, Utilities)
- Repositories (Linq2SQL)
Dependencies là
- Giao diện người dùng -> Lõi
- Lõi -> Kho lưu trữ.
Tôi muốn dịch vụ và mô hình là trong hội đồng của mình và kết thúc với một cái gì đó được xây dựng xung quanh mô hình tức là:
- UI -> Models, Dịch vụ
- Dịch Vụ -> Models , Repositories
- Repositories -> Models
- Models
Th Hệ thống điện tử tôi đang xây dựng về cơ bản là một CMS của trang web vì vậy tôi sẽ có một mô hình cho một trang web (PageModel) có một bộ sưu tập các trang web con. PageModel có thể gọi các phương thức trong một dịch vụ (PageService) để cư trú các trang con của nó nhưng trong thiết kế mới không thể xảy ra vì lắp ráp Mô hình nhất thiết không biết gì về hội đồng dịch vụ.
Tôi đã xem xét một số ý tưởng trong Kiến trúc Onion (cụ thể là tiêm phụ thuộc) để giải quyết vấn đề này, nhưng có vẻ như một giải pháp rõ ràng hơn/rõ ràng hơn có thể có sẵn.
Tôi có cần giới thiệu một lớp Mô hình khác không? Xem mô hình? Tôi nghĩ những gì tôi gọi là Mô hình là Mô hình miền ... Tôi có thể rất sai! Dịch vụ sau đó sẽ là Dịch vụ miền?
Vì vậy, giải pháp của tôi sẽ là:
- UI -> Dịch vụ, ViewModels, Models
- ViewModels -> Dịch vụ, Models
- Dịch Vụ -> Repositories, Models
- Repositories -> Models
- Mô hình
Trong ví dụ này tôi tưởng tượng m y PageViewModel sẽ mở rộng PageModel và sử dụng PageService để tìm nạp các trang con của nó ..
Bất kỳ đề xuất nào được đánh giá cao. Ngoài ra bất kỳ con trỏ trên những gì các lớp mô hình thường được gọi là? Tôi có đang nói về Mô hình DTO hơn là Mô hình miền ở đây không? Và Mô hình Tên miền thay vì Xem Mô hình? Nó có vẻ như những gì tôi đang đề xuất để sử dụng các mô hình xem cho không thực sự là công việc của một mô hình xem ..
Cảm ơn
EDIT:
Cái gì tôi đã không được đề cập ban đầu là Models miền của tôi không phải là dịch cơ bản của các tổ chức cơ sở dữ liệu duy nhất như bạn có xu hướng nhìn thấy trong hầu hết các hướng dẫn. Một mô hình miền có thể chứa các trường dữ liệu đến từ một số bảng cơ sở dữ liệu có liên quan.
Vì vậy, nó sẽ có giá trị có một tập hợp các mô hình hoàn toàn để đóng gói dữ liệu trong tên miền - mà không có bất kỳ phương pháp/thuộc tính tìm nạp các đối tượng liên quan hoặc lưu đối tượng trở lại DB vv? - Đối tượng chuyển dữ liệu.
Từ việc xem xét một vài sơ đồ nguệch ngoạc, điều này có nghĩa là có một nhóm người lập bản đồ trong lớp miền (có vẻ như sai ..) để dịch mô hình DTO sang Mô hình miền và ngược lại. Dự án sẽ được xây dựng xung quanh các mô hình DTO hơn là các mô hình miền nhưng được đưa vào những gì được đóng gói bởi DTO, tôi không thấy đó là một vấn đề.
Đối với bất cứ ai quan tâm, cấu trúc phụ thuộc đề xuất sẽ là như vậy:
- UI -> Dịch vụ, Domain Models
- Dịch Vụ -> Repositories, miền Models, DTO Models
- miền Models - > Repositories, DTO Models
- Mappers -> Mô hình domain, DTO Models
- Repositories -> Models DTO
- DT Mô hình O (không phụ thuộc)
Đó là một chút lộn xộn! Và tất cả chỉ vì tôi muốn PageModel của tôi có thể tìm nạp các PageModels con riêng của mình .. Có vẻ như việc đi tiêm phụ thuộc có thể không phải là một kế hoạch xấu.
Nhờ những người đã trả lời. Bạn đã cho tôi tải để suy nghĩ về.
Cảm ơn Adam. Đặt các giao diện kho lưu trữ trong Miền có vẻ là một cách gọn gàng để giữ mọi thứ tập trung xung quanh miền. Trên điểm kiên trì, Mô hình miền của tôi có các phương thức thuận tiện cho Save(), chỉ cần gọi phương thức Save() trong kho lưu trữ có liên quan. Bạn có xem đó là logic bền bỉ và do đó thực hành không tốt? – Giles
ya, họ không biết gì về nó. Chuyển thực thể đến kho lưu trữ của bạn và để nó là nơi duy nhất để xử lý mọi thứ. điều này sau đó thích hợp với một đơn vị mẫu công việc, vì các kho lưu trữ có thể được tái cấu trúc để bây giờ thực sự lưu nó vào một bộ sưu tập và đơn vị thực hiện công việc lưu bộ sưu tập đó vào db trong một giao dịch. Các dịch vụ của bạn, thay vì gọi Save() trên các mô hình, thay vào đó chỉ cần biết để gọi thực hiện kho lưu trữ, cần được đưa vào bộ điều khiển hoặc kho lưu trữ của bạn. Điều này cho vay chính nó độc đáo để thử nghiệm/mocking/etc. –