powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / asp.net репо
61 сообщений из 61, показаны все 3 страниц
asp.net репо
    #38587467
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для работы с каждой сущностью EF создаем репозиторий.
А как правильно поступить если нужно делать выборку сразу из двух сущностей?
...
Рейтинг: 0 / 0
asp.net репо
    #38587517
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014для работы с каждой сущностью EF создаем репозиторий.
А как правильно поступить если нужно делать выборку сразу из двух сущностей?

А может все-таки это одна сущность, которая состоит из двух таблиц? )
...
Рейтинг: 0 / 0
asp.net репо
    #38587544
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПарамонGena_16032014для работы с каждой сущностью EF создаем репозиторий.
А как правильно поступить если нужно делать выборку сразу из двух сущностей?

А может все-таки это одна сущность, которая состоит из двух таблиц? )

суть вопроса не в том одна или две сущности, а как правильно код написать в этой ситуации. Есть репо для работы с одной таблицей есть репо для работы с другой таблицей...
Делать репо для joina или какие-то еще варианты?
...
Рейтинг: 0 / 0
asp.net репо
    #38587547
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014 Есть репо для работы с одной таблицей есть репо для работы с другой таблицей...
Делать репо для joina или какие-то еще варианты?

Да. Делать репо для работы с сущностью, а не с таблицей. )
...
Рейтинг: 0 / 0
asp.net репо
    #38587777
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014Парамонпропущено...


А может все-таки это одна сущность, которая состоит из двух таблиц? )

суть вопроса не в том одна или две сущности, а как правильно код написать в этой ситуации. Есть репо для работы с одной таблицей есть репо для работы с другой таблицей...
Делать репо для joina или какие-то еще варианты?
Есть мнение, что, если данные в проект будут приходить только из БД, то никаких репозиториев делать не нужно, а можно обойтись голым ORM (EF, NHibernate и т. д.). Т. е. не усложнять там, где это не нужно, т. к. с репозиторием много проблем, и просто так они не решаются.

ПарамонGena_16032014 Есть репо для работы с одной таблицей есть репо для работы с другой таблицей...
Делать репо для joina или какие-то еще варианты?

Да. Делать репо для работы с сущностью, а не с таблицей. )
Хмм... Это как-то связано с понятием "корень аггрегации"? Если да, то автору темы лучше гуглить по "EF repository agregation root".
...
Рейтинг: 0 / 0
asp.net репо
    #38587828
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user7320Gena_16032014пропущено...


суть вопроса не в том одна или две сущности, а как правильно код написать в этой ситуации. Есть репо для работы с одной таблицей есть репо для работы с другой таблицей...
Делать репо для joina или какие-то еще варианты?
Есть мнение, что, если данные в проект будут приходить только из БД, то никаких репозиториев делать не нужно, а можно обойтись голым ORM (EF, NHibernate и т. д.). Т. е. не усложнять там, где это не нужно, т. к. с репозиторием много проблем, и просто так они не решаются.

Парамонпропущено...


Да. Делать репо для работы с сущностью, а не с таблицей. )
Хмм... Это как-то связано с понятием "корень аггрегации"? Если да, то автору темы лучше гуглить по "EF repository agregation root".

А какие проблемы с репой. на конкретных примерах
...
Рейтинг: 0 / 0
asp.net репо
    #38587840
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014,

правильнее тут может оказаться делать не репозиторий а объект-запрос .
репозитории мало подходят, если возникает необходимость соединяться с другими таблицами
...
Рейтинг: 0 / 0
asp.net репо
    #38587875
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014А какие проблемы с репой. на конкретных примерах
Вот тут Монстрю ссылку дал. Если коротко, то проблема в разрастании репозитория(ев). Эта проблема вообще известна как класс проблем, возникающих во многих областях программирования. Название этого класса я не знаю. Но та же проблема возникает при, например, построении служб, когда нужно представить некий АПИ с запросами. Начинают клепать службы вида AddXXX, FindXXXById и т. п. Некоторые объединения в классы помогают, но всё равно возникают проблемы при сложных запросах со связями.

И насколько я понимаю, даже решения, предложенные по ссылки Монстрю, всё равно не обладают такой гибкостью и функциональностью, как хотя бы в EF вкупе с расшерениями LINQ.
...
Рейтинг: 0 / 0
asp.net репо
    #38587955
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Хмм... Это как-то связано с понятием "корень аггрегации"
Да.

А вообще это уже не раз обсуждалось.
...
Рейтинг: 0 / 0
asp.net репо
    #38587967
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUвозникает необходимость соединяться с другими таблицами
Это да, в реляционной базе такая необходимость иногда бывает )
...
Рейтинг: 0 / 0
asp.net репо
    #38587983
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Gena_16032014А какие проблемы с репой. на конкретных примерах
Вот тут Монстрю ссылку дал. Если коротко, то проблема в разрастании репозитория(ев). Эта проблема вообще известна как класс проблем, возникающих во многих областях программирования. Название этого класса я не знаю. Но та же проблема возникает при, например, построении служб, когда нужно представить некий АПИ с запросами. Начинают клепать службы вида AddXXX, FindXXXById и т. п. Некоторые объединения в классы помогают, но всё равно возникают проблемы при сложных запросах со связями.

