Mappatura degli attributi privati ​​delle entità di dominio con Dapper dot net

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

Domanda

Nella maggior parte dei miei progetti uso la mappatura nHibernate + Fluent e recentemente ho iniziato a giocare con Dapper per vedere se posso spostare le operazioni di lettura su di esso.

Seguo l'approccio DDD quindi le mie entità di dominio non hanno setter pubblici. Per esempio:

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 sono in grado di rivelare membri per la mappatura:

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

C'è un modo per mappare le mie entità di dominio con Dapper? Se é cosi, come?

Risposta accettata

Un'opzione è creare un set separato di classi di persistenza per lavorare con Dapper; ad esempio: UserRecord e CarRecord. Le classi di record corrisponderanno alla tabella db e verranno incapsulate all'interno del modulo di persistenza. Le query di Dapper verranno eseguite contro queste classi e quindi sarà possibile creare una factory di persistenza separata che riunirà le entità di dominio e le restituirà al client.

Piccolo esempio:

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

Questo crea una buona separazione e offre flessibilità.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché