Ein verbreitetes Muster, das ich sehe, ist das sogenannte Mapper
Muster (nicht zu verwechseln mit DataMapper
dem etwas ganz anderes ist), das als Argument eine Art "rohe" Datenquelle (z. B. ein ADO.NET DataReader
oder DataSet
) verwendet und die Felder zuordnet Eigenschaften für ein Geschäfts- / Domänenobjekt. Beispiel:
class PersonMapper
{
public Person Map(DataSet ds)
{
Person p = new Person();
p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
// other properties...
return p;
}
}
Die Idee ist Ihr Gateway / DAO / Repository / etc. wird den Mapper aufrufen, bevor er zurückgegeben wird, sodass Sie ein umfangreiches Geschäftsobjekt im Vergleich zum zugrunde liegenden Datencontainer erhalten.
Dies scheint jedoch mit dem Factory-Muster (im DDD-Sprachgebrauch jedenfalls) zu tun zu haben, das ein Domänenobjekt erstellt und zurückgibt. Wikipedia sagt dies bezüglich der DDD Factory:
Factory: Methoden zum Erstellen von Domänenobjekten sollten an ein spezialisiertes Factory-Objekt delegiert werden, sodass alternative Implementierungen leicht ausgetauscht werden können.
Von diesem Zitat aus kann ich mir nur vorstellen, dass die DDD-ähnliche Factory so parametrisiert werden kann, dass sie bei Bedarf einen speziellen Objekttyp zurückgibt (z. B. BusinessCustomer oder ResidentialCustomer), während der "Mapper" einer bestimmten Klasse zugeordnet ist und nur tut Übersetzung.
Gibt es also einen Unterschied zwischen diesen beiden Mustern oder sind sie im Wesentlichen dasselbe mit unterschiedlichen Namen?
DataMapper
Muster hat den Datenbankzugriff selbst ausgeführt, während dieser "Mapper" nicht aus der Datenbank abruft, sondern nur eine Ergebnismenge in ein Objekt konvertiert.