И насколько я понимаю, даже решения, предложенные по ссылки Монстрю, всё равно не обладают такой гибкостью и функциональностью, как хотя бы в EF вкупе с расшерениями LINQ.

да вот кстати я все больше присматриваюсь в подходу, когда для извлечения данных лучше использовать специальный объект-запрос.
его можно протестировать, выделить в отдельную библиотеку.
кстати можно какую угодно гибкость обеспечить, используя Linq\EF.
недавно в проекте было необходимо реализовать выборку из сущности Сообщения + 22 возможных параметра фильтрации.
сначала начал пользоваться репозиторием, но потом при добавлении 23 параметра понадобилось использовать Join с другими таблицами - пришлось перейти на использование контекста.
в итоге пришел к объекту запросу.
...
Рейтинг: 0 / 0
asp.net репо
    #38588419
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
monstrUGena_16032014,

правильнее тут может оказаться делать не репозиторий а объект-запрос .
репозитории мало подходят, если возникает необходимость соединяться с другими таблицами

Ну допустим делаем один объект на запрос. В статье говориться, что лучше использовать фабрику... Так фабрика и получается год объектом.
...
Рейтинг: 0 / 0
asp.net репо
    #38588610
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014Парамонпропущено...


А может все-таки это одна сущность, которая состоит из двух таблиц? )

суть вопроса не в том одна или две сущности, а как правильно код написать в этой ситуации. Есть репо для работы с одной таблицей есть репо для работы с другой таблицей...
Делать репо для joina или какие-то еще варианты?А теперь представьте что данные Вы захотели получать не напрямую из базы, а через API сервис.
Вы вытащите первым запросом к сервису данные из одной таблицы, и для каждой строки (объекта) будете делать отдельный запрос, чтобы выполнить JOIN?

Вам нужно определится с корнем агрегации, либо репозиторий тут не нужен.
...
Рейтинг: 0 / 0
asp.net репо
    #38588613
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите конкретный пример и лучше с кодом.
...
Рейтинг: 0 / 0
asp.net репо
    #38588671
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамонuser7320Хмм... Это как-то связано с понятием "корень аггрегации"
Да.

А вообще это уже не раз обсуждалось.
У меня по этому корню ряд вопросов. Не обязательно к вам, а вообще к участникам дискуссии.

1. А всегда ли можно выделить корень аггрегации? Если нет, то что делать?

2. Два разных корня аггрегации могут пересекаться (т. е. иметь одинаковые сущности в составе)? Если да, то это нормально или это проблема и её надо как-то решать?

3. Может же быть, что количество корней аггрегации будет большим? Может, даже больше количества самих сущностей. Тогда снова упираемся в разрастание репозитория, наполненного кучей функций по работе с корнями аггрегации. Что делать?
...
Рейтинг: 0 / 0
asp.net репо
    #38588806
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAПриведите конкретный пример и лучше с кодом.
кода можно сказать нет.. я пока только думаю как лучше. Конкретный пример. Ну например есть интернет магазин . Таблица с предложениями. И с рубриками. Нужно выводить предложения на страницу с информацией по рубрикам. И в то же время нужно выводить рубрики отдельно. Ну выходит два репозитория в одном джоин 2х сущностей. В другом просто выборка из 1 одной сущности...
...
Рейтинг: 0 / 0
asp.net репо
    #38588812
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а по фабрике кто ответит?
...
Рейтинг: 0 / 0
asp.net репо
    #38588882
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот паттернов-то налепили.

Репозитории, фабрики, корни агрегации -- выкинуть и забыть.
...
Рейтинг: 0 / 0
asp.net репо
    #38588967
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014skyANAПриведите конкретный пример и лучше с кодом.
кода можно сказать нет.. я пока только думаю как лучше. Конкретный пример. Ну например есть интернет магазин . Таблица с предложениями. И с рубриками. Нужно выводить предложения на страницу с информацией по рубрикам. И в то же время нужно выводить рубрики отдельно. Ну выходит два репозитория в одном джоин 2х сущностей. В другом просто выборка из 1 одной сущности...
Если работа будет только с БД, достаточно одного EF (ну или какая ORM там лучше подойдёт для вашей БД).

skyANAА теперь представьте что данные Вы захотели получать не напрямую из базы, а через API сервис.
А действительно ли всё так плохо и всегда надо программировать с учётом "а вот если через 5 лет понадобится добавить работу с АПИ-сервисом, с тем, с другим, с десятым..."? Задача пока стоит из БД? Ограничиваемся одним EF. Как добавят работу с сервисом - новое ТЗ и дописываем до работы с сервисом. Кой смысл сразу лепить супер-универсальное решение, которого, кстати, не бывает?

