In meinen Anwendungen habe ich die Dinge immer getrennt, mit verschiedenen Modellen für die Datenbank (Entity Framework) und MVC. Ich habe diese auch in verschiedene Projekte aufgeteilt:
- Example.Entities - Enthält meine Entitäten für EF und den DB-Kontext für den Zugriff darauf.
- Example.Models - enthält MVC-Modelle.
- Example.Web - Webanwendung. Hängt von Example.Domain und Example.Models ab.
Anstatt wie bei den Domänenentitäten Verweise auf andere Objekte zu speichern, enthalten die MVC-Modelle IDs als Ganzzahlen.
Wenn eine GET-Anforderung für eine Seite eingeht, führt der MVC-Controller die Datenbankabfrage durch, die eine Entität zurückgibt. Ich habe "Converter" -Methoden geschrieben, die eine Domänenentität in ein MVC-Modell konvertieren. Es gibt andere Methoden, die das Gegenteil bewirken (von einem MVC-Modell zu einer Domänenentität). Das Modell wird dann an die Ansicht und damit an den Client übergeben.
Wenn eine POST-Anforderung eingeht, erhält der MVC-Controller ein MVC-Modell. Eine Konvertierungsmethode konvertiert dies in eine Domänenentität. Diese Methode führt auch Überprüfungen durch, die nicht als Attribute ausgedrückt werden können, und stellt sicher, dass die bereits vorhandene Domänenentität aktualisiert wird, anstatt eine neue zu erhalten. Die Methoden sehen normalerweise ungefähr so aus:
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;
}
}
Mit diesen Methoden entferne ich die Vervielfältigung, die sonst in jedem Controller auftreten würde. Die Verwendung von Generika kann die Dinge noch weiter deduplizieren.
Diese Vorgehensweise bietet mehrere Vorteile:
- Sie können ein Modell an eine bestimmte Ansicht oder Aktion anpassen. Angenommen, Sie haben ein Anmeldeformular für eine Person, die bei der Übermittlung viele verschiedene Entitäten erstellt (Person, Organisation, Adresse). Ohne separate MVC-Modelle wird dies sehr schwierig.
- Wenn ich mehr Informationen an die Ansicht übergeben muss, als sonst nur in der Entität verfügbar wären, oder wenn ich zwei Entitäten zu einem einzigen Modell kombiniere, werden meine wertvollen Datenbankmodelle nie berührt.
- Wenn Sie ein MVC-Modell jemals als JSON oder XML serialisieren, wird nur das unmittelbare Modell serialisiert, nicht jede andere Entität, die mit diesem Modell verknüpft ist.