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

Откуда:
Сообщений: 560
hVostt
love_bach
для ТС репозиторий не нужен. а это все "Бизнес-транзакции, саги, оптимистичные блокировки, версионирование..." к репозиторию не имеет отношения


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


как-то очень вежливо для hVostt сформулировано. может это не ты? :)
ТС делает обертку над EF, которую именует "Репозиторий". Он считает это нужным. Флаг ему в руки. Я так не считаю.
"Бизнес-транзакции" - ну и где тут необходимость именно "Репозитория"?
19 апр 19, 05:37    [21866718]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Lessyp
Member

Откуда:
Сообщений: 125
vb_sub
Какие коллекции в итоге нужно принимать и возвращать?

из репозитория в данном случае - IEnumerable, это read only сортируемая коллекция, которая обычно и требуется
19 апр 19, 08:10    [21866752]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2729
love_bach
Дмитрий Мух
пропущено...
Да, да, да...

Но суть в том, что люди на своих проектах ничего этого не видят, а выводы делают.
Хотя информации для изучения вагон и маленькая тележка.


для ТС репозиторий не нужен

ТС написал, что разбирает книгу "Pro Entity Framework Core 2 for ASP.NET Core MVC" замечательного автора Adam Freeman.
Думаю он сам решит, что делать с прочитанным материалом и практическими примерами.
19 апр 19, 08:42    [21866774]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Lessyp
vb_sub
Какие коллекции в итоге нужно принимать и возвращать?

из репозитория в данном случае - IEnumerable, это read only сортируемая коллекция, которая обычно и требуется
почему только чтение. Люди счас любят всё и сразу)
19 апр 19, 10:13    [21866849]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
Lessyp
из репозитория в данном случае - IEnumerable, это read only сортируемая коллекция, которая обычно и требуется


повбывав бы за IEnumerable
28 апр 19, 00:46    [21873570]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
Для тех, кто в упор не понимает, почему нельзя возвращать IEnumerable, кроме редких исключений, только передавать их.

    public class Repeater<T>
    {
        private readonly T _value;
        private int _count;

        public Repeater(T value, int count)
        {
            _value = value;
            _count = count;
        }

        public IEnumerable<T> GetList()
        {
            while (_count-- > 0)
            {
                yield return _value;
            }
        }
    }


IEnumerable это не коллекция, это перечисление. Которое может быть или бесконечным генератором, или иметь свойство одноразового применения.

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

Не будьте такими :)
28 апр 19, 01:04    [21873573]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

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

Ну так если клиенту нужно что-то другое, то он возьмет уже и сам превратит IEnumerable в это что-то другое. Репозиторий как раз и не должен ничего заранее знать про то, что какому клиенту понадобится.

А пример твой, так он просто косячный, потому что репо должен возвращать готовую коллекцию, но возвращать её как IEnumerable.
28 апр 19, 01:20    [21873583]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
fkthat
Ну так если клиенту нужно что-то другое, то он возьмет уже и сам превратит IEnumerable в это что-то другое.


Это очень плохой аргумент. Потому что исходя из этого, нужно тогда вообще возвращать byte[], а клиент там пусть "превращает". Если по семантике возвращается коллекция, то это должна быть коллекция, а не бесконечное перечисления, так как у коллекции есть как минимум известное количество, а клиент ожидает, что по коллекции можно ходить много раз.

Разумеется, что получив IEnumerable, клиент обязан превратить его в ToArray/ToList, и почувствовать себя при этом тупой обезьяной.

fkthat
Репозиторий как раз и не должен ничего заранее знать про то, что какому клиенту понадобится.


Он не должен знать для чего, а что может понадобиться знать прямо таки обязан.

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

Так что это ещё один плохой аргумент.

fkthat
А пример твой, так он просто косячный, потому что репо должен возвращать готовую коллекцию, но возвращать её как IEnumerable.


Коллекция должна быть коллекцией, вести себя как коллекция и быть коллекцией. Подмена понятий в адекватной разработке не уместна. Не умение работать с типами это признак джуна, и оправданий тут быть не может. Косячишь в одном месте -- значит косячишь везде.
28 апр 19, 01:52    [21873586]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

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