Ну и, по-моему, работа с БД и с сервисом требует разного подхода. Не факт, что АПИ-сервис такой же функциональный, как EF. Скорее, он и третьей доли EF-функциональности не имеет. Значит, чтобы не ограничиваться самым малофункциональным элементом, надо будет написать отдельный репозиторий для работы с сервисом, и отдельный - для работы с БД через EF. Так?
...
Рейтинг: 0 / 0
asp.net репо
    #38589061
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014skyANAПриведите конкретный пример и лучше с кодом.
кода можно сказать нет.. я пока только думаю как лучше. Конкретный пример. Ну например есть интернет магазин . Таблица с предложениями. И с рубриками. Нужно выводить предложения на страницу с информацией по рубрикам. И в то же время нужно выводить рубрики отдельно. Ну выходит два репозитория в одном джоин 2х сущностей. В другом просто выборка из 1 одной сущности...
Да вот как раз может и не очень нужен корень агрегации и репозитории.
для сложных выборок вполне достаточен подход объект-запрос. в нем ты формируешь все нужные запросы и голова не болит о том, какой корень агрегации использовать.
если объектов запросов будет много - будет смысл подумать о фабрике запросов.
а сейчас у тебя и одного объекта нет - о фабрике думать нет причин.
...
Рейтинг: 0 / 0
asp.net репо
    #38589126
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320

Ну и, по-моему, работа с БД и с сервисом требует разного подхода. Не факт, что АПИ-сервис такой же функциональный, как EF. Скорее, он и третьей доли EF-функциональности не имеет. Значит, чтобы не ограничиваться самым малофункциональным элементом, надо будет написать отдельный репозиторий для работы с сервисом, и отдельный - для работы с БД через EF. Так?

... вообще-то, если говорить об АПИ-сервисе в варианте WebAPI, то никто не мешает использовать EF в самом сервисе, выдавая на гора уже готовую коллекцию клиенту после всех джойнов, замещений null-ов и прочего причесывания ...
...
Рейтинг: 0 / 0
asp.net репо
    #38589276
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А действительно ли всё так плохо и всегда надо программировать с учётом "а вот если через 5 лет понадобится добавить работу с АПИ-сервисом, с тем, с другим, с десятым..."? Задача пока стоит из БД? Ограничиваемся одним EF. Как добавят работу с сервисом - новое ТЗ и дописываем до работы с сервисом. Кой смысл сразу лепить супер-универсальное решение, которого, кстати, не бывает?Это зависит от предметной области, данных и характера работы с ними.
Также известно какие решения существуют на рынке, на западе, какие планы у бизнеса. Ну и общие тренды видны.

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

user7320Ну и, по-моему, работа с БД и с сервисом требует разного подхода. Не факт, что АПИ-сервис такой же функциональный, как EF. Скорее, он и третьей доли EF-функциональности не имеет. Значит, чтобы не ограничиваться самым малофункциональным элементом, надо будет написать отдельный репозиторий для работы с сервисом, и отдельный - для работы с БД через EF. Так?Не так. Сферические рассуждения неопытного человека.
...
Рейтинг: 0 / 0
asp.net репо
    #38589344
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И представить, что данные берутся не из БД, а из другого места я предлагаю для того, чтобы легче было понять какие репозитории нужны, если они вообще нужны.

Потому как репозиторий должен иметь интерфейс, что одинаково просто реализуется для разных вариантов распределения и хранения данных, тем самым обеспечивая persistence ignorance
...
Рейтинг: 0 / 0
asp.net репо
    #38589488
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПотому как репозиторий должен иметь интерфейс, что одинаково просто реализуется для разных вариантов распределения и хранения данных, тем самым обеспечивая persistence ignorance
А в интерфейсе как учесть всё разнообразие запросов, включая джойны и пр.? Через объект-запрос? Через составление сложных запросов из простых репозиторных?
...
Рейтинг: 0 / 0
asp.net репо
    #38589514
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, как как.
Репозиторий должен возвращать доменные объекты, которые и агрегируют в себе результаты запросов к БД, или к другому хранилищу.

И тут мы естественно переходим к пониманию предметной области и DDD
...
Рейтинг: 0 / 0
asp.net репо
    #38589519
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAПотому как репозиторий должен иметь интерфейс, что одинаково просто реализуется для разных вариантов распределения и хранения данных, тем самым обеспечивая persistence ignorance
А в интерфейсе как учесть всё разнообразие запросов, включая джойны и пр.? Через объект-запрос? Через составление сложных запросов из простых репозиторных?

репозиторий как паттерн задумывался как абстракция, которая скроет всю работу с БД для операций выборки, добавления, обновления для сущностей. на практике оказывается, что операций извлечений данных уйма, и не всегда понятно репозиторий к какой именно сущности делать.
недавно сдали сложный проект. наружу была web application. но нас предупредили, что все методы, отдающие данные, должны быть доступны через web сервисы.
с ребятами подумали, что выгодно нам будет иметь слой доступа к данным Facade. в нем реализовываем все методы, получающие данные. и наше основное приложение данные получает из этого слоя.
для web сервисов завели другое приложение - все данные загружаем из слоя Facade.
благодаря этому загрузку данных мы реализовываем только в одном месте.

теперь о том как реализовываем.
для выборки простых значений в конечном итоге надо сформировать выражение типа select * from myTable where id=12.
то есть разумно репозиторий реализовывать так, чтобы в нем можно было накапливать условия where.
для многих случаев будет достаточно. накопление where выражений в репозитории также реализовать можно.
но не для всех.
когда у вас много соединений с таблицами - набором нескольких where выкрутиться не получиться.
когда вы не знаете, какой корень агрегации выбрать.
то есть когда нужен вам список пользователей с ролью SuperUser - репозиторий чего вам нужно делать? пользователей или ролей?

