Đó có phải là ý tưởng tốt để thêm ViewModel giống hệt như Model không


16

Tôi có các lớp sau trong giải pháp của mình:

  1. Ứng dụng tên miền
  2. Ứng dụng dịch vụ
  3. App.Core (có thể bạn gọi đây là App.DataLayer)
  4. Ứng dụng web

Mẫu thiết kế phần mềm không phải là câu hỏi của tôi, tôi đã theo Model trong Domain

public class Foo {
    public int Id {get;set;}
    public int Name {get;set;}
    public int Value {get;set;}
}

Tôi muốn sử dụng mô hình này trên chế độ xem (ví dụ trang chủ) VÀ tôi muốn sử dụng Id, Name & Value, vì vậy nếu tôi muốn tạo ViewModel, tôi sẽ thêm vào như sau:

public class FooViewModel {
    public int Id {get;set;}
    public int Name {get;set;}
    public int Value {get;set;}
}

Vì vậy, đó là ý tưởng tốt? hoặc chỉ sử dụng Foothay vì FooViewModel?


Tôi không chắc là tôi hiểu điều này. Không phải Modelthường được truyền cho View? Tại sao chính xác bạn cần phải tạo lại các lĩnh vực Modeltrong View? Nếu tách mối quan tâm là một mục tiêu MVC, trong những trường hợp nào người ta sẽ muốn làm điều tương tự với ModelView? Nếu ViewModellà cả hai, tại sao không bằng cách mở rộng / sáng tác cả hai ModelView?
null

xin vui lòng đọc ý kiến ​​của tôi về câu trả lời của @ svidgen
Mehdi Dehghani

Tôi có một vấn đề liên quan - khi xác thực (thuộc tính bắt buộc) trên các mô hình (và trong cơ sở dữ liệu) trạng thái nhất định phải được nhập - nhưng trong chế độ xem, các giá trị đó không cần phải có - vì vậy tôi buộc phải sao chép một số trường từ các mô hình int mô hình xem - thay vì tham chiếu mô hình trực tiếp. Tuy nhiên, theo phản ánh thì điều này có thể ổn và thực sự không vi phạm DRY vì chúng dành cho các mục đích khác nhau (dù sao cũng không quá tệ).
niico

Câu trả lời:


20

Điều này có thể trông giống như vi phạm quy tắc DRY ban đầu, nhưng tôi cho rằng "mã tương tự và thậm chí giống hệt nhau" không nhất thiết là "sự lặp lại" nếu nó làm điều gì đó khác biệt hoặc có thể thay đổi độc lập. Và trong trường hợp mô hình khung nhìn, mã đang xác định những gì "khách hàng" nhìn thấy, không nhất thiết là các thực thể và hoạt động mà doanh nghiệp nói đến. Vì vậy, bạn thường tiết lộ các mô hình cho máy khách hoặc giao diện giống như "tình cờ giống hệt nhau". Bạn có thể thay đổi các quy tắc và điều khoản kinh doanh hoặc thuật ngữ người dùng cuối độc lập với nhau.

Vì vậy, tôi sẽ chuyển câu hỏi lại cho bạn. Nếu tên miền thay đổi, các máy khách "phiên bản 1" có thể chấp nhận tiếp tục sử dụng các giao diện cũ không? Bạn có bao giờ tiết lộ các điều khoản hoặc hoạt động trong giao diện không phải là một phần của "quy tắc kinh doanh cốt lõi không?" Và ngược lại?

Những loại câu hỏi trong đầu, nếu "chức năng" của chế độ xem của bạn hoàn toàn tiết lộ mô hình miền cơ bản, vâng, điều này có vẻ như nó vi phạm quy tắc DRY.

Cũng lưu ý, phơi bày một quan điểm thay đổi tự nhiên hơn với các thay đổi mô hình cũng có thể được thực hiện bằng một số ngôn ngữ có thuộc tính thành viên và sự phản chiếu. (Hoặc với sự lặp lại ít hơn thông qua các chiến công thông minh khác ... Nhưng, "sự thông minh" thường không thể biện minh cho sự lặp lại mà nó làm bạn thất vọng.)


Những ghi chú được đề cập rất hay (bỏ phiếu cho điều này), như tôi đã nói như nhận xét về câu trả lời trước, tôi đang nói về mục đích chung, hình ảnh, có thể vài ngày sau, tôi quyết định thêm trường / tài sản mới vào Foo, vì vậy nếu tôi sử dụng Foonhư ViewModel Ngoài ra, khách hàng cũng sẽ nhận được tài sản mới, vậy nếu cái mới này là một lĩnh vực bảo mật nào đó, (có thể đúng / sai khi được phép hoặc một cái gì đó tương tự), tôi nên làm gì?
Mehdi Dehghani

