2010-09-01 39 views
5

Tôi đã sử dụng ASP.net MVC trong khoảng hai năm nay và tôi vẫn đang học cách tốt nhất để cấu trúc một ứng dụng.lời khuyên về kiến ​​trúc các ứng dụng asp.net mvc

Tôi muốn đưa ra những ý tưởng mà tôi đã thu thập và xem liệu chúng có "được chấp nhận" trong cộng đồng để thiết kế các ứng dụng MVC hay không.

Dưới đây là cách bố trí cơ bản của tôi:

  • DataAccess Dự án - Chứa tất cả các lớp kho, LINQ-to-SQL bối cảnh dữ liệu, lọc, và các đối tượng kinh doanh tùy chỉnh cho kho phi MS SQL db (mà LINQ-to-SQL không tạo). Các kho lưu trữ thường chỉ có CRUD cơ bản cho đối tượng mà chúng đang quản lý.

  • Dự án dịch vụ - Chứa các lớp dịch vụ thực hiện logic nghiệp vụ. Họ nhận đơn đặt hàng từ bộ điều khiển và nói với kho lưu trữ những gì cần làm.

  • UI Project - Chứa các kiểu xem và một số trình bao bọc xung quanh những thứ như Trình quản lý cấu hình (để kiểm tra đơn vị).

  • Dự án MVC chính - Chứa bộ điều khiển và chế độ xem, cùng với javascript và css.

Đây có phải là cách tốt để cấu trúc ứng dụng ASP.NET MVC 2 không? Bất kỳ ý tưởng hoặc đề xuất nào khác?

Mô hình xem có được sử dụng cho tất cả đầu ra cho chế độ xem và nhập từ chế độ xem không?

Tôi đang hướng xuống đường tạo mô hình xem cho từng đối tượng kinh doanh cần hiển thị dữ liệu trong chế độ xem và biến chúng thành các lớp cơ bản với một loạt thuộc tính là tất cả các chuỗi. Điều này làm cho giao dịch với các quan điểm khá dễ dàng. Tầng dịch vụ sau đó cần quản lý các thuộc tính ánh xạ từ mô hình khung nhìn đến đối tượng nghiệp vụ. Đây là một nguồn của một số nhầm lẫn của tôi bởi vì hầu hết các ví dụ tôi đã nhìn thấy trên MVC/MVC2 không sử dụng một mô hình xem trừ khi bạn cần một cái gì đó giống như một hộp combo.

Nếu bạn sử dụng xác thực mô hình mới của MVC 2, bạn sẽ xác thực đối tượng viewmodel và không phải lo lắng về việc đặt thuộc tính xác thực vào đối tượng nghiệp vụ?

Làm cách nào để đơn vị kiểm tra loại xác thực này hoặc tôi không nên kiểm tra đơn vị rằng thông báo xác thực được trả về?

Cảm ơn!

+0

Âm thanh hơi quá mức. Ngoài ra, bạn không có ý định sử dụng các Vùng dự án? Ngoài ra, trông giống như một ứng cử viên tốt cho một Wiki cộng đồng. :) – bzlm

+0

Trừ khi bạn đang có kế hoạch sử dụng các dự án riêng lẻ của mình trong các ứng dụng khác, hoặc ứng dụng sẽ rất lớn, bạn nên OK với một dự án duy nhất. –

+0

@bzlm: Tôi đã có suy nghĩ tương tự lúc đầu về các khu vực, nhưng các khu vực MVC không giống như những gì ông đang nói về; các dự án của anh ta chỉ đơn giản là các thùng chứa tùy ý cho các phần mềm của anh ta. –

Trả lời

2

Thú vị.

Một điều tôi làm khác là tôi chia dự án DataAccess khỏi dự án Tên miền của mình. Dự án miền vẫn chứa tất cả các giao diện cho kho của tôi nhưng dự án DataAccess của tôi chứa tất cả các triển khai cụ thể của chúng.

Bạn không muốn những thứ như DataContext bị rò rỉ vào dự án miền của bạn. Theo sau onion architecture tên miền của bạn không nên có bất kỳ sự phụ thuộc nào vào cơ sở hạ tầng bên ngoài ... Tôi sẽ xem xét DataAccess để có điều đó vì nó được gắn trực tiếp với cơ sở dữ liệu.

Tách chúng ra có nghĩa là miền của tôi không có phụ thuộc vào bất kỳ ORM hoặc cơ sở dữ liệu nào, vì vậy tôi có thể hoán đổi chúng dễ dàng nếu cần.

Chúc mừng,
Charles

Ps. Phụ thuộc dự án của bạn trông như thế nào? Tôi đã tự hỏi nơi để đặt ViewModels của tôi. Có lẽ một dự án giao diện người dùng riêng biệt là một ý tưởng hay, nhưng tôi không hoàn toàn chắc chắn rằng nó sẽ hoạt động như thế nào. Làm thế nào để chúng chảy qua các tầng dự án khác nhau của ứng dụng của bạn?

+0

Đọc nhận xét của bạn và có vẻ như bạn không thể làm điều này với LINQ to SQL, điều này đúng. Tôi chắc chắn sẽ xem xét sử dụng NHibernate hoặc EntityFramework CodeFirst. EF CodeFirst thực sự khá thú vị ... Tôi đang sử dụng nó với một lược đồ hiện có và tôi chỉ chạy vào một vấn đề, nhưng đó là nhiều việc phải làm với cơ sở dữ liệu được thiết kế như thế nào (ngớ ngẩn). – Charlino

+0

Sự phụ thuộc của dự án là một cái gì đó như thế này: Dự án MVC chính phụ thuộc vào DataAccess, dịch vụ và giao diện người dùng; DataAccess phụ thuộc vào không có gì (ngoài các công cụ khung công tác LINQ/ef); Dịch vụ phụ thuộc vào các dự án DataAccess và UI; và giao diện người dùng phụ thuộc vào không có gì. Như tôi đã nói, tôi có một số lớp wrapper trong giao diện người dùng mà làm cho tôi thêm một phụ thuộc vào khuôn khổ MVC. Tôi đã tranh luận liệu có nên chuyển các lớp đó vào dự án MVC để loại bỏ sự phụ thuộc này hay không. Sau đó, giao diện người dùng sẽ chỉ giữ các lớp mô hình chế độ xem đơn giản. – Dragn1821

+0

Hiện tại, tôi đang suy nghĩ về việc sử dụng các kiểu xem để chấp nhận tất cả đầu vào hoặc để hiển thị đầu ra ở cấp chế độ xem.Sau đó, bộ điều khiển sẽ chuyển mô hình khung nhìn tới tầng dịch vụ, nơi mô hình khung nhìn sẽ được ánh xạ tới lớp ORM mà LINQ-to-SQL tạo ra trước khi lớp ORM được chuyển vào kho lưu trữ. Hoặc, lớp ORM được đọc từ kho lưu trữ và được ánh xạ tới lớp mô hình khung nhìn được trả về từ lớp dịch vụ thông qua bộ điều khiển và khung nhìn. Vì vậy, các lớp dịch vụ sẽ làm tất cả các nâng nặng. Điều này nghe có vẻ giống như một cách tiếp cận tốt? – Dragn1821

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