мне пришлось репозиторий бросить и строить запрос напрямую.
но более практичным был бы подход делать объект-запрос. его покрыть тестами можно.

сейчас написал - выработалось правило :)
если вы можете однозначно сформулировать корень агрегации - пользуйтесь репозиторием.
если нет - пользуйтесь объектом-запросом
...
Рейтинг: 0 / 0
asp.net репо
    #38589521
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чем плох репозиторий человек отлично написал тут
...
Рейтинг: 0 / 0
asp.net репо
    #38589529
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014skyANAПриведите конкретный пример и лучше с кодом.
кода можно сказать нет.. я пока только думаю как лучше. Конкретный пример. Ну например есть интернет магазин . Таблица с предложениями. И с рубриками. Нужно выводить предложения на страницу с информацией по рубрикам. И в то же время нужно выводить рубрики отдельно. Ну выходит два репозитория в одном джоин 2х сущностей. В другом просто выборка из 1 одной сущности...Правильно-ли я понял, что рубрика - это раздел классификатора товаров. И выводить нужно краткую информацию о том, к какой категории относится товар?

Тогда тут два репозитория, т.к. два корня агрегации: репозиторий предложений и репозиторий для работы с классификатором.
...
Рейтинг: 0 / 0
asp.net репо
    #38589534
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUесли вы можете однозначно сформулировать корень агрегации - пользуйтесь репозиторием.
если нет - пользуйтесь объектом-запросомФишка в том, что репозиторий в качестве параметра может принимать некий IQuery, ICondition, ISpecification, так что не обязательно или тем пользоваться, или этим
...
Рейтинг: 0 / 0
asp.net репо
    #38589543
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUчем плох репозиторий человек отлично написал тут Там же кстати есть ссылка на то, где написано, что можно использовать шаблон Specification вместе c шаблоном Query Object в рамках репозитория
...
Рейтинг: 0 / 0
asp.net репо
    #38590013
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

можно столько всего сделать, что закачаешься.
люди же просят посоветовать с чего начать, как поступить.
ребята делайте для начала как можно проще - жизнь заставит и до фабрик дойдете , и до контейнеров
...
Рейтинг: 0 / 0
asp.net репо
    #38590036
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUskyANA,

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

Но если таки нужен, то я вижу два корня агрегации и соответсвенно два репозитория.
...
Рейтинг: 0 / 0
asp.net репо
    #38590101
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUskyANA,

можно столько всего сделать, что закачаешься.
люди же просят посоветовать с чего начать, как поступить.
ребята делайте для начала как можно проще - жизнь заставит и до фабрик дойдете , и до контейнеров
Люди просят нечто универсальное. Репозиторий в чистом своём виде - универсальное. Только в чистом виде он подходит только для очень простых случаев. Для сложных случаев начинаются подгонки и мутации репозитория для каждого типа случаев. В результате универсальность остаётся утопией.

Новичок приходит на форум с вопросом, а "зубры программирования" ему не могут дать нормальный ответ. Через несколько дней мытарств новичок начинает догадываться, что зубры и сами не знают общего метода и для каждой задачи будут изобретать свой подход. Общие методы хороши только для примеров в учебниках, а на практике в чистом виде почти не применяются.
...
Рейтинг: 0 / 0
asp.net репо
    #38590102
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUuser7320пропущено...

А в интерфейсе как учесть всё разнообразие запросов, включая джойны и пр.? Через объект-запрос? Через составление сложных запросов из простых репозиторных?

репозиторий как паттерн задумывался как абстракция, которая скроет всю работу с БД для операций выборки, добавления, обновления для сущностей. на практике оказывается, что операций извлечений данных уйма, и не всегда понятно репозиторий к какой именно сущности делать.
Мне вот это кажется странным. Репозиторий как паттерн придумали явно не в 2000-х, а раньше. И, судя по тому, что проблемы с ним начинаются почти сразу же после начала использования (начал делать и тут же получил сотни методов типа FindById), почему о его проблемах стали говорить только недавно? Почему все эти QueryObject стали активно обсуждать только лет 5 назад? А до этого что, годами довольствовались километровыми списками методов репозиториев? Или каждый "зубр" писал свой велосипед, проклиная тех, кто придумывает "неработающие паттерны"?
...
Рейтинг: 0 / 0
asp.net репо
    #38590266
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, ну вот что ты несешь?

Я же сказал: два корня агрегации, два репозитория.
По поводу IQueryObject: я первый раз использовал этот шаблон еще при .Net 2.0, когда Linq и IQueryable в помине не было.
...
Рейтинг: 0 / 0
asp.net репо
    #38590356
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320, ну вот что ты несешь?

Я же сказал: два корня агрегации, два репозитория.
По поводу IQueryObject: я первый раз использовал этот шаблон еще при .Net 2.0, когда Linq и IQueryable в помине не было.
А есть случаи, когда репозиторий можно использовать в чистом виде, без всяких квири обджектов и прочих мутаций? Приведи пример, пожалуйста.
...
Рейтинг: 0 / 0
asp.net репо
    #38590357
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAuser7320, ну вот что ты несешь?

Я же сказал: два корня агрегации, два репозитория.
По поводу IQueryObject: я первый раз использовал этот шаблон еще при .Net 2.0, когда Linq и IQueryable в помине не было.
А есть случаи, когда репозиторий можно использовать в чистом виде, без всяких квири обджектов и прочих мутаций? Приведи пример, пожалуйста.
И когда это не приведёт к проблемам, которые описаны в блоге Бындю.
...
Рейтинг: 0 / 0
asp.net репо
    #38590390
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

В принципе, поднимаешь правильные вопросы.
Есть там проблемы с пониманием и с реализацией, но есть задачи которые он решает.
Добавление абстракций приводит к некоторой потере в гибкости. За все нужно платить )
...
Рейтинг: 0 / 0
asp.net репо
    #38590604
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAuser7320, ну вот что ты несешь?

Я же сказал: два корня агрегации, два репозитория.
По поводу IQueryObject: я первый раз использовал этот шаблон еще при .Net 2.0, когда Linq и IQueryable в помине не было.
А есть случаи, когда репозиторий можно использовать в чистом виде, без всяких квири обджектов и прочих мутаций? Приведи пример, пожалуйста.Что такое чистый вид? Ты вообще описание шаблона Repository смотрел? Видел картинку? Понимаешь что такое aCriteria?

Судя по тому, что у тебя сотня методов типа FindById, ни фига ты не видел и не разобрался. Но при этом разглагольствуешь про какие-то мутации

Вот тебе репозиторий без всяких мутаций в виде сотни методов:
Код: c#
1.
2.
3.
4.
5.
6.
public interface IPersonRepository
{
    IEnumerable<IPerson> Find(IPersonCriteria criteria);

    IPerson FindOne(IPersonCriteria criteria);
}
...
Рейтинг: 0 / 0
asp.net репо
    #38590608
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамонuser7320,

В принципе, поднимаешь правильные вопросы.
Есть там проблемы с пониманием и с реализацией, но есть задачи которые он решает.
Добавление абстракций приводит к некоторой потере в гибкости. За все нужно платить )
Я к тому, что, наверное, репозиторий сам по себе никогда не применяется и в чистом виде только в учебных статьях используется, типа этой . А этот дядька Фаулер, который этот репозиторий придумал (или всего лишь популяризовал?), об этом упомянуть забыл, похоже. Ну и заодно практически применимые мутации репозитория тоже не привёл, наверное (я его книжки не читал... но осуждаю, да). Поэтому спустя столько-то лет всякие бындю пишут статьи, как приготовить этот самый репозиторий по уму, и что в сыром виде он не съедобен. А раз до сих пор пишут, значит, общих выработанных подходов нет. Иначе бы не Фаулера с его репозиторием все рекомендовали, а Бындю с его мутациями репозитория.
...
Рейтинг: 0 / 0
asp.net репо
    #38590610
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320user7320пропущено...

А есть случаи, когда репозиторий можно использовать в чистом виде, без всяких квири обджектов и прочих мутаций? Приведи пример, пожалуйста.
И когда это не приведёт к проблемам, которые описаны в блоге Бындю.Какие конкретно проблемы ты решить не можешь?

У меня не возникало проблем, описываемых Бындю, потому как я изначально использовал шаблон "прямые ручки" и те подходы, что он предлагает в виде решения при реализации репозитория.

Бындю же не первооткрыватель паттернов проектирования
...
Рейтинг: 0 / 0
asp.net репо
    #38590613
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

А есть случаи, когда репозиторий можно использовать в чистом виде, без всяких квири обджектов и прочих мутаций? Приведи пример, пожалуйста.Что такое чистый вид? Ты вообще описание шаблона Repository смотрел? Видел картинку? Понимаешь что такое aCriteria?
Критерий - это условие отбора, как я понял. Т. е. (Person.Id == 1) - это вариант критерия.
...
Рейтинг: 0 / 0
asp.net репо
    #38590617
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

А есть случаи, когда репозиторий можно использовать в чистом виде, без всяких квири обджектов и прочих мутаций? Приведи пример, пожалуйста.Что такое чистый вид? Ты вообще описание шаблона Repository смотрел? Видел картинку? Понимаешь что такое aCriteria?

Судя по тому, что у тебя сотня методов типа FindById, ни фига ты не видел и не разобрался. Но при этом разглагольствуешь про какие-то мутации

Вот тебе репозиторий без всяких мутаций в виде сотни методов:
Код: c#
1.
2.
3.
4.
5.
6.
public interface IPersonRepository
{
    IEnumerable<IPerson> Find(IPersonCriteria criteria);

    IPerson FindOne(IPersonCriteria criteria);
}


Тут ещё вопрос, что понимать под критерием. Можно целый интерфейс, как вы, под него подвести.
...
Рейтинг: 0 / 0
asp.net репо
    #38590620
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Парамонuser7320,

В принципе, поднимаешь правильные вопросы.
Есть там проблемы с пониманием и с реализацией, но есть задачи которые он решает.
Добавление абстракций приводит к некоторой потере в гибкости. За все нужно платить )
Я к тому, что, наверное, репозиторий сам по себе никогда не применяется и в чистом виде только в учебных статьях используется, типа этой . А этот дядька Фаулер, который этот репозиторий придумал (или всего лишь популяризовал?), об этом упомянуть забыл, похоже. Ну и заодно практически применимые мутации репозитория тоже не привёл, наверное (я его книжки не читал... но осуждаю, да). Поэтому спустя столько-то лет всякие бындю пишут статьи, как приготовить этот самый репозиторий по уму, и что в сыром виде он не съедобен. А раз до сих пор пишут, значит, общих выработанных подходов нет. Иначе бы не Фаулера с его репозиторием все рекомендовали, а Бындю с его мутациями репозитория.Всякие Бындю пишут статьи для тех, кто Буча, Фаулера, Эванса и т.п. не читал... И в результате получил реализацию с проблемами.

Думаешь зачем он ссылки в конце статьи приводит на всякие DDD? Чтобы бездари разобрались-таки с проектированием, а не ждали пока он очередные проблемы в кучку соберёт и выдаст им готовое решение.
...
Рейтинг: 0 / 0
asp.net репо
    #38590628
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

И когда это не приведёт к проблемам, которые описаны в блоге Бындю.Какие конкретно проблемы ты решить не можешь?

У меня не возникало проблем, описываемых Бындю, потому как я изначально использовал шаблон "прямые ручки" и те подходы, что он предлагает в виде решения при реализации репозитория.

Бындю же не первооткрыватель паттернов проектирования
Так я и говорю - это зависит от того, что понимать под критерием. Одни делают кучу методов и критерий фактически жёстко инкапсулирован в каждый метод. Т. е. FindById - один критерий и один метод, FindByNameAndCity - другой критерий и отдельный метод для него и т. д. У вас же, как я понимаю, нечто более гибкое и критерий задаётся в параметре, а сам метод один для всех возможных критериев для данной сущности (или корня аггрегации) .

Но вот почему у вас несколько методов: Find, FindOne? Наверняка, и другие есть - типа Contains и других. А ведь надо ещё и вставки-удаления-обновления - короче, полный CRUD - реализовать. Т. е. методов в вашем подходе тоже немало - в средних БД за сотню уходит для полного КРУДа, наверное.
...
Рейтинг: 0 / 0
asp.net репо
    #38590643
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Но вот почему у вас несколько методов: Find, FindOne? Наверняка, и другие есть - типа Contains и других. А ведь надо ещё и вставки-удаления-обновления - короче, полный CRUD - реализовать. Т. е. методов в вашем подходе тоже немало - в средних БД за сотню уходит для полного КРУДа, наверное.Что ты хочешь сказать-то?

Обратимся снова к описанию шаблона: "A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection ."

А почему у List<T> несколько методов: Find, FindAll? А какие ещё методы есть у List<T>? А какие вообще методы работы с коллекциями есть? А как они реализованы в Linq? А какие параметры принимают? А какие есть реализации в других языках программирования, других решениях?

Вот тебе примеры и методов и критериев.
...
Рейтинг: 0 / 0
asp.net репо
    #38590671
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320Но вот почему у вас несколько методов: Find, FindOne? Наверняка, и другие есть - типа Contains и других. А ведь надо ещё и вставки-удаления-обновления - короче, полный CRUD - реализовать. Т. е. методов в вашем подходе тоже немало - в средних БД за сотню уходит для полного КРУДа, наверное.Что ты хочешь сказать-то?

Обратимся снова к описанию шаблона: "A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection ."

А почему у List<T> несколько методов: Find, FindAll? А какие ещё методы есть у List<T>? А какие вообще методы работы с коллекциями есть? А как они реализованы в Linq? А какие параметры принимают? А какие есть реализации в других языках программирования, других решениях?

Вот тебе примеры и методов и критериев.
Я хочу сказать, а нельзя ли ещё усовершенствовать твой вариант? Вот у EF не просто Find, FindAll и пр., а сразу со связями всё - из одной сущности можно вытянуть связанные(ую) другие. А Find, FindAll и пр. - это всего лишь один из критерев отбора там - для множества или единственного результата. Т. е. сначала критерии по сущностям задаёшь, включая связанные сущности - т. е. фильтруешь данные, потом критерии множественности-единственности отбора. Вот как удобно!

Короче, я хочу работать с репозиторием, как с EF - написал context и пошёл вытаскивать объекты цепочкой методов или вообще LINQ-выражением. Я не понимаю, почему в EF всё удобно, а в этих ваших репозиториях какие-то извращения с QueryObject и прочим.
...
Рейтинг: 0 / 0
asp.net репо
    #38590674
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Короче, я хочу работать с репозиторием, как с EF
Лучше так сказать: я хочу работать со всеми источниками данных, как с EF. Что мешает мне это сделать? Сложность реализации или что?
...
Рейтинг: 0 / 0
asp.net репо
    #38590677
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320user7320Короче, я хочу работать с репозиторием, как с EF
Лучше так сказать: я хочу работать со всеми источниками данных, как с EF. Что мешает мне это сделать? Сложность реализации или что?
Вот вы говорите "представь, что данные приходят не из БД, а из веб-сервиса". А я хочу с этим веб-сервисом работать как с EF - ЛИНКи там всякие, цепочки методов, лямбды. Что для этого надо сделать?
...
Рейтинг: 0 / 0
asp.net репо
    #38590696
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