Ладно, лень спорить. Воля ваша - возвращайте что хотите, мне какая печаль-то
28 апр 19, 02:08    [21873589]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2729
hVostt,

а откуда ты сам взял это своё бесконечное перечисление?

IEnumerable предоставляет простую итерацию над коллекцией. Он не является каким-то бесконечным перечислением.

Ты видел вообще когда-нибудь в жизни то, чем тут народ пугаешь? Картинка с другого сайта.
28 апр 19, 06:46    [21873601]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
stenford
Member

Откуда: урал
Сообщений: 2785
hVostt
Коллекция должна быть коллекцией, вести себя как коллекция и быть коллекцией. Подмена понятий в адекватной разработке не уместна. Не умение работать с типами это признак джуна, и оправданий тут быть не может. Косячишь в одном месте -- значит косячишь везде.

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

hVostt
повбывав бы за IEnumerable

да никого ты не убиваешь, судя по всему ты фрилансер т.к. за милю чувствуется отсутствие опыта работы в команде и навыков совместного обсуждения проблем, такая ослиная упертость в отстаивании каких-то совершенно диких идей и бабские истерики когда тебя тыкают мордой в твои ляпы обычно вырабатываются годами сидения в одиночку перед компьютером
28 апр 19, 08:32    [21873608]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

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

Откуда:
Сообщений: 1666
Petro123
stenford
Далее, если репозиторий все-же позволяет отложенное исполнение - это значит контекст там один на всех,
железное правило?

Необязательно. Запросто можно нормально возвращать и отложенное. Просто надо с умом делать.

Плохо:
private _context = new Context();

public IEnumerable<SomeData> GetSomeData() {
   return _context.SomeData;
}


А вот это будет норм:
public IEnumerable<SomeData> GetSomeData() {
   var context = new Context();
   return context.SomeData;
}


Хотя и второй вариант не есть гуд, т.к. проблемы с диспозом контекста и т.п. В общем, тут как и везде - надо просто понимать как это работает, и что ты делаешь. Самый распространенный баг, что я встречал, это:
public IEnumerable<Entity> GetEntities() {
    using(var context = new Context()) {
        return context.Entities;
    }
}
28 апр 19, 13:25    [21873688]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
Дмитрий Мух
а откуда ты сам взял это своё бесконечное перечисление?
IEnumerable предоставляет простую итерацию над коллекцией. Он не является каким-то бесконечным перечислением.


Он может являться бесконечным перечислением. Также второй проход может возвращать совсем иной результат. Также если каждый следующий проход возвращает тоже самое, при этом будет выполняться повторные вычисления и ненужный расход памяти.

Дмитрий Мух
Ты видел вообще когда-нибудь в жизни то, чем тут народ пугаешь? Картинка с другого сайта.


Видел. Также профилировал издержки, связанные с использованием IEnumerable, конечно они решались на клиенте с помощью материализации последовательности.
28 апр 19, 16:13    [21873733]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
stenford
ты-же даже не понял что тебе написали, отложенное исполнение IEnumerable возможно только в случае если репозиторий не привел результат в коллекцию


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


stenford
Далее, если репозиторий все-же позволяет отложенное исполнение - это значит контекст там один на всех


Серьёзно? Прям один на всех? Это из какой такой реальности? Про lifetime scope слышали?


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


Аргументы, так и не начавшись, кончились, попёрло низкосортное быдлячество.
28 апр 19, 16:18    [21873735]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
fkthat
А вот это будет норм:
public IEnumerable<SomeData> GetSomeData() {
   var context = new Context();
   return context.SomeData;
}


А теперь материализуйте результат асинхронно. Покажете как это сделать?
28 апр 19, 16:23    [21873737]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1666
hVostt
А теперь материализуйте результат асинхронно. Покажете как это сделать?

А про асинхронность нигде не говорилось. Это просто был пример, что отложенное перечисление в принципе возможно. Я бы и сам такой код не стал писать.
28 апр 19, 17:03    [21873745]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
love_bach
Member

Откуда:
Сообщений: 560
блеать, вот казалось бы. а и тут возможен срач!
репо нахер не нужен, за редкими случаями. абстракция на хранилищем
28 апр 19, 17:21    [21873753]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
love_bach
Member

