Typowy wzorzec, który widzę, to tak zwany Mapper
wzorzec (którego nie należy mylić z DataMapper
czymś zupełnie innym), który jako argument przyjmuje pewne „surowe” źródło danych (np. ADO.NET DataReader
lub DataSet
) i mapuje pola na właściwości obiektu biznesowego / domeny. Przykład:
class PersonMapper
{
public Person Map(DataSet ds)
{
Person p = new Person();
p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
// other properties...
return p;
}
}
Ideą jest twoja brama / DAO / Repository / etc. zadzwoni do programu mapującego przed jego zwróceniem, aby uzyskać bogaty obiekt biznesowy w porównaniu do bazowego kontenera danych.
Wydaje się jednak, że jest to powiązane, jeśli nie identyczne, ze wzorem Factory (w każdym razie w języku DDD), który konstruuje i zwraca obiekt domeny. Wikipedia mówi, że to: Fabryka DDD:
Fabryka: metody tworzenia obiektów domeny powinny być przekazywane do wyspecjalizowanego obiektu fabryki, tak aby alternatywne implementacje mogły być łatwo wymieniane.
Z tego cytatu jedyną różnicą, o której mogłem pomyśleć, jest to, że Fabrykę w stylu DDD można sparametryzować, aby mogła zwrócić specjalistyczny typ obiektu, jeśli zajdzie taka potrzeba (np. BusinessCustomer kontra ResidentialCustomer), podczas gdy „Mapper” jest przypisany do konkretnej klasy i tylko tłumaczenie.
Czy istnieje różnica między tymi dwoma wzorami, czy są one zasadniczo takie same z różnymi nazwami?
DataMapper
wzorzec sam miał dostęp do bazy danych, podczas gdy ten „Mapper” nie pobiera danych z bazy danych, po prostu konwertuje jakiś zestaw wyników na obiekt.