5

В большинстве моих проектов я использую nHibernate + Fluent mapping, и недавно я начал играть с Dapper, чтобы узнать, могу ли я переместить операции чтения на него.Сопоставление частных атрибутов объектов домена с Dapper dot net

Я следую подходу DDD, поэтому у моих объектов домена нет публичных сетей. Например:

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

С Fluent NHibernate Я могу выявить элементы для отображения:

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

Есть ли способ, чтобы отобразить мои объекты домена с Dapper? Если да, то как?

+4

Обратите внимание, что IList , открытый классом User, является запахом DDD, как и сеттер: вместо этого вы должны выставить IEnumerable , поскольку все операции над [агрегатом] (http://dddcommunity.org/library/ vernon_2011 /) должно выполняться через [команды] (http://epic.tesio.it/doc/manual/command_query_separation.html), отправленные ему. –

ответ

8

Одним из вариантов является создание отдельного набора классов персистентности для работы с Dapper; например: UserRecord и CarRecord. Классы записи будут соответствовать таблице db и будут инкапсулироваться в модуль персистентности. Запросы Dapper будут выполняться против этих классов, и тогда у вас может быть отдельная фабрика сохранения, которая соберет объекты домена и вернет их обратно клиенту.

Небольшой пример:

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

Это создает хорошее разделение и обеспечивает гибкость.

+3

+1 Я могу подтвердить, что это решение очень хорошо работает для [пользовательских репозиториев] (http://epic.tesio.it/doc/manual/repositories.html#about_custom_repositories). –

+0

Я думал об этом решении, но поскольку это заставляет меня писать намного больше кода, мне было интересно, есть ли какая-либо альтернатива. Спасибо за ваши комментарии. –

+0

@ R2D2: Интересно, как вы реализовали? Я знаю эту довольно старую должность, но я застрял в подобной ситуации и оказался на этом посту во время поиска. –