Uygulamalarımda, her zaman veriyi (Entity Framework) ve MVC için farklı modellerle ayırdım. Bunları da farklı projelere ayırdım:
- Örnek.Entities - EF için varlıklarımı ve bunlara erişmek için DB bağlamını içerir.
- Örnek.Models - MVC modellerini içerir.
- Example.Web - web uygulaması. Hem Example.Domain hem de Example.Models'e bağlı.
Etki alanı varlıkları gibi diğer nesnelere referans tutmak yerine, MVC modelleri kimlikleri tamsayılar olarak tutar.
Bir sayfa için bir GET isteği geldiğinde, MVC denetleyicisi bir varlık döndüren veritabanı sorgusunu gerçekleştirir. Bir etki alanı varlığı alıp onu bir MVC modeline dönüştüren "Dönüştürücü" yöntemleri yazdım. Bunun tersini yapan başka yöntemler de var (MVC modelinden etki alanı varlığına). Model daha sonra görüşe ve dolayısıyla müşteriye geçer.
Bir POST isteği geldiğinde, MVC kontrol cihazı bir MVC modeli alır. Bir dönüştürücü yöntemi bunu bir etki alanı varlığına dönüştürür. Bu yöntem aynı zamanda nitelik olarak ifade edilemeyen tüm doğrulama işlemlerini gerçekleştirir ve etki alanı varlığı zaten mevcutsa yenisini almak yerine güncellediğimizi doğrular. Yöntemler genellikle şuna benzer:
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;
}
}
Bu yöntemleri kullanarak, her denetleyicide başka türlü oluşabilecek kopyaları çıkarırım. Jeneriklerin kullanımı işleri daha da fazla tekilleştirebilir.
İşleri bu şekilde yapmak birçok fayda sağlar:
- Bir modeli belirli bir görünüme veya eyleme göre özelleştirebilirsiniz. Gönderildiğinde, birçok farklı varlık (kişi, kuruluş, adres) oluşturan bir kişi için kayıt formunuz olduğunu varsayalım. Ayrı MVC modelleri olmadan bu çok zor olacaktır .
- Görünüme aksi halde mevcut olandan daha fazla bilgi aktarmam gerekiyorsa veya iki varlığı tek bir modele dahil edersem, o zaman değerli veritabanı modelleri hiçbir zaman dokunulmaz.
- Bir MVC modelini JSON veya XML olarak serileştirirseniz, bu duruma bağlı diğer tüm varlıkların değil, yalnızca hemen seri hale getirilmiş modeliniz olur.