Mappage d'attributs privés d'entités de domaine avec Dapper dot net

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

Question

Dans la plupart de mes projets, j'utilise le mappage nHibernate + Fluent et récemment, j'ai commencé à jouer avec Dapper pour voir si je pouvais y déplacer des opérations de lecture.

Je suis l'approche DDD afin que mes entités de domaine n'aient aucun établissement public. Par exemple:

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;} }
}

Avec Fluent nHibernate, je suis capable de révéler les membres pour la cartographie:

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

Existe-t-il un moyen de mapper mes entités de domaine avec Dapper? Si c'est le cas, comment?

Réponse acceptée

Une option consiste à créer un ensemble distinct de classes de persistance pour travailler avec Dapper; par exemple: UserRecord et CarRecord. Les classes d'enregistrement correspondent à la table de base de données et seront encapsulées dans le module de persistance. Les requêtes Dapper s'exécuteront sur cette classe et vous pourrez disposer d'une fabrique de persistance distincte qui assemblera les entités du domaine et les renverra au client.

Petit exemple:

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

Cela crée une belle séparation et offre de la flexibilité.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi