5

In den meisten meiner Projekte verwende ich nHibernate + Fluent-Mapping und vor kurzem habe ich angefangen, mit Dapper zu spielen, um zu sehen, ob ich Leseoperationen darauf verschieben kann.Mapping private Attribute von Domain-Entities mit Dapper dot net

Ich folge DDD-Ansatz, so dass meine Domain-Entitäten keine öffentlichen Setter haben. Zum Beispiel:

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

Mit Fluent nHibernate Ich bin in der Lage Mitglieder für die Zuordnung zu offenbaren:

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

Gibt es eine Möglichkeit, meine Domain-Entitäten mit Dapper abzubilden? Wenn das so ist, wie?

+4

Beachten Sie, dass die IList von der Benutzerklasse ausgesetzt ist, ist ein DDD Geruch wie ein Setter: Sie sollten stattdessen eine IEnumerable , da alle Operationen auf einem [Aggregat] (http://dddcommunity.org/library/) vernon_2011 /) state sollte über [commands] (http://epic.tesio.it/doc/manual/command_query_separation.html) bearbeitet werden. –

Antwort

8

Eine Option besteht darin, eine separate Gruppe von Persistenzklassen zu erstellen, die mit Dapper funktionieren; zum Beispiel: UserRecord und CarRecord. Die Record-Klassen stimmen mit der db-Tabelle überein und werden in das Persistenzmodul eingekapselt. Dapper-Abfragen werden für diese Klassen ausgeführt. Anschließend können Sie eine separate Persistence-Factory einrichten, die die Domänenentitäten zusammenstellt und an den Client zurückgibt.

Kleines Beispiel:

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

Dies schafft eine schöne Trennung und bietet Flexibilität.

+3

+1 Ich kann bestätigen, dass diese Lösung sehr gut für [benutzerdefinierte Repositories] funktioniert (http://epic.tesio.it/doc/manual/repositories.html#about_custom_repositories). –

+0

Ich dachte über diese Lösung nach, aber da ich dadurch viel mehr Code schreibe, habe ich mich gefragt, ob es Alternativen gibt. Danke für deine Kommentare. –

+0

@ R2D2: Ich frage mich, wie haben Sie implementiert? Ich kenne diesen ziemlich alten Post, stecke aber in einer ähnlichen Situation und landete auf diesem Post während der Suche. –