Откуда:
Сообщений: 560
hVostt
fkthat
А вот это будет норм:
public IEnumerable<SomeData> GetSomeData() {
   var context = new Context();
   return context.SomeData;
}


А теперь материализуйте результат асинхронно. Покажете как это сделать?


ты несешь какую-то дичь. угомонись, уже
28 апр 19, 17:23    [21873755]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1666
love_bach
блеать, вот казалось бы. а и тут возможен срач!
репо нахер не нужен, за редкими случаями. абстракция на хранилищем

Я еще раз скажу - все зависит от масштабов. У нас проект, например, порядка трех десятков микросервисов, десятка полтора-два всевозможных хранилищ, внешние источники данных, счет всевозможным сущностям идет на сотни. Вот тогда начинаешь понимать, зачем все эти самые "абстракции над хранилищем" нужны. А интернет-магазинчик губной помады написать - там прослойка репо и вправду не нужна.
28 апр 19, 17:45    [21873774]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
Petro123
Member

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

Необязательно. Запросто можно нормально возвращать и отложенное. Просто надо с умом делать.
значит весь его пост вообще бездоказательный набор букв.
28 апр 19, 21:57    [21873807]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
fkthat
hVostt
А теперь материализуйте результат асинхронно. Покажете как это сделать?

А про асинхронность нигде не говорилось. Это просто был пример, что отложенное перечисление в принципе возможно. Я бы и сам такой код не стал писать.


В этом и дело, IEnumerable крайне абстрактная структура. Приделать асинхронную материализацию невозможно. Сделать трансляцию в запрос невозможно. Сменить способ реализации отложенного вычисления невозможно.

Всё что можно, это получить курсор и пройтись вдоль последовательности только вперёд. И надеяться, что повторный проход не отстрелит обе ноги.

Но всё это возможно сделать на IQueryable.

Так какие проблемы вернуть интерфейс подходящей коллекции, если возвращаешь коллекцию? Не понимаю в упор, чего так многие упираются, в .NET целая пачка подходящих интерфейсов, все стандартизованные и поддерживаются на обоих современных платформах.
29 апр 19, 00:36    [21873864]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
love_bach
ты несешь какую-то дичь. угомонись, уже


Книжка иди почитай, да. Может потом начнёшь понимать о чём речь.
29 апр 19, 00:38    [21873865]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1666
hVostt
fkthat
пропущено...

А про асинхронность нигде не говорилось. Это просто был пример, что отложенное перечисление в принципе возможно. Я бы и сам такой код не стал писать.


В этом и дело, IEnumerable крайне абстрактная структура. Приделать асинхронную материализацию невозможно. Сделать трансляцию в запрос невозможно. Сменить способ реализации отложенного вычисления невозможно.

Всё что можно, это получить курсор и пройтись вдоль последовательности только вперёд. И надеяться, что повторный проход не отстрелит обе ноги.

Но всё это возможно сделать на IQueryable.

Так какие проблемы вернуть интерфейс подходящей коллекции, если возвращаешь коллекцию? Не понимаю в упор, чего так многие упираются, в .NET целая пачка подходящих интерфейсов, все стандартизованные и поддерживаются на обоих современных платформах.


Вот, типичный пример кода, наподобии того, который у нас в репах:

public async Task<IEnumerable<Foo>> GetFoos() {
    using(var context = new Context()) {
        return await context.Foos.ToListAsync();
    }
}
29 апр 19, 01:06    [21873870]     Ответить | Цитировать Сообщить модератору
 Re: Передача лямбды в репозиторий. Где ошибка?  [new]
fkthat
Member

Откуда:
Сообщений: 1666
hVostt
Так какие проблемы вернуть интерфейс подходящей коллекции, если возвращаешь коллекцию? Не понимаю в упор, чего так многие упираются, в .NET целая пачка подходящих интерфейсов, все стандартизованные и поддерживаются на обоих современных платформах.


Проблема в инкапсуляции. Сегодня внутри репо список, а завтра окажется HashSet. Что, каждый раз интерфейс менять и все что его использует переписывать? Это же вообще тогда писец. А IEnumerable это и есть самая-самая базовая абстракция для всех коллекций - абстракнее некуда.
29 апр 19, 01:09    [21873871]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить