Pertanyaan MVC, ViewModels, dan Validasi


Saya membuat aplikasi MVC3 dengan EF4 menggunakan POCOs. Saya telah menambahkan atribut validasi ke entitas EF saya. Sekarang, saat saya membangun tampilan, saya ingin menggunakan model tampilan (dan mungkin menggunakan AutoMapper untuk mengisinya).

Masalah yang saya hadapi adalah bahwa saya harus mendefinisikan ulang atribut validasi saya pada model tampilan saya yang melanggar prinsip KERING. Misalnya, jika saya memutuskan untuk mengubah ukuran bidang, saya harus mengubah atribut MaxLength di POCO dan model tampilan apa pun yang menggunakannya.

Apakah ada cara yang rumit saya dapat memetakan aturan validasi dari POCO saya ke model tampilan saya?


4
2017-12-31 00:54


asal


Jawaban:


Saya juga berjuang dengan ini, dan saya setuju bahwa itu melanggar KERING. Saya memposting pertanyaan terbaru tentang ini Sini dan mendapat sedikit dorongan.

Anda tidak pernah bisa mendapatkan KERING sempurna dalam aplikasi dunia nyata. Kadang-kadang Anda mendapatkan lebih baik dari melanggar prinsip daripada dengan mencoba untuk tetap melakukannya secara membabi buta.

EDIT:

Orang mungkin juga menganggap bahwa KERING dapat melanggar Prinsip Tanggung Jawab Tunggal (SRP). Dengan menggunakan kembali kode serupa, Anda sekarang menyebabkan kode melakukan lebih dari satu hal. Jika Anda berpikir tentang fakta bahwa model data dan model tampilan memiliki tujuan yang berbeda, dan dengan demikian tanggung jawab yang berbeda ... menyisir mereka ke dalam satu model melanggar SRP. Artinya, dengan membuat model data Anda juga menjadi model tampilan, itu dua tanggung jawab yang berbeda.

Sekarang, seseorang dapat memikirkan sejumlah cara untuk secara potensial mencoba dan merekonsiliasi SRP dengan KERING dalam hal ini, tetapi pada titik tertentu Anda harus mempertimbangkan manfaat dari biaya.


1
2018-01-01 17:40



Secara pribadi saya melakukan validasi pada model tampilan. Ini adalah apa yang diterima pengontrol dari tampilan dan itu adalah kelas yang berisi input pengguna. Saya membedakan antara dua jenis aturan validasi: validasi permukaan dan validasi bisnis. Aturan seperti bidang wajib diisi, format yang tepat harus diterapkan pada model tampilan, sedangkan aturan bisnis seperti pengguna dengan nama yang diberikan sudah ada dalam database harus divalidasi pada model.

Anda juga bisa memiliki model tampilan berbeda yang dipetakan ke model yang sama tetapi berdasarkan aturan validasi tampilan bisa bervariasi. Karena ini, Anda tidak akan memiliki aturan validasi yang sama pada model tampilan.


5
2018-01-01 17:20



Salah satu pendekatan yang mendapat beberapa abstraksi adalah memiliki ViewModel 'tersusun' dari kelas model bisnis Anda, termasuk informasi tampilan lain yang Anda butuhkan.

class MyObject 
{
    public int ID {get;set}

    [Required]
    [StringLength(512)]     
    public string Name {get;set;}

}

class MyViewModel // ViewModel for a specific view 
{
    public MyObject MyModel {get;set;}        // the model that is being edited 

    // other data the view might need, set by the controller 
    public string SomeMessage { get; set; }
    public List<SomeObject> SomeObjects {get;set;} /// e.g. for a drop-down list

}

Kemudian dalam tampilan referensi, ViewModel sesuai.

@model My.Namespace.MyViewModel


Hello @model.MyModel.Name !!!

Dengan cara ini, Anda hanya menentukan validasi dan / atau anotasi data di kelas bisnis Anda di satu tempat.

Jika Anda ingin memiliki validasi yang berbeda maka itu akan memerlukan beberapa strategi untuk secara selektif menerapkan logika validasi.


2
2018-03-09 21:56