Относятся ли конкретные типы баз данных к модели домена или уровню доступа к данным?

#c# #java #domain-driven-design

#c# #java #дизайн, управляемый доменом

Вопрос:

У меня есть свои объекты, такие как Customer, Order и т.д., Определенные в моей модели домена.

Теперь я хочу определить интерфейс с именем IRepository для представления моего уровня сохраняемости, у меня также будут SqlRepository, CacheRepository, которые реализуют IRepository.

Теперь мне интересно, должен ли я определить IRepository в модели домена или на уровне доступа к данным? Я предполагаю, что SqlRepository и CacheRepository должны быть включены в DAL, но входит ли туда и IRepository?

Кроме того, например, мой репозиторий возвращает список клиентов из таблицы Customer, я немного запутался в том, как это спроектировать, похоже, что я в конечном итоге повторяю типы в DAL и модели домена. Смотрите Пример ниже:

В приложении я хочу сделать что-то вроде этого :

 var repository = new SQLRepository();

//Below repository.customers represents customer table
List<Customer> customers = repository.Customers.list();
 

Итак, в моем домене:

 class Customer
{
  public int id;
  public string name;
}
 

В моем DAL:

 class SqlRepository:IRepository
{
   public CustomerTable Customers;
}

class CustomerTable 
{
   public List<Customer> list();
}
 

Я хотел знать, есть ли лучший способ спроектировать эти уровни?

* ОБНОВИТЬ

У меня уже есть DAL и домен, определенные в разных библиотеках / сборках классов. Изначально я думал, что у меня будут объекты POCO, такие как Customer, которые представляют одну запись в таблице базы данных, но тогда где объявить Customer .Добавить (клиент)? используется ли это в DAL? Мне не нужны бизнес-правила в DAL, если я начну добавлять методы в свои сущности, они станут сложными, имея в них логику сохранения, а также бизнес-логику.

Ответ №1:

Следующая информация предназначена для другой проблемы, она показывает вам простую структуру проекта: размещение модели в отдельной сборке

Я считаю, что интерфейс IRepository должен быть общедоступным в вашем проекте уровня данных. Реализации могут быть частными (используйте внедрение фабрики или зависимостей для их загрузки в другие проекты), а созданная вами модель домена может быть общей для вашего бизнес-уровня и уровня данных.

Комментарии:

1. Я также думаю — разделите слои в их собственных сборках, если это возможно.

2. Да, я бы разделил слои на разные сборки. Это также даст вам возможность распределять слои по физическим уровням.

3. У меня уже есть DAL и домен, определенные в разных библиотеках / сборках классов. Изначально я думал, что у меня будут объекты POCO, такие как Customer, которые представляют одну запись в таблице базы данных, но тогда где объявить Customer . Добавить (клиент)? используется ли это в DAL? Мне не нужны бизнес-правила в DAL, если я начну добавлять методы в свои сущности, они станут сложными, имея в них логику сохранения, а также бизнес-логику.

4. Сущности не должны иметь логики сохранения. Добавление клиента должно быть методом в вашем репозитории

5. Да, это то, что я в итоге сделал, я добавил методы CRUD в репозиторий, которые работают с объектами POCO. Но куда мне поместить правила и проверку? В самом приложении?

Ответ №2:

Один из вариантов — поместить ваши типы в отдельную сборку common или types, на которую ссылаются бизнес-уровень и уровень данных. Будьте осторожны, чтобы ограничить то, что входит в эту сборку, чтобы не вводить ненужную связь.

Это аналогичный подход к размещению констант в общей сборке, разделяемой уровнем sql (предварительно обработанным), уровнем бизнес-логики и объектной моделью…