@mehdi bạn sẽ cần phải cụ thể hơn về lĩnh vực bạn nghĩ đến để thêm vào và lý do tại sao bạn nghĩ nó không hoặc không thuộc về chế độ xem. Hoặc nói chung, những gì quan tâm là có.
Svidgen

@mehdi phải rõ ràng, nếu bạn lo lắng về việc người dùng cuối thay đổi giá trị bảo mật, tên miền của bạn chỉ đơn giản là không cho phép người dùng lưu những thứ họ không được phép lưu
svidgen

Tại sao chúng tôi sử dụng ViewModels? Có một số lý do, như chúng ta biết, một trong số đó là vì bảo mật, ví dụ, trong User edit form, chúng ta không cần chuyển IsAdmintrường cho khách hàng, để giữ an toàn cho trường này, vì vậy đây là điều tôi lo lắng. Xin lỗi vì tiếng Anh của tôi không tốt.
Mehdi Dehghani

1
Nói cách khác, tôi nghĩ rằng câu hỏi ban đầu là một câu hỏi đầy đủ. Câu hỏi bạn đang cố gắng tìm ra trong các ý kiến ​​ở đây là một câu hỏi đầy đủ khác. Và ý kiến ​​không phải là một cách tốt để có được câu trả lời tốt, chất lượng.
Svidgen

2

Tôi sẽ có một mô hình khung nhìn chỉ chứa một thuộc tính, một thể hiện Foo. Theo cách đó, bạn không vi phạm DRY theo bất kỳ định nghĩa nào về nó, nếu Foo thay đổi, mô hình khung nhìn của bạn sẽ tự động nhìn thấy sự thay đổi và bạn không bị ràng buộc trực tiếp của mô hình khung nhìn với mô hình.

Nếu ngày mai cần có chế độ xem để hiển thị một thứ khác cũng như Foo, bạn chỉ cần thêm một thuộc tính mới và ý định của mô hình xem của bạn sẽ vẫn rõ ràng, nó chứa Foo và một cái gì đó khác, bạn sẽ không có một hỗn hợp các thuộc tính từ Foo với các thuộc tính khác không liên quan.

Tôi sẽ không nghĩ về mô hình chế độ xem của bạn dưới dạng FooViewModel, tôi sẽ nghĩ về mô hình của chế độ xem được hiển thị. Nếu nó chỉ hiển thị một Foo, thì mô hình khung nhìn chứa một thuộc tính, một Foo.

Không chắc chắn nếu tôi giải thích rõ ràng. Nếu không, hãy cho tôi biết và tôi sẽ thử và điều chỉnh lại khi tôi thức!


-2

Tôi sẽ nói sử dụng FooViewModeltheo cách này vi phạm hiệu trưởng DRY. Khi bạn cần thay đổi, Foobạn cũng phải thay đổi FooViewModel. Tôi nghĩ rằng bạn sẽ được phục vụ tốt hơn chỉ đơn giản là sử dụng Foolàm mô hình cho quan điểm của bạn. Tôi sẽ xem xét một mô hình xem nếu bạn cần hiển thị những thứ từ Foo và những thứ khác. Ví dụ, giả sử bạn cần hiển thị một số thông tin từ Foovà cũng từ Bar.


Xin vui lòng cho tôi biết, nếu tôi quyết định thêm một trường / thuộc tính khác vào Foo, vì tôi cũng đã sử dụng Foonhư ViewModel, vì vậy tôi cũng phải chuyển lĩnh vực mới này để xem, tôi nghĩ đây không phải là vấn đề tốt, bạn nghĩ sao ?
Mehdi Dehghani

Tôi không thấy có gì sai khi Chế độ xem chỉ sử dụng một tập hợp con dữ liệu được mô hình hiển thị. Tôi nghĩ rằng hôi lớn hơn là khớp nối giữa FooFooViewModel. Nói chung, không nên sửa đổi nhiều tệp cho một thay đổi logic duy nhất.
zero_dev

Nếu trường được thêm vào đó là trường bảo mật, chẳng hạn như một số true/falsegiá trị cho phép hoặc đại loại như thế.
Mehdi Dehghani

Bạn không phải để lộ các trường như vậy trong Chế độ xem, nhưng bạn vẫn phải đảm bảo phần còn lại của mã không cho phép người dùng thay đổi mức bảo mật của họ, chỉ trong trường hợp người dùng độc hại cố gắng POST thay đổi đó.
Graham

Âm thanh như thể nó sẽ mở cho các cuộc tấn công phân công hàng loạt
James
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.