Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, another_coder, Вы писали:
_>>Здравствуйте, gandjustas.
_>>На мой взгляд, вы не разделяете сущности от их технической реализации. В примере с тремя источниками данных, они все предлставляют собой одно и то же: хранилище данных. Для модуля системы, который использует хранилище данных, не важно что именно это (БД, IList, файл или web service). Весь функционал, который относится к доступу к данным спрятан там же и наружу не показывается. И вот тут как раз приходин на помощь объект, представляющий собой DAO. Конкретная его реализация может быть разной и зависить от уровня закладываемой абстракции в архитектуру. Это может быть EF, а может быть и просто объект с простым CRUD интерфейсом.
G>Ок, давайте конкретнее. Пусть у вас есть "хранилище данных" сотрудников.
G>Фактически это будет три разных хранилища:
G>1) Список в памяти — List<T>
G>2) База данных
G>3) Веб-сервис, который имеет только методы получения и сохранения по ID.
G>У вас задача поднять сотрудникам определенной категории зарплату на 10%.
G>Какой интерфейс универсального "хранилища данных" вы спроектируете для решения этой задачи.
G>Естественно писать заведомо неэффективный код — моветон.
var employees = await employeeRepo.GetEmployeesAsync(EmployeeCategory.SpecificCategory);
foreach (var employee in employees)
{
employee.ChangeSalary(factor: +0.1f);
}
await Employee.SaveChangesAsync(employees);
Тут репозиторий знает откуда брать сотрудников (и их менеджеров, то есть репозиторий возвращает агрегаты из DDD), сотрудники знают как менять себе (в ООП лампочка вкручивает себя в люстру сама) зарплаты (все проверки и согласования с менеджерами внутри) и сохранять изменения. Хранилище тут находится уровнем ниже и используется репозиторием и сотрудниками — это может быть простой шлюз таблицы, обменивающийся с репозиторием и сотрудниками простыми объектами (DTO). И уже само хранилище владеет знанием откуда данные собственно берутся.
Зависимости:
Объекты предметной области -> объекты передачи данных -> объекты реализации (объекты EF, объекты веб-сервисов, а List<T> хранит объекты передачи данных)