Trong các ứng dụng của mình, tôi luôn tách biệt mọi thứ, với các mô hình khác nhau cho cơ sở dữ liệu (Entity Framework) và MVC. Tôi cũng đã tách chúng ra thành các dự án khác nhau:
- Ví dụ.Entities - chứa các thực thể của tôi cho EF và bối cảnh DB để truy cập chúng.
- Ví dụ.Models - chứa các mô hình MVC.
- Ví dụ.Web - ứng dụng web. Phụ thuộc vào cả example.Domain và example.Models.
Thay vì giữ các tham chiếu đến các đối tượng khác như các thực thể miền, các mô hình MVC giữ ID làm số nguyên.
Khi một yêu cầu GET cho một trang đến, bộ điều khiển MVC thực hiện truy vấn cơ sở dữ liệu, trả về một thực thể. Tôi đã viết các phương thức "Converter" lấy một thực thể miền và chuyển đổi nó thành một mô hình MVC. Có các phương thức khác làm ngược lại (từ mô hình MVC sang thực thể miền). Mô hình sau đó được chuyển đến khung nhìn và do đó cho máy khách.
Khi có yêu cầu POST, bộ điều khiển MVC nhận được mô hình MVC. Một phương thức chuyển đổi chuyển đổi nó thành một thực thể miền. Phương thức này cũng thực hiện bất kỳ xác nhận hợp lệ nào không thể được biểu thị dưới dạng các thuộc tính và đảm bảo rằng nếu thực thể miền đã tồn tại thì chúng tôi đang cập nhật nó chứ không phải lấy một thuộc tính mới. Các phương thức thường trông giống như thế này:
public class PersonConverter
{
public MyDatabaseContext _db;
public PersonEntity Convert(PersonModel source)
{
PersonEntity destination = _db.People.Find(source.ID);
if(destination == null)
destination = new PersonEntity();
destination.Name = source.Name;
destination.Organisation = _db.Organisations.Find(source.OrganisationID);
//etc
return destination;
}
public PersonModel Convert(PersonEntity source)
{
PersonModel destination = new PersonModel()
{
Name = source.Name,
OrganisationID = source.Organisation.ID,
//etc
};
return destination;
}
}
Bằng cách sử dụng các phương thức này, tôi loại bỏ sự trùng lặp sẽ xảy ra trong mỗi bộ điều khiển. Việc sử dụng thuốc generic có thể lặp lại nhiều thứ hơn nữa.
Làm những việc theo cách này cung cấp nhiều lợi ích:
- Bạn có thể tùy chỉnh một mô hình cho một chế độ xem hoặc hành động cụ thể. Giả sử bạn có mẫu đăng ký cho một người mà khi gửi, sẽ tạo ra nhiều thực thể khác nhau (người, tổ chức, địa chỉ). Nếu không có các mô hình MVC riêng biệt thì điều này sẽ rất khó khăn.
- Nếu tôi cần chuyển nhiều thông tin hơn cho chế độ xem hơn là chỉ có sẵn trong thực thể hoặc kết hợp hai thực thể thành một mô hình duy nhất, thì các mô hình cơ sở dữ liệu quý giá của tôi sẽ không bao giờ được chạm vào.
- Nếu bạn từng tuần tự hóa một mô hình MVC dưới dạng JSON hoặc XML, bạn chỉ nhận được mô hình ngay lập tức được tuần tự hóa, không phải mọi thực thể khác được liên kết với mô hình này.