#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 (предварительно обработанным), уровнем бизнес-логики и объектной моделью…