Обновить
10
0

Пользователь

Отправить сообщение
А как вы гарантируете поддержку всеми репозиториями этой системной транзакции

вы наверное ошиблись, скорее всего речь о провайдере?
я пишу о проблемах Спецификаций… Да действительно можно максисмально приблизить предметную область к хранилищу, но это и дает много возможности сломать систему, провести не правильные операции, которые с точки зрения хранилища будут верны, но с точки зрения предметной области нет. Я защищаю себя и тем более пользователей своего кода от заранее не правильных вариантов использования, или это плохо?
Нет!
public IEnumerable GetPaged(int skip, int take)

это будет работать нормально только если запросов очень ограниченное количество, я не на столько болен что бы такое предлагать, хотя…
 public IEnumerable Get(Query)

это выставляется во вне, все остальное скрыто за фасадом, причем запросы для каждого репозитория свои, например всегда ли нужен постраничный вывод?
Вы пишете, что все описанные проблемы можно легко решить с помощью repository.

легко не не бесплатно.
А разве (любой LINQ-based DAL) делает не то же самое? В чем преимущества репозитория в решении этой проблемы?
то же самое, но один и тот же LINQ запрос может по разному обрабатываться разными провайдерами, а именно построенный запрос для конкретной базы мб не эффективным или даже покрашить систему.
В репозитории можно это все компенсировать.
Мы используем BuisnessTransaction (посути обертка для наших нужд над системной)
Самый простой и самый не хороший метод это функции самого репозитория
virtual IQuariable<T> Shift (IQuariable<T> set, long conut)
{
   return set.Skip(count);
}

если реализация по каким то причинам не подходит, ее можно переопределить.
правда мы используем построитель запросов.
Спасибо за поддержку, похоже эта идея не популярна.
Создать транзакцию и раздать ее репозиториям. Конкретная реализация UOWScope, будет подтверждать или отменять.
Очень просто, я написал общий вариант, оборачивается все в функции типа Shift и TakeEntity
что то типа того
set.DefaultOrder().Shift (skipCount).TakeEntity(takeCount).Map()
и там где нужно можно переопределить DefaultOrder Shift TakeEntity
правда мы используем построитель запросов.
мы же это с вами обсуждали, про сообщения и подписи. И лично у меня проблем с этим нет.
Только из за интереса.
set.DefaultOrder().Skip(skipCount).Take(takeCount).Map()
можно и такой записью
Map(DefaultOrder(set).Skip(skipCount).Take(takeCount))
правда вторая запись хуже читаемая
Для того и делается репозиторий что бы это учесть и там где это действительно нужно иметь возможность переопределить.
я никогда не говорил и не считаю
модель должна соответствовать бизнесу, а хранилище — чему-нибудь.
я говорю что они могут сильно отличаться
В том что разные провайдеры по разному переводят одни и те же LINQ запросы, я об этом, и это надо учитывать.
если в основе репозитория лежит реализация использующая EF, то на IQuariable Order/Skip/Take.
Решается тем, что делаются разные генераторы запросов под разные базы, то есть разные наборы функций DbContext => IQueryable. Причем не для всех запросов, а только для тех где имеются значимые различия (обычно не более 5%).
как мы в коде будем определять какие можно запросы использовать а какие нет?
В итоге я так и не понял зачем городить Repository. И это как-бы самый сложны случай, когда надо поддерживать несколько СУБД. По факту же 99% и более приложений работают с одной базой и у них вообще таких проблем нет.
так и есть, но если бы вы действительно внимательно читали статью
Я работаю над проектом, в котором два боевых слоя хранилища и еще одно демонстрационное.
Каждый репозиторий знает для чего он нужен, а значит ему не нужна универсализация, он работает с тем о чем знает вся логика по обработке запросов находиться именно в нем.
нам нужен общий интерфейс для провайдеров к разным БД
да
этот интерфейс мы запихиваем в базовый класс репозитория
да
нам нужны провайдеры, удовлетворяющие этому интерфейсу
не понял юмора, зачем провайдер?
поверх этого интерфейса мы пишем расширения в каждой реализации репозитория для конкретного провайдера БД
только необходимые
в написании этих расширений мы ограничены возможностями провайдеров из поза-предыдущего пункта
только из за не совместимости провайдеров это нужно
как бы нам теперь весь его переиспользовать в конкретном репозитории продуктов в MS SQL?

единственное что нужно будет модифицировать это некоторые преобразователи запроса в завпросы к хранилищу (для EF это будут специфичные LINQ запросы)
преимущества Repository бесплатны
я ни где об этом не пишу, я пишу что это способ решить проблему совместимости
И как репозиторий решает эту проблему?

передав информацию о том что нужно, репозиторий переведет ее в как получить.
не верно. хранилище может только частично совпадать с объектом домена.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность