Asignación de atributos privados de entidades de dominio con Dapper dot net

c# dapper domain-driven-design fluent-nhibernate-mapping orm

Pregunta

En la mayoría de mis proyectos uso el mapeo nHibernate + Fluent y recientemente comencé a jugar con Dapper para ver si puedo mover las operaciones de lectura a él.

Sigo el enfoque DDD para que mis entidades de dominio no tengan ningún setter público. Por ejemplo:

public class User
{
    private int _id;
    private string _name;
    private IList<Car> _carList;

    protected User(){} // Fluent Mapping

    public User(string id, string name)
    {
        // validation 
        // ...
        _id = id;
        _name = name;
    }

    public int Id{ get {return _id;} }
    public string Name { get {return _name;} }
    public IList<Car> CarList { get {return _carList;}}         
}

public class Car
{
    private int _id;
    private string _brand;

    protected Car(){} // Fluent Mapping

    public Car(string id, string brand)
    {
        // validation 
        // ...
        _id = id;
        _brand= brand;
    }

    public int Id{ get {return _id;} }
    public string Brand { get {return _brand;} }
}

Con Fluent nHibernate puedo revelar miembros para el mapeo:

Id(Reveal.Member<User>("_id")).Column("id");
Map(Reveal.Member<User>("_name")).Column("name");

¿Hay alguna manera de mapear las entidades de mi dominio con Dapper? ¿Si es así, cómo?

Respuesta aceptada

Una opción es crear un conjunto separado de clases de persistencia para trabajar con Dapper; por ejemplo: UserRecord y CarRecord. Las clases de registro coincidirán con la tabla db y se encapsularán dentro del módulo de persistencia. Las consultas rápidas se ejecutarán contra estas clases y luego puede tener una fábrica de persistencia separada que ensamblará las entidades de dominio y las devolverá al cliente.

Pequeño ejemplo:

        var carRecord = DbConnection.Query<CarRecord>("select * from cars where id = @id", new {id = 1});
        var carEntity = CarFactory.Build(carRecord);

Esto crea una buena separación y proporciona flexibilidad.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow