Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6   вперед  Ctrl      все
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1356
Petro123
fkthat,
Ты пропускаешь мои аргументы.
MS рекумендует иметь по два метода. Асинхронно и синхронно. Одним не обойтись.

MS может рекомендовать хоть ссать стоя на коленях. Нам просто синхронные методы нахер не нужны, потому что все равно все контроллеры асинхронные и в итоге все через await вызывается. Рекомендация иметь пару методов это разве что для разработчиков каких-нибудь библиотек - чисто для удобства пользователя - вдруг кому надо будет синхронно вызвать. Хотя для этого достаточно всего лишь дописать к асинхронному вызову ".Result", или ".Wait". Кстати, сам МС этой рекомендации следует уже далеко не всегда - сейчас в коре уже полно апи где все вызовы только асинхронные.
29 апр 19, 11:08    [21874039]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
все контроллеры асинхронные
то есть get запрос не ждет ответ?
Только не отсылай к картинке что надо освободить поток для другого запроса. Я в курсе.
...
Вы сдерали репо не быстрым но асинхронным на все все свои проекты.
А это чревато. Может потребоваться скорость, а это методы без xxxxAsync и List вместо IEnumerable.
29 апр 19, 11:15    [21874051]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1356
Petro123
fkthat
все контроллеры асинхронные
то есть get запрос не ждет ответ?


Пилять. Да разберись же ты уже в вопросе, или не спорь. Если ты десктоп пишешь, то тебе это все равно нафиг не упало. Ты про "select/poll" в юниксовых апи слышал когда-нибудь? Ну так вот, в случае операций i/o которых в веб-приложении овердофига async/await дает ту же самую выгоду. Запрос ХТТП в итоге все равно синхронен, потому что иначе быть не может, но при выполнении параллельно дофига запросов потоки используются более рационально, потому что поток, который бы в случае синхронного выполнения сидел бы и тупо ждал завершения ввода-вывода может переключиться на выполнение другого кода. В юниксах это называется "select/poll", в виндах "i/o completion port".
29 апр 19, 11:26    [21874080]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Запрос ХТТП в итоге все равно синхронен,
верно.

fkthat
поток, который бы в случае синхронного выполнения сидел бы и тупо ждал завершения ввода-вывода

Теперь читай вариант решения. Без программиста:
автор
При запуске Tomcat создаст пул потоков и экземпляр сервлета. При поступлении запросов методы сервлета будут запускаться на потоках из пула. Сервлет не уничтожается до окончания работы сервера.

Потоки можно создавать самостоятельно, но зачем?
29 апр 19, 11:31    [21874084]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat,
То есть поток не сидит и не ждет, как ты описал страшилку.
29 апр 19, 11:32    [21874086]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1356
Petro123
fkthat,
То есть поток не сидит и не ждет, как ты описал страшилку.


Ога. А метод твоего сервлета сел ждать запроса к БД и заблокировал поток. И нахер мне твой томкат и как там сделано, мы про asp.net говорим.
29 апр 19, 11:36    [21874090]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Если ты десктоп пишешь, то тебе это все равно нафиг не упало.

Задача повысить оклады сотрудников на 1.5.
Покажи важность асинхронности с IEnumerable против синхронности и List /Collection
29 апр 19, 11:36    [21874091]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
И нахер мне твой томкат и как там сделано, мы про asp.net говорим.
ну, ты к юниксам сделал отсылку))
29 апр 19, 11:37    [21874095]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
метод твоего сервлета сел ждать запроса к БД и заблокировал поток
время запроа 0,1сек. Мало? Есть кэширование когда не из базы берет.
29 апр 19, 11:38    [21874096]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Нам просто синхронные методы нахер не нужны
они быстрее))
29 апр 19, 11:40    [21874100]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1356
Petro123,

Я сливаю. Все, надоело. Ты победил.
29 апр 19, 11:45    [21874106]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Petro123,

Я сливаю. Все, надоело. Ты победил. Картинка с другого сайта.
неееет. Консенсус.
Я обязательно и твой асинхронный воткну себе))
29 апр 19, 11:55    [21874119]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26735
fkthat
Petro123
пропущено...
то есть get запрос не ждет ответ?


Пилять. Да разберись же ты уже в вопросе, или не спорь.

Не трать ты на него время :)
29 апр 19, 11:58    [21874125]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26735
fkthat
Я сливаю. Все, надоело. Ты победил.

Молоток :)
29 апр 19, 11:59    [21874126]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
stenford
я спросил, дошло-ли до тебя что проблем с множественным перечислением у IEnumerable за которые ты собирался убивать у репозиториев не будет? Или переформулировать этот вопрос в еще более простой форме?


Я уже привёл список проблем, связанных с IEnumerable. Зачем вы просите меня повторяться? Если с чем не согласны, напишите. Если непонятно, перечитайте.

stenford
во фрейворках много чего появляется, это не означает что надо автоматически не думая хватать новые фичи и пихать их в каждую щель. IEnumerable вполне адекватный интефейс для репозиториев для возврата коллекций, а уж каких-то причин обязательно использовать IReadOnlyCollection вместо него и тем более нет


Я не призывал что-то делать автоматически и не думая, да аргументов я до сих пор не вижу кроме того, что вы считаете IEnumerable адекватным интерфейсом. Жаль вы до сих пор не можете пояснить почему.
30 апр 19, 10:05    [21875255]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
fkthat
Работает очень хорошо. Ты, походу, никак не понимаешь, что наружу там не торчит никакого ни LINQ ни EF, ничего подобного. Мы возвращаем только уже готовые объекты или коллекции объектов, выбранные по некоторым нужным нам критериям. Что там при этом внутри все это скрыто. Есть скажем интерфейс:
public interface IFooRepo {
   ...
   Task<IEnumerable<Foo>> FindAsync(Query query);
   Task<Foo> GetAsync(Guid id);
   ...
}


У сиквельного репо реализации Find и Get будут одни, у монговского другие и т.п. А снаружи это без разницы и с т.ч. клиента выглядит одинаково.


Я всё равно не вижу, почему не вернуть интерфейс коллекции, если никаких отложенных вычислений нет, и вы возвращаете ни что иное, как коллекции. И по семантике, и по факту.

Но вторая проблема здесь заключается в том, что такое у вас Foo? Это агрегат, сущность? Есть ли возможность получить корень агрегата полностью? Или такое поведение у вас инкапсулируется в объекте Query?

Что делать с пейджингом? Приведённый вами интерфейс в упор этого не поддерживает, даже при всём желании.

fkthat
У сиквельного репо реализации Find и Get будут одни, у монговского другие и т.п. А снаружи это без разницы и с т.ч. клиента выглядит одинаково.


Это безусловно хорошо. Таким и должен быть репозиторий.


fkthat
А в твоем ошибочном представлении репо это что-то такое:
public interface IFooRepo {
   IQueryable<Foo> Get();
}


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


А с чего вы решили, что я буду тупо свойство контекста возвращать? И с чего вы решили, что IQueryable не может ходить через EF, Mongo и т.д. и т.п.? Эта та же абстракция, что и ваш Query.
30 апр 19, 10:12    [21875265]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1356
hVostt
Я всё равно не вижу, почему не вернуть интерфейс коллекции, если никаких отложенных вычислений нет, и вы возвращаете ни что иное, как коллекции. И по семантике, и по факту.


Сразу вопрос. Какой именно коллекции? Мне нравится Array, Васе нравится List, а Вове, так вообще HashSet. Потом, мне например, удобно внутри репо работать с массивом, я вот беру и возвращаю массив. А потом алгоритм поменялся, и стало удобно возвращать List. Что мне делать? Городить костыли внутри репо, или ломать все что снаружи? Это другая сторона инкапсуляции - не тольько спрятать что должно быть спрятано, но и иметь возможность это спрятанное поменять, не затрагивая ничего внешнего.
30 апр 19, 10:20    [21875273]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
удобно внутри репо работать с массивом, я вот беру и возвращаю массив
ну ты прям пошутил))
Нам много не надо, свободу давай (с)
30 апр 19, 10:38    [21875298]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
fkthat
Сразу вопрос. Какой именно коллекции? Мне нравится Array, Васе нравится List, а Вове, так вообще HashSet.


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

IReadOnlyCollection появился в библитеке, к сожалению, слишком поздно. К тому времени многие привыкли к IEnumerable, наплевав на семантику, производительность, эффективность и сопровождение.

Почему всегда в спорах в инженерной дисциплине часто скатываются к фломастерам? Что за странная тенденция такая, нездоровая.


fkthat
Потом, мне например, удобно внутри репо работать с массивом, я вот беру и возвращаю массив. А потом алгоритм поменялся, и стало удобно возвращать List. Что мне делать?


И массив и список и другие коллекции реализуют интерфейс IReadOnlyCollection. Только он, как интерфейс, гарантирует, что это конечный список, так как имеет свойство количества, и прямо декларирует, что он только для чтения, что означает возможность безопасно закешировать результат.


fkthat
Городить костыли внутри репо, или ломать все что снаружи? Это другая сторона инкапсуляции - не тольько спрятать что должно быть спрятано, но и иметь возможность это спрятанное поменять, не затрагивая ничего внешнего.


Интерфейс коллекции вашим требованиям удовлетворяет.
30 апр 19, 18:20    [21875852]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
fkthat,

Продолжим. Про пейджинг вы мне не ответили. Как оказалось, отложенные асинхронный вычисления ваши репо не поддерживают.

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

IQueryable отвечает задачам и асинхронного отложенного вычисления, и возможности пейджинга, и возможности бесчисленных эффективных проекций без изменения ни строчки кода репо. На нём можно реализовать OData, например. Или кастомный протокол, выбирающий требуемые данные (конкретные поля), не вытягивая остальное. Возможность тянуть данные по связям, дааа, и фильтровать по ним. Даже фильтровать по агрегациям.

Я не к тому, что IQueryable интерфейс это лучший способ работы с данными на все времена. Не всегда он подходит. Я делал проекты на IQueryable, большие и на CQRS и c EventSourcing, и даже было дело на ActiveObject.

И могу сказать по опыту, все набросы в сторону IQueryable не стоят и выеденного яйца. Пока что из всех, кто бы реально мог аргументировать что-то против IQueryable я могу выделить skyANA, учитывая его опыт в высоконагруженном проекте.
30 апр 19, 18:27    [21875857]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
Вообще, это классика. Когда задача состоит в том, чтобы спроектировать и сделать автомобиль, окрылённый идеей полной инкапсуляции лепит что-то между самолётом, лодкой, автомобилем, трактором и жилым домом.

Реальные задачи его не интересуют :)
Сам такой был, сам таким отчасти остаюсь...
30 апр 19, 18:34    [21875863]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1356
hVostt,

Возвращай что хочешь. С такими упоротыми как ты работать только один способ - во всем с ними соглашаться, и наблюдать как они сами себе могилу роют. Тем более если оценить, то, пожалуй, я за свою жизнь процентов 80 денег из заработанных мной в айти заработал за ковыряние в чужом говнокоде, т.ч. чем вас больше, тем мне лучше
30 апр 19, 19:07    [21875891]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4814
hVostt

И массив и список и другие коллекции реализуют интерфейс IReadOnlyCollection. Только он, как интерфейс, гарантирует, что это конечный список, так как имеет свойство количества, и прямо декларирует, что он только для чтения, что означает возможность безопасно закешировать результат.


Не учи людей плохому. Он декларирует только то. что посредством него, ты ничего не сможешь добавить.
            SortedList<int, string> keyValues = new SortedList<int, string>()
            {
                {1,"1" },
                {2,"2" }
            };

            IReadOnlyCollection<KeyValuePair<int, string>> roc = keyValues;

            Console.WriteLine(roc.Count);

            keyValues.Add(3, "3");

            Console.WriteLine(roc.Count);

Если полагать, что Count никогда не измениться, можно так выстрелить себе в ногу.
6 май 19, 09:33    [21878403]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
fkthat
Возвращай что хочешь. С такими упоротыми как ты работать только один способ - во всем с ними соглашаться, и наблюдать как они сами себе могилу роют. Тем более если оценить, то, пожалуй, я за свою жизнь процентов 80 денег из заработанных мной в айти заработал за ковыряние в чужом говнокоде, т.ч. чем вас больше, тем мне лучше Картинка с другого сайта.


Я не просил вас соглашаться со мной, я ждал аргументов. Аргументов нет, есть какая-то беспросветная чушь про могилы, деньги и говнокод. Ну и ожидаемый переход на личности. Где упоротость, молодой человек? Я все свои тезисы пояснил и не однократно. Видимо худо вам живётся с такой нежной и обидчивой душевной организацией.
13 май 19, 00:09    [21882928]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16008
ЕвгенийВ
Не учи людей плохому. Он декларирует только то. что посредством него, ты ничего не сможешь добавить.


Верно, что и означает read only,


ЕвгенийВ
Если полагать, что Count никогда не измениться, можно так выстрелить себе в ногу.


Так полагать можно про всё что угодно, и даже про "неизменяемые" строки. Контракт означает, что он ДОЛЖЕН соблюдаться, и что этого МОЖНО ожидать. Но если как ты говоришь, не верить контракту, то далеко ты не продвинешься, по-больше try/catch, фреймворку тоже доверять нельзя. Откуда ты знаешь, что вместо открытого дескриптора файла тебе не вернут просто какое-то рандомное число? Никогда не знаешь.

Бред в общем, аргумент странный.
13 май 19, 00:13    [21882930]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить