Um padrão comum que vejo é o que é conhecido como Mapper
padrão (que não deve ser confundido com o DataMapper
que é algo totalmente diferente), que usa como argumento algum tipo de fonte de dados "bruta" (por exemplo, um ADO.NET DataReader
ou DataSet
) e mapeia os campos para propriedades em um objeto de negócios / domínio. Exemplo:
class PersonMapper
{
public Person Map(DataSet ds)
{
Person p = new Person();
p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
// other properties...
return p;
}
}
A ideia é o seu Gateway / DAO / Repositório / etc. chamará o Mapper antes de retornar, para que você obtenha um objeto de negócios rico versus o contêiner de dados subjacente.
No entanto, isso parece estar relacionado, se não idêntico, ao padrão Factory (na linguagem DDD, de qualquer maneira), que constrói e retorna um objeto de domínio. A Wikipedia diz o seguinte: a fábrica DDD:
Factory: os métodos para criar objetos de domínio devem delegar para um objeto Factory especializado, de modo que implementações alternativas possam ser facilmente trocadas.
A partir dessa citação, a única diferença que pude pensar é que a Fábrica no estilo DDD pode ser parametrizada para retornar um tipo especializado de objeto, se surgir a necessidade (por exemplo, BusinessCustomer versus ResidentialCustomer) enquanto o "Mapper" estiver ligado a uma classe específica e apenas faz tradução.
Então, existe uma diferença entre esses dois padrões ou eles são essencialmente a mesma coisa com nomes diferentes?
DataMapper
padrão acessou o banco de dados, enquanto esse "Mapper" não é extraído do banco de dados, apenas converte um conjunto de resultados de algum tipo em um objeto.