Dalam aplikasi saya, saya selalu memisahkan hal-hal, dengan model yang berbeda untuk database (Entity Framework) dan MVC. Saya telah memisahkan ini ke dalam proyek yang berbeda juga:
- Example.Entities - berisi entitas saya untuk EF dan konteks DB untuk mengaksesnya.
- Example.Models - berisi model MVC.
- Contoh. Web - aplikasi web. Tergantung pada Example.Domain dan Example.Models.
Alih-alih memegang referensi ke objek lain seperti yang dilakukan entitas domain, model MVC menyimpan ID sebagai bilangan bulat.
Ketika permintaan GET untuk halaman masuk, pengontrol MVC melakukan kueri basis data, yang mengembalikan entitas. Saya telah menulis metode "Konverter" yang mengambil entitas domain dan mengubahnya menjadi model MVC. Ada metode lain yang melakukan yang sebaliknya (dari model MVC ke entitas domain). Model kemudian diteruskan ke tampilan, dan dengan demikian ke klien.
Ketika permintaan POST masuk, pengontrol MVC mendapatkan model MVC. Metode konverter mengubahnya menjadi entitas domain. Metode ini juga melakukan validasi apa pun yang tidak dapat dinyatakan sebagai atribut, dan memastikan bahwa jika entitas domain sudah ada, kami memperbaruinya alih-alih mendapatkan yang baru. Metode biasanya terlihat seperti ini:
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;
}
}
Dengan menggunakan metode ini saya mengambil duplikasi yang seharusnya terjadi di setiap pengontrol. Penggunaan obat generik dapat mereduplikasi hal-hal lebih jauh.
Melakukan hal-hal seperti ini memberikan banyak manfaat:
- Anda dapat menyesuaikan model untuk tampilan atau tindakan tertentu. Katakanlah Anda memiliki formulir pendaftaran untuk seseorang yang ketika dikirimkan, membuat banyak entitas yang berbeda (orang, organisasi, alamat). Tanpa model MVC yang terpisah ini akan sangat sulit.
- Jika saya perlu menyampaikan lebih banyak informasi ke tampilan daripada yang akan tersedia hanya di entitas, atau menggabungkan dua entitas menjadi model tunggal, maka model database berharga saya tidak pernah tersentuh.
- Jika Anda pernah membuat serial model MVC sebagai JSON atau XML, Anda hanya mendapatkan model segera yang diserialisasi, tidak setiap entitas lain terhubung dengan yang satu ini.