нет, ну тут ты разделяй - репозиторий и QueryObject.
когда ты пользуешься репозиторием, использовать QueryObject нет большой необходимости.
фактически (если следовать концепции автора), то он в итоге хорошо подходит для реализации запросов вида
select * from myTable where id=123 или
select * from myTable where id in (1,2,3) [может быть exists] (последнее годиться если производительность запроса не страдает)

если у тебя более сложные запросы - надо смотреть по месту. вполне возможно прийдешь к QueryObject.
например методы типа FindUserByCity() я бы реализовывал в отдельном слое.
вопрос - использовать репозиторий или QueryObject для загрузки данных решал бы исходя из того, укладывается запрос с поиском в конструкцию
типа select * from myTable where id=123.
если да - реализовал бы при помощи репозитория.
если нет - использовал QueryObject.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  public interface IRepository<T>
        where T : class
    {
        IEnumerable<Expression<Func<T, bool>>> WherePredicate { get; set; }
   

        void Insert(T objectToCreate);
        void Delete(Expression<Func<T, Boolean>> where);
        void Delete(T objectToDelete);

        T GetItem(Expression<Func<T, Boolean>> where);

        int Save();

        IEnumerable<T> List();
        PaginatedList<T> List(int? page, int pageSize);

        void OrderBy<TKey>(Expression<Func<T, TKey>> key);

        void Dispose();

    }


вот интерфейс репозитория, который я применил в проекте.
при реализации работать так же удобно, как и в EF.
тут только запросы для отбора данных и CRUD операций.
...
Рейтинг: 0 / 0
asp.net репо
    #38590698
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320user7320пропущено...

Лучше так сказать: я хочу работать со всеми источниками данных, как с EF. Что мешает мне это сделать? Сложность реализации или что?
Вот вы говорите "представь, что данные приходят не из БД, а из веб-сервиса". А я хочу с этим веб-сервисом работать как с EF - ЛИНКи там всякие, цепочки методов, лямбды. Что для этого надо сделать?Книжки почитать

Хочешь использовать в качестве Criteria выражение как в EF - используй! Какие проблемы? EF по твоему чудесно как-то устроен? Думаешь он каким-то мистическим способом преобразует "ЛИНКи там всякие, цепочки методов, лямбды" в запрос к БД?

Нет! Там тупо код написан. Используй в своей реализации подобный подход. Почитай про IQueryProvider.
...
Рейтинг: 0 / 0
asp.net репо
    #38590705
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320user7320Короче, я хочу работать с репозиторием, как с EF
Лучше так сказать: я хочу работать со всеми источниками данных, как с EF. Что мешает мне это сделать? Сложность реализации или что?
если ты хочешь работать с источниками данных - тебе для начала нужна реализация этого источника.
метод типа IList<Users> GetUsers().
вот и будет реализация твоего источника. где он реализован и как - работа для источника.
и чтобы web сервис загружал объекты со всеми связями - эту работу надо провести внутри источника.
...
Рейтинг: 0 / 0
asp.net репо
    #38591438
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUuser7320,

нет, ну тут ты разделяй - репозиторий и QueryObject.
когда ты пользуешься репозиторием, использовать QueryObject нет большой необходимости.
фактически (если следовать концепции автора), то он в итоге хорошо подходит для реализации запросов вида
select * from myTable where id=123 или
select * from myTable where id in (1,2,3) [может быть exists] (последнее годиться если производительность запроса не страдает)

если у тебя более сложные запросы - надо смотреть по месту. вполне возможно прийдешь к QueryObject.
например методы типа FindUserByCity() я бы реализовывал в отдельном слое.
вопрос - использовать репозиторий или QueryObject для загрузки данных решал бы исходя из того, укладывается запрос с поиском в конструкцию
типа select * from myTable where id=123.
если да - реализовал бы при помощи репозитория.
если нет - использовал QueryObject.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  public interface IRepository<T>
        where T : class
    {
        IEnumerable<Expression<Func<T, bool>>> WherePredicate { get; set; }
   

        void Insert(T objectToCreate);
        void Delete(Expression<Func<T, Boolean>> where);
        void Delete(T objectToDelete);

        T GetItem(Expression<Func<T, Boolean>> where);

        int Save();

        IEnumerable<T> List();
        PaginatedList<T> List(int? page, int pageSize);

        void OrderBy<TKey>(Expression<Func<T, TKey>> key);

        void Dispose();

    }


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

monstrUuser7320пропущено...

Лучше так сказать: я хочу работать со всеми источниками данных, как с EF. Что мешает мне это сделать? Сложность реализации или что?
если ты хочешь работать с источниками данных - тебе для начала нужна реализация этого источника.
метод типа IList<Users> GetUsers().
вот и будет реализация твоего источника. где он реализован и как - работа для источника.
и чтобы web сервис загружал объекты со всеми связями - эту работу надо провести внутри источника.
Т. е. написать провайдер данных, который бы позволял отправлять веб-сервису всякие ЛИНКи и лямбды, которые этот веб-сервис бы умел "парсить" и превращать в запрос к БД, а потом возвращать обратно готовый результат запроса в виде объекта со всеми связями (корень аггрегации)?

skyANAuser7320пропущено...

Вот вы говорите "представь, что данные приходят не из БД, а из веб-сервиса". А я хочу с этим веб-сервисом работать как с EF - ЛИНКи там всякие, цепочки методов, лямбды. Что для этого надо сделать?Книжки почитать

Хочешь использовать в качестве Criteria выражение как в EF - используй! Какие проблемы? EF по твоему чудесно как-то устроен? Думаешь он каким-то мистическим способом преобразует "ЛИНКи там всякие, цепочки методов, лямбды" в запрос к БД?

Нет! Там тупо код написан. Используй в своей реализации подобный подход. Почитай про IQueryProvider.
Вот-вот, "там кода написан". Причём кода там написано может даже поболее, чем в "репозитории с двумя сотнями методов". Нужно свои провайдеры писать. А в EF для меня дяди написали и бесплатно дали использовать - красота!

А у вас, кстати, кретирий тоже из себя представляет некий Expression, как у Монстрю ? По идее, если писать в веб-сервисе не FindUserById(int userId), а FindUser(Expression predicate), то можно всякие ЛИНКи и лямбды прямо в параметр метода сервиса отправлять.

Вот тут - чего внутри IPersonCriteria сидит? Методы, принимающие Expression?
...
Рейтинг: 0 / 0
asp.net репо
    #38592669
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

что то у тебя мысли разбегаются и что-то конкретного посоветовать трудно.
конкретно сейчас ты какую задачу решаешь?
...
Рейтинг: 0 / 0
asp.net репо
    #38592686
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUuser7320,

что то у тебя мысли разбегаются и что-то конкретного посоветовать трудно.
конкретно сейчас ты какую задачу решаешь?
Ну, сейчас я не решаю задачу с репозиторием. Я решил, что пока мне не нужно с нескольких источников получать, а только с БД - использую тупо EF. Ну а в будущем надо что-то выбрать будет. Вот и узнаЮ здесь. Потому что репозиторий - он не один. У каждого свой вид на него.

Вот, в частности, хочу узнать у Скайаны, что скрывается под IPersonCriteria здесь . Потому что у вас подход с Expression, а у Скайаны - свой какой-то.
...
Рейтинг: 0 / 0
asp.net репо
    #38592695
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

мне кажется он применил паттерн Спецификация.
ну тот набор Expressions лямбда выражений тоже наверно можно считать примитивной реализации паттерна Спецификация - просто в случае Expressions условие отбора указывается при помощи реализации лямбда выражения, а у него условие отбора указывается при помощи реализации интерфейса
...
Рейтинг: 0 / 0
asp.net репо
    #38592698
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUuser7320,

мне кажется он применил паттерн Спецификация.
ну тот набор Expressions лямбда выражений тоже наверно можно считать примитивной реализации паттерна Спецификация - просто в случае Expressions условие отбора указывается при помощи реализации лямбда выражения, а у него условие отбора указывается при помощи реализации интерфейса
Ваш подход ещё тем отличается, что Expression можно сформировать в одном месте и передать как объект в другое место (с клиента на сервер, например). А можно ли так сделать с конкретной реализацией интерфейса?
...
Рейтинг: 0 / 0
asp.net репо
    #38592712
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

ну в чем проблема - ты указывай во входном параметре функции переменную типа интерфейс, а в конкретном вызове функции указывай уже нужную тебе реализацию интерфейса - будет понижение связности между компонентами системы.
какую конкретно реализацию нужно передать - решать до вызова функции.
интерфейсы в принципе для таких вещей и нужны
...
Рейтинг: 0 / 0
asp.net репо
    #38593077
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320
Ваш подход ещё тем отличается, что Expression можно сформировать в одном месте и передать как объект в другое место (с клиента на сервер, например). А можно ли так сделать с конкретной реализацией интерфейса?

...а зачем выражение EF/Linq формировать на клиенте? .. Клиент - это же пульт с кнопками и переключателями ... Набор состояний контролов можно передать или в коллекции, или как oData делает, да хоть собственный параметр склеить строчный, а метод потом пусть разберет и распихивает по методам уже в веб-сервисе, вызывая IQueryable, IEnumerable, Expression AsDTO ...
...
Рейтинг: 0 / 0
asp.net репо
    #38593430
Gena_16032014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Развели тут :) В чем отличие фабики для квериобжектов и репозитоьрия?
Фабрика по сути и есть год объект
...
Рейтинг: 0 / 0
asp.net репо
    #38593555
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gena_16032014Развели тут :) В чем отличие фабики для квериобжектов и репозитоьрия?
Фабрика по сути и есть год объект

есть разница. репо выдаёт один и тот же тип объекта, но с разными данными. фабрика выдаёт разные объекты с одним интерфейсом.

репозиторий: человек1: вася, человек2: петя, человек3: иван

фабрика: руки-ноги1: человек, руки-ноги2: франкенштейн, руки-ноги3: халк
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / asp.net репо
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]