powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Тестовое задание
153 сообщений из 153, показаны все 7 страниц
Тестовое задание
    #39469792
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Много раз уже перетиралось делать/не делать тестовые задания. Я, вот, сделал, искал на удаленку (постоянку) ведушим программистом. Ответа не получил. Если кому-то нечего делать, гляньте, пожалуйста, покритикуйте. Хоть какой-то профит от этого задания хочу получить

https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39469907
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskЗдравствуйте.
Много раз уже перетиралось делать/не делать тестовые задания. Я, вот, сделал, искал на удаленку (постоянку) ведушим программистом. Ответа не получил. Если кому-то нечего делать, гляньте, пожалуйста, покритикуйте. Хоть какой-то профит от этого задания хочу получить

https://github.com/fiqwenbv/ParrotWings
Задание-то озвучьте.

А то множество не понятно зачем придуманных интерфейсов, репозитории, что возвращают и доменные объекты и DTO, использование на кой-то черт Session.
И не написанные тесты :) А они бы помогли обозначить ошибки в проектировании.
...
Рейтинг: 0 / 0
Тестовое задание
    #39469911
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAtest_taskЗдравствуйте.
Много раз уже перетиралось делать/не делать тестовые задания. Я, вот, сделал, искал на удаленку (постоянку) ведушим программистом. Ответа не получил. Если кому-то нечего делать, гляньте, пожалуйста, покритикуйте. Хоть какой-то профит от этого задания хочу получить

https://github.com/fiqwenbv/ParrotWings
Задание-то озвучьте.

А то множество не понятно зачем придуманных интерфейсов, репозитории, что возвращают и доменные объекты и DTO, использование на кой-то черт Session.
И не написанные тесты :) А они бы помогли обозначить ошибки в проектировании.

задание тут
https://github.com/fiqwenbv/ParrotWings/wiki
...
Рейтинг: 0 / 0
Тестовое задание
    #39469915
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAрепозитории, что возвращают и доменные объекты и DTO

это не правильно? почему? как правильно?
...
Рейтинг: 0 / 0
Тестовое задание
    #39469925
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskskyANAрепозитории, что возвращают и доменные объекты и DTO

это не правильно? почему? как правильно?
По определению репозиторий возвращает по запросу и сохраняет Business (Domain) Entity.
Операции с DTO - это уже нарушение шаблона и принципа единтсвенности ответсвенности.

Также вот это не репозиторий:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
namespace ParrotWings.Repository.Interface
{
    public interface ISettingsRepository
    {
        decimal GetDefaultUserAccountBalance();
        decimal GetLimitTransferAmount();
    }
}


Если есть какие-то сохраняемые настройки, то ими и надо оперировать.
То есть репозиторий должен принимать на вход SettingCriteria и возвращать некий Setting.
...
Рейтинг: 0 / 0
Тестовое задание
    #39470258
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAtest_taskЗдравствуйте.
Много раз уже перетиралось делать/не делать тестовые задания. Я, вот, сделал, искал на удаленку (постоянку) ведушим программистом. Ответа не получил. Если кому-то нечего делать, гляньте, пожалуйста, покритикуйте. Хоть какой-то профит от этого задания хочу получить

https://github.com/fiqwenbv/ParrotWings
Задание-то озвучьте.

А то множество не понятно зачем придуманных интерфейсов, репозитории, что возвращают и доменные объекты и DTO , использование на кой-то черт Session.
И не написанные тесты :) А они бы помогли обозначить ошибки в проектировании.

для этого примера можно, наверное, вынести все джоины в DataService, и все проекции для DTO строить там. Но, если заменить реализацию в NH на основе ICriteria, так сделать уже не получится.
...
Рейтинг: 0 / 0
Тестовое задание
    #39470263
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task, зачем Вы вообще заморочились с NH, этого же в задании не требовалось?
А вот пункт "10. Mobile application" отсутсвует в решении.
...
Рейтинг: 0 / 0
Тестовое задание
    #39470268
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAtest_task, зачем Вы вообще заморочились с NH, этого же в задании не требовалось ?
А вот пункт "10. Mobile application" отсутсвует в решении .

сначала сделал минимум. ответа все не было. дальше превратил этот проект в базу для экспериментов, которые меня в текущий момент интересовали. основной из них - это как разделить без "диффузии" одного в другой DataService и Repository

мобильное не надо - задание общее для нескольник позиций.
...
Рейтинг: 0 / 0
Тестовое задание
    #39470273
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskskyANAtest_task, зачем Вы вообще заморочились с NH, этого же в задании не требовалось ?
А вот пункт "10. Mobile application" отсутсвует в решении .

сначала сделал минимум. ответа все не было. дальше превратил этот проект в базу для экспериментов, которые меня в текущий момент интересовали. основной из них - это как разделить без "диффузии" одного в другой DataService и Repository

мобильное не надо - задание общее для нескольник позиций.

по работе сейчас приходится заниматься, в основном, с NH (ICriteria) и легковесными ОРМ аля raw sql. вот и прицел от этого
...
Рейтинг: 0 / 0
Тестовое задание
    #39470816
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskЗдравствуйте.
Много раз уже перетиралось делать/не делать тестовые задания. Я, вот, сделал, искал на удаленку (постоянку) ведушим программистом. Ответа не получил. Если кому-то нечего делать, гляньте, пожалуйста, покритикуйте. Хоть какой-то профит от этого задания хочу получить

https://github.com/fiqwenbv/ParrotWings

Не жирновато для тестового задания?
...
Рейтинг: 0 / 0
Тестовое задание
    #39470950
Фотография Arpanx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне понравилось тестовое. Пока сделаешь, можно за одно и программирование выучить.
А сколько времени ушло на выполнение?
...
Рейтинг: 0 / 0
Тестовое задание
    #39471298
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
внес исправления согласно рекомендациям skyANA:
https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39471744
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
написал несколько тестов
https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39471815
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskнаписал несколько тестов
https://github.com/fiqwenbv/ParrotWings
В первые что-ли тесты пишете?
...
Рейтинг: 0 / 0
Тестовое задание
    #39472283
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAtest_taskнаписал несколько тестов
https://github.com/fiqwenbv/ParrotWings
В первые что-ли тесты пишете?А что с ними не так?
...
Рейтинг: 0 / 0
Тестовое задание
    #39476795
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подниму. может снова кому-то делать нечего
...
Рейтинг: 0 / 0
Тестовое задание
    #39476808
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

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

Откуда вообще такая уверенность или надежда, что каким-то людям в этой жизни больше заняться нечем, кроме как делать чьи-то чужие унылые задания?
...
Рейтинг: 0 / 0
Тестовое задание
    #39476961
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt кроме как делать чьи-то чужие унылые задания?

А с чего ты решил, что он просит _сделать_ задание? Он просит покритиковать.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477019
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVostt кроме как делать чьи-то чужие унылые задания?

А с чего ты решил, что он просит _сделать_ задание? Он просит покритиковать.

Да та же фигня. Критикуешь? Значит объясняй как надо, как было бы лучше, как правильно. А там вообще всё настолько уныло, что не то что на ведущего не тянет, с натяжкой на младшего джуниора самый максимум. Это неплохо, чего-то не знать в начале карьеры. Но по этой теме уже столько информации, что стыдно тупо копировать заезженный шаблон, совершенно не понимая что это и для чего.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477025
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот на что бы я с удовольствием посмотрел, это на пример SOLID-ного решения с разделением модели доступа к данным на читателей/писателей, с агрегатами доменной модели, с сервисами бизнес-логики, шиной событий и адекватной обвязкой с эффективным выхлопом от применения ООП и статической типизации. Вот такое ещё бы потянуло на ведущего.

А то унылые репозитории, DTO, какие-то дата сервисы, которые к тому же весьма далеки от того, чем они должны по идее являться. Как тут критиковать? Скажешь, это у тебя не репозиторий. А что тогда репозиторий? Давай объясняй, разъясняй, учи... Другое дело конкретные вопросы, целенаправленные. Какие-то попытки разобраться, а не тупо скопировать. Вот это уже интересно.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477243
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВот на что бы я с удовольствием посмотрел, это на пример SOLID-ного решения с разделением модели доступа к данным на читателей/писателей, с агрегатами доменной модели, с сервисами бизнес-логики, шиной событий и адекватной обвязкой с эффективным выхлопом от применения ООП и статической типизации. Вот такое ещё бы потянуло на ведущего.

В тестовом задании?
...
Рейтинг: 0 / 0
Тестовое задание
    #39477278
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВот на что бы я с удовольствием посмотрел, это на пример SOLID-ного решения с разделением модели доступа к данным на читателей/писателей, с агрегатами доменной модели, с сервисами бизнес-логики, шиной событий и адекватной обвязкой с эффективным выхлопом от применения ООП и статической типизации. Вот такое ещё бы потянуло на ведущего.

А то унылые репозитории, DTO, какие-то дата сервисы, которые к тому же весьма далеки от того, чем они должны по идее являться. Как тут критиковать? Скажешь, это у тебя не репозиторий. А что тогда репозиторий? Давай объясняй, разъясняй, учи... Другое дело конкретные вопросы, целенаправленные. Какие-то попытки разобраться, а не тупо скопировать. Вот это уже интересно.

ок.
а можно, если, всеже, делать нечего, по-конкретней. что, например, не так с репозиторием (skyANA обозначил нарушения, я их устранил)? зачем тут "агрегаты доменной модели" (тут разве они могут быть?)? и шина событий?
и зачем тут "читатели/писатели". это конечно, уже выходит за рамки тестового, в том числе, этого задания. но было бы интересно услышать Вашу критику.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477281
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортомпропущено...


А с чего ты решил, что он просит _сделать_ задание? Он просит покритиковать.

Да та же фигня. Критикуешь? Значит объясняй как надо, как было бы лучше, как правильно. А там вообще всё настолько уныло, что не то что на ведущего не тянет, с натяжкой на младшего джуниора самый максимум . Это неплохо, чего-то не знать в начале карьеры. Но по этой теме уже столько информации, что стыдно тупо копировать заезженный шаблон, совершенно не понимая что это и для чего.

а что имено? Вы, как я понимаю, говорите это с позиции своего опыта. И, наверняка, там есть видение "исправить 1, 2, 3...". можно это "1, 2, 3"? крупными мазками
...
Рейтинг: 0 / 0
Тестовое задание
    #39477379
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskок.
а можно, если, всеже, делать нечего, по-конкретней. что, например, не так с репозиторием (skyANA обозначил нарушения, я их устранил)? зачем тут "агрегаты доменной модели" (тут разве они могут быть?)? и шина событий?
и зачем тут "читатели/писатели". это конечно, уже выходит за рамки тестового, в том числе, этого задания. но было бы интересно услышать Вашу критику.

Затем, чтобы продемонстрировать ваши способности в проектировании архитектуры информационной системы с прицелом на развитие и поддержку. Ну это к вопросу, что лично мне было бы интересно увидеть.


test_taskа что имено? Вы, как я понимаю, говорите это с позиции своего опыта. И, наверняка, там есть видение "исправить 1, 2, 3...". можно это "1, 2, 3"? крупными мазками

Как будет реализована фильтрация данных с клиента? По методу на каждый чих в DataService?

Где реализована безопасность доступа к данным? Там же в сервисах на уровне обычных пользовательских фильтров?

Почему Domain-ом обозваны обычные транспортные классы для ORM? В каком же месте это Domain?

Очень странная обработка ошибок.

Код: c#
1.
errorMessages.Add("Id", new List<string>() { id.ToString() });



Почему бы тогда не определить свой тип исключения? Надо всё время помнить вот этот неочевидный, не расширяемый контракт?

Зачем дублировать интерфейсы репозиториев? Почему репозитории возвращают как DTO, так и «domain» классы? Почитайте что такое репозиторий.

Код: c#
1.
2.
Account account = accountRepository.GetList().FirstOrDefault(u => u.Id == userId);
Account correspondentAccount = accountRepository.GetList().FirstOrDefault(u => u.Id == correspondentUserId);



ужасно тупо

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 public interface IAccountTransactionService
    {
        IList<AmountTransactionDTO> GetList(long userId, OrderInfo orderInfo, PageInfo pageInfo);

        decimal Create(long userId, long correspondentUserId, decimal amount);
        
        AmountTransaction GetNew(long userId);
}



Возвращать надо или IEnumerable, или IReadOnlyCollection/List, а не изменяемый список.

Create возвращает какой-то decimal. Рыщем в имплементации, выясняем, что это какой-то там баланс. Очуметь.

В то же время GetNew возвращает какой-то объект транзакции... или погодите-ка?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        public AmountTransaction GetNew(long userId)
        {
            Account account = accountRepository.GetList().FirstOrDefault(u => u.Id == userId);
            return new AmountTransaction()
            {
                 Balance = account.Balance
            };
        }



это если нам повезёт, однако. Чё к чему вообще?

Косяков навалом. Вы сами-то их видите? Если нет, то у меня очень печальные новости для вас...
...
Рейтинг: 0 / 0
Тестовое задание
    #39477382
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомВ тестовом задании?

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

А судя по интервью, которые я провожу, абсолютное большинство кандидатов проходят собеседование на отъе...сь. Больше половины не готовятся вообще. Даже если на 100% очевидно, что будут спрашивать, написано чёрным по белому в вакансии. Даже про это не почитают. Хотя бы поверхностно.

Поэтому можно сказать, накипело.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомВ тестовом задании?

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

А судя по интервью, которые я провожу, абсолютное большинство кандидатов проходят собеседование на отъе...сь. Больше половины не готовятся вообще. Даже если на 100% очевидно, что будут спрашивать, написано чёрным по белому в вакансии. Даже про это не почитают. Хотя бы поверхностно.

Поэтому можно сказать, накипело.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477452
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

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

у нас типа финансовая система, поэтому я как ведущий программист подумал бы о следующих вещах:
1. вход пользователя - в задании нет никаких требований по безопасности, возможно для упрощения, но я как минимум описал бы свои мысли по этому поводу - например шифрование пароля, двухфакторная аутентификация
2. отложенность транзакций - вы замечали, что деньги на межбанковские переводы у вас с банковского счета не списываются в выходные дни? пишет - заблокировано средств столько-то. в задании конечно есть ограничение - что это какая-то внутренняя система, но я бы подумал о расширении - например подключении внешних платежных систем и банковский счетов
3. производительность - как вы собираетесь распараллеливать обработку транзакций? возможно нужна очередь в базе данных или MQ
4. логирование - пользователи очень очень преочень беспокоятся за свои деньги, даже за одну копейку - как вы собираетесь обеспечить нужный уровень логирования ошибок, событий, чтобы в будущем разобраться почему деньги исчезли или ушли не туда?
5. отказоустойчивость - как вы собираетесь решать эту проблему на клиенте, на сервере? да хотя бы потеря сети? или превышение таймаута запроса
6. устойчивость к хакерским атакам - например насколько легко подделать данные, отправить их на сервер, чтобы списалось больше денег или ушло не тому человеку?
7. в задании было что-то про уведомления пользователей чуть ли не на каждый чих - опять же это отдельная тема как по расширению (куда уведомлять? на мыло, на мобильник, пуш-уведомление?), так и по производительности (пользователей много, уведомлений еще больше, как минимум раза в два), а так же по способу (опрашиваем сервер или подписываемся на уведомления и сервер шлет на клиенты)
8. требование RESTfull - в текущей реализации это не совсем RESTfull, но я не уверен - понимают ли постановщики тестового задания этот термин в полной мере. вот хорошая статья https://habrahabr.ru/post/319984
9. я не знаком с мобильной разработкой, но слышал, что там есть особенности по аутентификации и авторизации

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

и это уже будет совсем другая история
...
Рейтинг: 0 / 0
Тестовое задание
    #39477464
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот тут можете почитать про эволюцию кода от репозиториев до CQRS http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html и это было написано три года назад
...
Рейтинг: 0 / 0
Тестовое задание
    #39477613
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортомВ тестовом задании?

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

Интересно, когда дизайнера Audi в KIA переманивали - его тоже попросили "а нарисуй-ка нам дЕзайн крутой тачки! У тебя 20 минут, время пошло"


hVosttДаже если на 100% очевидно, что будут спрашивать, написано чёрным по белому в вакансии. Даже про это не почитают.

Какой смысл спрашивать на собеседовании что-то, что можно прочитать перед ним? Цена таким знаниям? Какой-то, извини, совок. Если какие-то знания можно приобрести за 20 минут, то какая разница - когда это будет сделано до или после?

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

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

Но, возможно, мне только кажется.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477722
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом, Вы реально не понимаете, зачем на собеседованиях спрашивать то, что поможет понять, а подходит человек под требования, изложенные в вакансии, или нет?
...
Рейтинг: 0 / 0
Тестовое задание
    #39477729
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что Вы будете гуглить за 5 минут, если в требованиях к примеру опыт оптимизации работы с БД и я Вас попрошу о нём рассказать? Чужой опыт будете гуглить и потом мне на собеседовании пересказывать? :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39477777
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАгнец за бортом, Вы реально не понимаете, зачем на собеседованиях спрашивать то, что поможет понять, а подходит человек под требования, изложенные в вакансии, или нет?

Я не понимаю, зачем ожидать от соискателя, чтобы он что-то "почитал" по теме перед собеседованием. Цена таким знаниям - ноль. Если он в теме, то и "освежать" знания не надо, если не в теме, то "беглый просмотр" не поможет.

И принимать решение о найме на основании вышеизложенного странно.

Так понятней?
...
Рейтинг: 0 / 0
Тестовое задание
    #39477934
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомИнтересно, когда дизайнера Audi в KIA переманивали - его тоже попросили "а нарисуй-ка нам дЕзайн крутой тачки! У тебя 20 минут, время пошло"

Без понятия. Не вижу причин фантазировать на эту тему.


Агнец за бортомКакой смысл спрашивать на собеседовании что-то, что можно прочитать перед ним? Цена таким знаниям? Какой-то, извини, совок. Если какие-то знания можно приобрести за 20 минут, то какая разница - когда это будет сделано до или после?

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

Агнец за бортомМне кажется, акцент стоит делать на том, что не приобретается за 5 минут гугления.

Т.е. надо написать в вакансии одно, а спрашивать другое? Ты в своём вообще уме?

Собеседование это не экзамены, это не тестирование, это беседа. В процессе беседы всё прекрасно раскрывается.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477936
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомЯ не понимаю, зачем ожидать от соискателя, чтобы он что-то "почитал" по теме перед собеседованием. Цена таким знаниям - ноль. Если он в теме, то и "освежать" знания не надо, если не в теме, то "беглый просмотр" не поможет.

Речь вообще не об этом шла. Я сказал, что отдельные кандидаты даже не пытаются подготовиться.

— Моего знакомого менты приняли за грибы.
— Как можно принять человека за грибы? Совсем не похоже ведь.
— Настя...
— Ну что

Ты прям вот как Настя
...
Рейтинг: 0 / 0
Тестовое задание
    #39477944
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомskyANAАгнец за бортом, Вы реально не понимаете, зачем на собеседованиях спрашивать то, что поможет понять, а подходит человек под требования, изложенные в вакансии, или нет?

Я не понимаю, зачем ожидать от соискателя, чтобы он что-то "почитал" по теме перед собеседованием. Цена таким знаниям - ноль. Если он в теме, то и "освежать" знания не надо, если не в теме, то "беглый просмотр" не поможет.

И принимать решение о найме на основании вышеизложенного странно.

Так понятней?
Подготовился - это не что-то там "почитал", а ознакомился с профилем компании, требованиями, прикинул примерный круг задач, что будут спрашивать.
Выписал себе на листочек, что хотел бы узнать, спросить, уточнить на собеседовании.

А то спрашиваешь: Вы заходили на наш сайт, понимаете чем мы занимаемся, какой у нас продукт?
В ответ что-то там мычат. И встаёт вопрос, а человек вообще хочет именно у нас работать, или ему по фигу где, с кем и над чем он будет трудиться?
...
Рейтинг: 0 / 0
Тестовое задание
    #39477951
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПодготовился - это не что-то там "почитал", а ознакомился с профилем компании, требованиями, прикинул примерный круг задач, что будут спрашивать.
Выписал себе на листочек, что хотел бы узнать, спросить, уточнить на собеседовании.

Как минимум соотнёс свои знания и опыт с тем, что требуется. Если что, освежил. Это огромный жирный минус для человека, если на сосебедовании — «это я конечно знаю, да подзабыл» (хотя это написано в вакансии чёрным по белому), да и вообще зачем это нужно и начинает в чём-то переубеждать, типа ща так не делают, это не используют, всё везде уже давно по-другому... Зачем пришёл, спрашивается? А вдруг повезёт? :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39477953
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА то спрашиваешь: Вы заходили на наш сайт, понимаете чем мы занимаемся, какой у нас продукт?
В ответ что-то там мычат. И встаёт вопрос, а человек вообще хочет именно у нас работать, или ему по фигу где, с кем и над чем он будет трудиться?

Плюс, если человек предварительно поинтересовался, куда он собирает предложить свою кандидатуру, особенно если это компания с публичными продуктами.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477972
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортомЯ не понимаю, зачем ожидать от соискателя, чтобы он что-то "почитал" по теме перед собеседованием. Цена таким знаниям - ноль. Если он в теме, то и "освежать" знания не надо, если не в теме, то "беглый просмотр" не поможет.

Речь вообще не об этом шла.

hVostt Даже если на 100% очевидно, что будут спрашивать, написано чёрным по белому в вакансии. Даже про это не почитают. Хотя бы поверхностно.



А о чем шла речь, хвост? Опять намемекал, впрочем, как обычно, а теперь юлишь. Ты не баба?
...
Рейтинг: 0 / 0
Тестовое задание
    #39477975
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVosttпропущено...


Речь вообще не об этом шла.

hVostt Даже если на 100% очевидно, что будут спрашивать, написано чёрным по белому в вакансии. Даже про это не почитают. Хотя бы поверхностно.



А о чем шла речь, хвост? Опять намемекал, впрочем, как обычно, а теперь юлишь. Ты не баба?
Почему юлит? Ты его понял на свой лад, обычное дело. Но вроде он развернул уже свою мысль, чтобы стало понятнее о чём он.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477982
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомА о чем шла речь, хвост? Опять намемекал, впрочем, как обычно, а теперь юлишь. Ты не баба?

Ты сделал в корне неправильный и очень примитивный вывод, основанный на своих смешных домыслах, а не на моих словах.
...
Рейтинг: 0 / 0
Тестовое задание
    #39477995
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПочему Domain-ом обозваны обычные транспортные классы для ORM ? В каком же месте это Domain?
Переименовал сборку ParrotWings.Domain в ParrotWings.Entity, класс BaseDomain в BaseEntity. Хотя, вряд ли это сильно на что-то повлияет. А что Вы понимаете под "обычные транспортные классы для ORM"?

hVosttПочему репозитории возвращают как DTO, так и «domain» классы? Почитайте что такое репозиторий.
в каком месте?
...
Рейтинг: 0 / 0
Тестовое задание
    #39478032
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
2.
Account account = accountRepository.GetList().FirstOrDefault(u => u.Id == userId);
Account correspondentAccount = accountRepository.GetList().FirstOrDefault(u => u.Id == correspondentUserId);



ужасно тупо


тут просто баг (u.UserId == ...). а что тут "ужасно тупого"?
...
Рейтинг: 0 / 0
Тестовое задание
    #39478036
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVostt
Код: c#
1.
2.
Account account = accountRepository.GetList().FirstOrDefault(u => u.Id == userId);
Account correspondentAccount = accountRepository.GetList().FirstOrDefault(u => u.Id == correspondentUserId);



ужасно тупо


тут просто баг (u.UserId == ...). а что тут "ужасно тупого"?вот эти кишки

GetList().FirstOrDefault(u => u.Id == userId);
GetList().FirstOrDefault(u => u.Id == correspondentUserId)

должны быть запрятаны в репозитарий, а не торчать наружу, метод должен возвращать данные, с которыми уже ничего не нужно делать.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478038
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVostt
Код: c#
1.
2.
Account account = accountRepository.GetList().FirstOrDefault(u => u.Id == userId);
Account correspondentAccount = accountRepository.GetList().FirstOrDefault(u => u.Id == correspondentUserId);




ужасно тупо


тут просто баг (u.UserId == ...). а что тут "ужасно тупого"?
В тестовом задании хотелось бы видеть полноценную реализацию GetOne, что на вход принимает Criteria.
И которую при желании легко можно декорировать к примеру кэшом. А то ведь не видно особого толка от интерфейсов и инъекций.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478039
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда класс будет удовлетворять принципу открытости/закрытости.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478054
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А реализация клиентских транзакций через IInterceptionBehavior меня вообще удивила.

Сразу встаёт вопрос: Вы разве не знаете, что и EF, и NHibernate реализуют шаблон Unit of Work?
Ну и открывать транзакцию в рамках текущего соединения перед вызовом каждого метода и завершать сразу же после выполнения метода...
А завтра понадобится три метода вызывать в рамках одной транзакции, что будете делать?

Вообщем сложилось впечатление, что Вы попытались в решение запихать всё, о чём слышали, но толком не использовали: и паттерны, и АОП, и рефлексию.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478095
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskА что Вы понимаете под "обычные транспортные классы для ORM"?

Классы, удовлетворяющие условиям ORM, для того чтобы вытаскивать данные из таблиц в объекты классов (на что намекает аббревиатура ORM), и отслеживать изменения для формирования INSERT/UPDATE при вызове SaveChanges. Если говорить о домене, то это уже из области DDD, требованиям которого entity-классы EF и NH не удовлетворяют, так как эти классы должны обладать конструкторами без параметров, что приводит к разлому инкапсуляции.


test_taskв каком месте?

В каком месте почитать? Репозиторий объектов типа А должен работать только с объектами типа А, а не А, АDto, АHZChto...
...
Рейтинг: 0 / 0
Тестовое задание
    #39478096
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВообщем сложилось впечатление, что Вы попытались в решение запихать всё, о чём слышали, но толком не использовали: и паттерны, и АОП, и рефлексию.

Больше похоже на не удачное копирование какого-то другого проекта.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478121
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt Репозиторий объектов типа А должен работать только с объектами типа А, а не А, АDto, АHZChto...То есть если, например, репозиторий А должен произвести операцию не только с объектом А, но и со связанными с ним объектами B и С, то эти манипуляции все равно нужно выносить в соответсвующие репозитории? Даже если эти манипуляции в отрыве от операции А вообще не применяются?
...
Рейтинг: 0 / 0
Тестовое задание
    #39478150
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА завтра понадобится три метода вызывать в рамках одной транзакции, что будете делать?

test_task
вот, кстати, раз уж используете NHibernate - если при этом использовать Castle Windsor, то там есть уже готовая NHibernateFacility и AutoTx - вешаешь атрибут транзакции на публичный метод класса - и вперед, поддерживает вложенные транзакции и вложенные методы
...
Рейтинг: 0 / 0
Тестовое задание
    #39478155
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyhVostt Репозиторий объектов типа А должен работать только с объектами типа А, а не А, АDto, АHZChto...То есть если, например, репозиторий А должен произвести операцию не только с объектом А, но и со связанными с ним объектами B и С, то эти манипуляции все равно нужно выносить в соответсвующие репозитории? Даже если эти манипуляции в отрыве от операции А вообще не применяются?
а что за манипуляции вы имеете ввиду?
например у вас DDD, есть Entity, у нее Value Object, то репозиторий должен работать только с Entity, будет IRepository<TEntity>
и вот там внутри он будет раскладывать это допустим по двум таблицам в БД
...
Рейтинг: 0 / 0
Тестовое задание
    #39478159
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а насчет классов DDD и ORM - я как-то видел в одном проекте решение - классы DDD с логикой очень хитрыми и сложными маппингами гибернейта раскладывались в таблицы, без промежуточных, приближенных к таблицам классов ORM
...
Рейтинг: 0 / 0
Тестовое задание
    #39478172
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyhVostt Репозиторий объектов типа А должен работать только с объектами типа А, а не А, АDto, АHZChto...То есть если, например, репозиторий А должен произвести операцию не только с объектом А, но и со связанными с ним объектами B и С, то эти манипуляции все равно нужно выносить в соответсвующие репозитории? Даже если эти манипуляции в отрыве от операции А вообще не применяются?
Связанные каким образом? Агрегация, ассоциация?
...
Рейтинг: 0 / 0
Тестовое задание
    #39478177
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77skyANAА завтра понадобится три метода вызывать в рамках одной транзакции, что будете делать?

test_task
вот, кстати, раз уж используете NHibernate - если при этом использовать Castle Windsor, то там есть уже готовая NHibernateFacility и AutoTx - вешаешь атрибут транзакции на публичный метод класса - и вперед, поддерживает вложенные транзакции и вложенные методы
В задании требуется EF.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478251
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТо есть если, например, репозиторий А должен произвести операцию не только с объектом А, но и со связанными с ним объектами B и С, то эти манипуляции все равно нужно выносить в соответсвующие репозитории? Даже если эти манипуляции в отрыве от операции А вообще не применяются?

Я имел в виду: Product, ProductDto, ProductDto2... Это не задача репозитория, обрабатывать какие-то там DTO. Если в СУБД хранится сущность, представленная entity-классом Product, то репозиторий должен работать только с ним, а с ворохом доп. классов, существующих для поддержки клиента.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478257
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77а насчет классов DDD и ORM - я как-то видел в одном проекте решение - классы DDD с логикой очень хитрыми и сложными маппингами гибернейта раскладывались в таблицы, без промежуточных, приближенных к таблицам классов ORM

Видел такое использование. Это возможно, но не айс. Поддерживать очень тяжело. Не предназначен он для такого, просто коммьюните усиленно просит, они приделываеют костыль за костылём.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478261
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
test_taskв каком месте?

В каком месте почитать? Репозиторий объектов типа А должен работать только с объектами типа А , а не А, АDto, АHZChto...

я про в каком месте в моем решении это не так
...
Рейтинг: 0 / 0
Тестовое задание
    #39478287
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77вот, кстати, раз уж используете NHibernate - если при этом использовать Castle Windsor, то там есть уже готовая NHibernateFacility и AutoTx - вешаешь атрибут транзакции на публичный метод класса - и вперед, поддерживает вложенные транзакции и вложенные методы

to 17-77 мотивация такая: и EF, и NH умеет работать с "родным" TransactionScope. Каждый раз писать

Код: c#
1.
2.
3.
4.
5.
using (TransactionScope transaction = new TransactionScope())
{
   ///transaction method code
   transaction.Complete();
}



выглядит копипастом. Поэтому чз атрибут.

to skyANA насчет реализованного в EF и NH UofW: он используется чз

Код: c#
1.
2.
3.
4.
public interface IRepository
{
     void SaveChanges();
}



Или надо было явно создать класс MyUofW? такое решение мне не видится лучше/хуже, больше вкусовщина.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478288
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

по тестам - основная функция - это создание транзакции, я бы сделал так:

примерный набор юнит тестов:
1. обычная отправка без ошибок
2. отправка с неверным ид получателя
3. отправка нулевой, отрицательной сумм
4. отправка суммы большей, чем есть у отправителя на счету
причем тестировать надо класс(ы) с чистой бизнес логикой - на входе дто, на выходе другое дто или ентити, т.е. мока на слой доступа к данным не должно быть - тут надо подумать как написать такой код

интеграционный тест (веб-апи -> БД):
1. отправка кривых данных в веб-апи в метод создания транзакции - все должно корректно перехватываться, не допускать sql инъекций, возвращать коды ошибок (хотя тут еще надо подумать - это можно разбить на юнит тесты)
2. имитация ошибки таймаута/отсутствия сети на различных этапах создания транзакции - все должно откатываться корректно и деньги не должны теряться

нагрузочный тест (веб-апи -> БД):
1. натравить 10-100-1000-... запросов на ваш веб-апи метод и посмотреть когда упадет
...
Рейтинг: 0 / 0
Тестовое задание
    #39478292
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77test_task,

по тестам - основная функция - это создание транзакции, я бы сделал так:

примерный набор юнит тестов:
1. обычная отправка без ошибок
2. отправка с неверным ид получателя
3. отправка нулевой, отрицательной сумм
4. отправка суммы большей, чем есть у отправителя на счету
причем тестировать надо класс(ы) с чистой бизнес логикой - на входе дто, на выходе другое дто или ентити, т.е. мока на слой доступа к данным не должно быть - тут надо подумать как написать такой код

интеграционный тест (веб-апи -> БД):
1. отправка кривых данных в веб-апи в метод создания транзакции - все должно корректно перехватываться, не допускать sql инъекций, возвращать коды ошибок (хотя тут еще надо подумать - это можно разбить на юнит тесты)
2. имитация ошибки таймаута/отсутствия сети на различных этапах создания транзакции - все должно откатываться корректно и деньги не должны теряться

нагрузочный тест (веб-апи -> БД):
1. натравить 10-100-1000-... запросов на ваш веб-апи метод и посмотреть когда упадет

спасибо за совет я бы тоже так сделал
...
Рейтинг: 0 / 0
Тестовое задание
    #39478298
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task to 17-77 мотивация такая: и EF, и NH умеет работать с "родным" TransactionScope. Каждый раз писать

Код: c#
1.
2.
3.
4.
5.
using (TransactionScope transaction = new TransactionScope())
{
   ///transaction method code
   transaction.Complete();
}



выглядит копипастом. Поэтому чз атрибут.

да, это я понял, я к тому, что в Castle есть уже готовая штука для Nhibernate, как раз атрибутом, и поддерживает вложенные транзакции и вложенные методы. можно поискать аналогичные библиотеки для Unity/EF
...
Рейтинг: 0 / 0
Тестовое задание
    #39478337
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПодготовился - это не что-то там "почитал", а ознакомился с профилем компании, требованиями, прикинул примерный круг задач, что будут спрашивать.
Выписал себе на листочек, что хотел бы узнать, спросить, уточнить на собеседовании.
По тем же преславутым юнит-тестам нет единого мнения не то что в разных, часто оно расходится у проводящих собеседование, если их больше чем один.

skyANAА то спрашиваешь: Вы заходили на наш сайт, понимаете чем мы занимаемся, какой у нас продукт?
В ответ что-то там мычат. И встаёт вопрос, а человек вообще хочет именно у нас работать, или ему по фигу где, с кем и над чем он будет трудиться?
Всяк кулик хвалит свое болото. Нафига мне вникать в ваш сайт, если почти все проекты "инновационные и неповторимые", а суть, в плане применяемых технологий, близнецы-братья. Даже хвалебные тексты маркетинг копирует с других хвалебных текстов скоммунизженных в сети.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478349
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task
to 17-77 мотивация такая: и EF, и NH умеет работать с "родным" TransactionScope. Каждый раз писать

Код: c#
1.
2.
3.
4.
5.
using (TransactionScope transaction = new TransactionScope())
{
   ///transaction method code
   transaction.Complete();
}



выглядит копипастом. Поэтому чз атрибут.


Такие штуки можно прятать так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public static void TranAction(Action act)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                act();
                transaction.Complete();
            }
        }
TranAction(() => {/*что то сохраняем*/ });


Можно впихнуть еще например логгирование и обработку ошибок.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478435
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskя про в каком месте в моем решении это не так

После коммита 26 числа, вижу, что уже по этому вопросу всё так
...
Рейтинг: 0 / 0
Тестовое задание
    #39478437
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВПо тем же преславутым юнит-тестам нет единого мнения не то что в разных, часто оно расходится у проводящих собеседование, если их больше чем один.

Что именно расходится? Использовать или не использовать? 100% покрытие, или пофигу? От уровня профессионализма, с которым работает компания, это зависит.


ЕвгенийВВсяк кулик хвалит свое болото. Нафига мне вникать в ваш сайт, если почти все проекты "инновационные и неповторимые", а суть, в плане применяемых технологий, близнецы-братья. Даже хвалебные тексты маркетинг копирует с других хвалебных текстов скоммунизженных в сети.

Если ты не вникал, значит и соискание у тебя соответствующее. На отъ..сь. Либо ты настолько крутой и уникальный, что тебе везде рады. Либо лень. Либо самомнение.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478482
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANAПодготовился - это не что-то там "почитал", а ознакомился с профилем компании, требованиями, прикинул примерный круг задач, что будут спрашивать.
Выписал себе на листочек, что хотел бы узнать, спросить, уточнить на собеседовании.
По тем же преславутым юнит-тестам нет единого мнения не то что в разных, часто оно расходится у проводящих собеседование, если их больше чем один.
К чему это сказано? Закончите мысль, если не трудно.

ЕвгенийВskyANAА то спрашиваешь: Вы заходили на наш сайт, понимаете чем мы занимаемся, какой у нас продукт?
В ответ что-то там мычат. И встаёт вопрос, а человек вообще хочет именно у нас работать, или ему по фигу где, с кем и над чем он будет трудиться?
Всяк кулик хвалит свое болото. Нафига мне вникать в ваш сайт, если почти все проекты "инновационные и неповторимые", а суть, в плане применяемых технологий, близнецы-братья. Даже хвалебные тексты маркетинг копирует с других хвалебных текстов скоммунизженных в сети.
То есть вариант "по фигу где, с кем и над чем он будет трудиться", хорошо. Ставится отметка "минус" в листочке :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39478651
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТо есть вариант "по фигу где, с кем и над чем он будет трудиться", хорошо. Ставится отметка "минус" в листочке :)
Работодатель всегда хочет, что-бы работника в первою очередь интересовала сама работа, но
по статистике (не помню где видел) основная причина смены работы это зп :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39478725
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAtest_taskпропущено...


тут просто баг (u.UserId == ...). а что тут "ужасно тупого"?
В тестовом задании хотелось бы видеть полноценную реализацию GetOne, что на вход принимает Criteria .


имеется в виду что-то такое?
Код: c#
1.
Account account = accountRepository.Get(a => a.UserId == userId);
...
Рейтинг: 0 / 0
Тестовое задание
    #39478728
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskимеется в виду что-то такое?
Код: c#
1.
Account account = accountRepository.Get(a => a.UserId == userId);



Не. Что-то такое:

Код: c#
1.
var account = accountRepository.Get(new AccountByUserSpecification(userId));
...
Рейтинг: 0 / 0
Тестовое задание
    #39478729
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИ которую при желании легко можно декорировать к примеру кэшом . А то ведь не видно особого толка от интерфейсов и инъекций.

декорировать кэшом репозиторий? или что Вы имеете в виду? разве, при необходимости в кэшэ, не правильнее будет инъектировать кэш в нуждающийся в нём сервис?
...
Рейтинг: 0 / 0
Тестовое задание
    #39478730
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskне правильнее будет инъектировать кэш в нуждающийся в нём сервис?

И как ты это сделаешь, если сервис дёргает репозиторий? Про это и речь. Тогда нет смысла в интерфейсах.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478733
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskне правильнее будет инъектировать кэш в нуждающийся в нём сервис?

И как ты это сделаешь, если сервис дёргает репозиторий? Про это и речь. Тогда нет смысла в интерфейсах.

я правильно понял, что тут намекается на решение типа:

1. отнаследоваться от репозитория, который нуждается в кэшировании
2. инъектировать кэш в наследника (который уже не совсем "репозиторий")
3. при настройке IoC привязать к нужному интерфейсу реализацию нового "кэширующего репозитория"

???
...
Рейтинг: 0 / 0
Тестовое задание
    #39478735
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Совсем не обязательно наследоваться. Речь идёт о шаблоне Декоратор .
...
Рейтинг: 0 / 0
Тестовое задание
    #39478736
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Вот здесь ещё почитай: http://andrey.moveax.ru/post/patterns-oop-structural-decorator

там интересней. Ещё можешь книженцию Сергея Теплякова почитать, там тоже доходчиво и актуально.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478748
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskимеется в виду что-то такое?
Код: c#
1.
Account account = accountRepository.Get(a => a.UserId == userId);



Не. Что-то такое:

Код: c#
1.
var account = accountRepository.Get(new AccountByUserSpecification(userId));

а почему не Get(userId), а new AccountByUserSpecification не спрятать в Get?

AccountByUserSpecification вообще какой-то мутный класс, чье название больше подходит для функции. нафига под каждый способ выборки (ByUserName, ByUserPenisSize) класс городить? GetBy1способ, GetBy2способ по-моему логичнее.
...
Рейтинг: 0 / 0
Тестовое задание
    #39478857
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyа почему не Get(userId), а new AccountByUserSpecification не спрятать в Get?

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


AntonariyAccountByUserSpecification вообще какой-то мутный класс, чье название больше подходит для функции. нафига под каждый способ выборки (ByUserName, ByUserPenisSize) класс городить? GetBy1способ, GetBy2способ по-моему логичнее.

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

GetBy1, GetBy2 — особенность разработки новичков и нубов
...
Рейтинг: 0 / 0
Тестовое задание
    #39479200
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внес некоторые правки, добавил кэширование настроек
https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39479271
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt Чтобы выполнялся принцип открыт-закрыт. Спецификаций может быть сколько угодно, и для этого не требуется трогать интерфейс репозитория.Соответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

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

hVostt GetBy1, GetBy2 — особенность разработки новичков и нубовНовичок и нуб это одно и то же :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39479280
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyСоответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.


AntonariyНе понял. "Мой репозиторий" это то, каким его представил я или каким он должен быть по твоим выкладкам, чтобы "благоприятным образом сказывался"?

Ну да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?


AntonariyНовичок и нуб это одно и то же :)

Неа. Новичёк это чувак с полным отсутствием опыта. Нуб это чувак, которого опыт ничему не учит и он продолжает оставаться на уровне новичка :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39479306
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyСоответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.


AntonariyНе понял. "Мой репозиторий" это то, каким его представил я или каким он должен быть по твоим выкладкам, чтобы "благоприятным образом сказывался"?

Ну да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?


AntonariyНовичок и нуб это одно и то же :)

Неа. Новичёк это чувак с полным отсутствием опыта. Нуб это чувак, которого опыт ничему не учит и он продолжает оставаться на уровне новичка :)

to hVostt
Код: c#
1.
Expression<Func<T, bool>> predicate



а чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить
...
Рейтинг: 0 / 0
Тестовое задание
    #39479307
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVosttпропущено...


Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.


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


Ну да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?


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


Неа. Новичёк это чувак с полным отсутствием опыта. Нуб это чувак, которого опыт ничему не учит и он продолжает оставаться на уровне новичка :)

to hVostt
Код: c#
1.
Expression<Func<T, bool>> predicate



а чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить

так сказать "из каробки"
...
Рейтинг: 0 / 0
Тестовое задание
    #39479330
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskа чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить

Спецификация может получить нужные ей зависимости, а твой Expression не может. Так что не сравнивай одно место с пальцем. Как простейший учебный вариант покатит, но не в бою.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479332
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to hVostt

в дополнение к этому вопрос, с построением predicate для entity/list<entity> все понятно (на самом деле, мне не все понятно, там может подзапрос в "where" идти, типа "Id in ()"):

так что этот шаблон применим штучно, там, где он действительно нужен
...
Рейтинг: 0 / 0
Тестовое задание
    #39479333
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskа чем это не спецификация? тоже можно обернуть чем-то, и цепочки AND/OR строить

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

можно пояснить на примере?
...
Рейтинг: 0 / 0
Тестовое задание
    #39479334
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Ещё лучше это абстракция запрос-обработчик, куда укладываются спецификации (объект-запрос), и прямой путь к разделению на читателя/писателя :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39479335
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Ещё лучше это абстракция запрос-обработчик, куда укладываются спецификации (объект-запрос), и прямой путь к разделению на читателя/писателя :)

не спорю, что есть случаи и их применения. тут это. пока, не надо
...
Рейтинг: 0 / 0
Тестовое задание
    #39479336
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Ещё лучше это абстракция запрос-обработчик, куда укладываются спецификации (объект-запрос), и прямой путь к разделению на читателя/писателя :)

а почему Вас так читатели/писатели интересуют? CQRS? читал об этом, но, не работал с этой архитектурой.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479338
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?Я просто не понял, к какой из реализаций относится фраза "благоприятным образом".
...
Рейтинг: 0 / 0
Тестовое задание
    #39479342
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttс агрегатами доменной модели

можете тут прояснить? у меня с этим опыт только как настроить маппинг NH (там так можно), чтобы "документ и его табличные части все разом сохранились (у них есть тоже зависимые объекты)". про это?
...
Рейтинг: 0 / 0
Тестовое задание
    #39479346
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskа почему Вас так читатели/писатели интересуют? CQRS? читал об этом, но, не работал с этой архитектурой.

В данный момент мы активно используем DDD/CQRS/ES. Поэтому и интересует.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479347
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ просто не понял, к какой из реализаций относится фраза "благоприятным образом".

Разумное следование принципам SOLID, мы говорили об одном из принципов.
...
Рейтинг: 0 / 0
Тестовое задание
    #39479348
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskможете тут прояснить? у меня с этим опыт только как настроить маппинг NH (там так можно), чтобы "документ и его табличные части все разом сохранились (у них есть тоже зависимые объекты)". про это?

С натягом да, про это. В EF/NH корни агрегации можно выделить лишь условно.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480600
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyСоответственно AccountByUserSpecification тоже должен реализовывать какой-нибудь IAccount?

Не, он должен реализовывать что-то типа ISpecification<TEntity>. Где под TEntity подставляется Account, например.
А можешь дать сылку или набросать кратенький пример, раскрывающий смысл этого ISpecification<TEntity>. Хочу переделать под этот паттерн такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public interface IPQList<T>
    {
        AjaxJsonGetResult<Paging<T>> GetPQList(string Selector, int pq_curpage, int pq_rpp, string pq_sort, string pq_filter)
    }

 public AjaxJsonGetResult<Paging<UwsRoles>> GetPQList(string Selector, int pq_curpage, int pq_rpp, string pq_sort, string pq_filter)
        {
            pq_sort = DeSerializeHelper.DeSerializeSort(pq_sort);
            var pqf = DeSerializeHelper.DeSerialize<PQFilter>(pq_filter);
            return new AjaxJsonGetResult<Paging<UwsRoles>>(repo.GetList(HttpContext.GetObjName(), Selector, 
                repo.GetPassportID(HttpContext.GetStateID()), pq_curpage, pq_rpp, pqf, pq_sort));
        }



И еще вопрос, связанный с этим кодом. IPQList<T> зависит не от интерфейсов, а от классов AjaxJsonGetResult и Paging, а это, насколько я понимаю, моветон. Или нет? Если да, то проблема в Paging (на AjaxJsonGetResult можно забить, это временная затычка пока студию не починят ):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public interface IPaging
    {
        int Page { get; }
        int Total { get; }
        bool HasPrevious { get; }
        bool HasNext { get; }
        string Action { get; set; } //маршрут возврата для селектора
        string ID { get; set; } //ID возврата для селектора
        string Entity { get; set; }
        string PrimaryKey { get; set; }
    }

    public class Paging<TEntity> : IPaging
    {
        public int Page { get; private set; }
        public int Total { get; private set; }
        public string Action { get; set; }
        public string ID { get; set; }
        public bool HasPrevious { get => (Page > 1); }
        public bool HasNext { get => (Page < Total); }
        public string Entity { get; set; }
        public string PrimaryKey { get; set; }

        public IReadOnlyList<TEntity> Records { get; set; }

        public Paging(IReadOnlyList<TEntity> rec, int pageNumber, int pageSize, int qty)
        {
            Page = pageNumber;
            Records = rec;
            if (Records == null) Records = new List<TEntity>();
            Total = qty;
            Action = "Index";
        }

    }

Однако сделать зависимость IPQList от IPaging<TEntity> вместо Paging<TEntity> невозможно, поскольку Paging, реализующий IPaging<TEntity> немедленно требует конкретный <Entity>. Paging<TEntity> прекрасно справляется со всеми entity, и городить отдельный Paging для каждого entity совсем не хочется.

Как быть в такой ситуации?
...
Рейтинг: 0 / 0
Тестовое задание
    #39480605
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА можешь дать сылку или набросать кратенький пример, раскрывающий смысл этого ISpecification<TEntity>.
https://en.wikipedia.org/wiki/Specification_pattern
...
Рейтинг: 0 / 0
Тестовое задание
    #39480625
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА можешь дать сылку или набросать кратенький пример, раскрывающий смысл этого ISpecification<TEntity>. Хочу переделать под этот паттерн такой код:

Конкретно особенностей реализации, их довольно много. Большинство из них базируются на Expression внутрях, но не все.

Вот зачётный примерчик http://enterprisecraftsmanship.com/2016/02/08/specification-pattern-c-implementation/


AntonariyИ еще вопрос, связанный с этим кодом. IPQList<T> зависит не от интерфейсов, а от классов AjaxJsonGetResult и Paging, а это, насколько я понимаю, моветон. Или нет? Если да, то проблема в Paging (на AjaxJsonGetResult можно забить, это временная затычка пока студию не починят ):

Ну вот у тебя пример по сути что-то типа Query Object, только неудачный, так как используется сериализация в строку, что выглядит как костыль для возможности работать с веб-приложением. Сериализация/десреиализация это вопрос, решающийся на стыке клиент-сервер, посмотри на ModelBinder к примеру. Не нужно это просовывать внутрь своих сервисов. Ужасно тяжко поддерживать, отлаживать и развивать.

Paging может быть либо одним из комбинируемых спецификаций, либо базовой спецификацией. Результат запроса придётся также обобщить, так как тебе надо ещё общее количество элементов.

Интерфейс IPaging опять же, у тебя решает несколько задач, и вообще по виду призван обслуживать прикладные запросы клиентского кода. Его в сервисах тоже не должно быть, на мой взгляд. Результат запроса по пейджингу: это срез + общее количество элементов. А IPageabe это больше относится к view model, так информация HasNext/HasPrevious и проч. нужна для презентации, в логике она не нужна.


AntonariyОднако сделать зависимость IPQList от IPaging<TEntity> вместо Paging<TEntity> невозможно, поскольку Paging, реализующий IPaging<TEntity> немедленно требует конкретный <Entity>. Paging<TEntity> прекрасно справляется со всеми entity, и городить отдельный Paging для каждого entity совсем не хочется.

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public interface IRepository
{
   TEntity Find<TEntity>(int id);
   IReadOnlyCollection<TEntity> Get(ISpecification<TEntity> specification);
   IPagedReadOnlyCollection<TEntity> GetPaged(ISpecification<TEntity> specification, int page, int pageSize);
   void Add<TEntity>(TEntity entity);
   void Remove<TEntity>(TEntity entity);
}



Для пейджинга отдельный метод.

По моему же глубокому убеждение, методов, возвращающих коллекции репозиторий иметь не должен. Он должен уметь извлечь сущность из хранилища по ID, добавить и удалить. Всё.

Остальное уходит на роль IQuery / IQueryProcessor / IQueryHandler<IQuery> — это намного гибче и не надо ходить по скользкому краю, постоянно матерясь.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480636
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttPaging может быть либо одним из комбинируемых спецификаций, либо базовой спецификацией.

на мой взгляд, Paging, не относится к спецификации
...
Рейтинг: 0 / 0
Тестовое задание
    #39480639
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVosttPaging может быть либо одним из комбинируемых спецификаций, либо базовой спецификацией.

на мой взгляд, Paging, не относится к спецификации

Я предложил ниже вариант, где не относится. Но если обобщить результат запроса, то можно и сделать спецификацией. Не вижу проблем.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480640
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttОстальное уходит на роль IQuery / IQueryProcessor / IQueryHandler<IQuery> — это намного гибче и не надо ходить по скользкому краю, постоянно матерясь.

тут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели
...
Рейтинг: 0 / 0
Тестовое задание
    #39480641
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskhVosttОстальное уходит на роль IQuery / IQueryProcessor / IQueryHandler<IQuery> — это намного гибче и не надо ходить по скользкому краю, постоянно матерясь.

тут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели

в смысле, это его "минус"
...
Рейтинг: 0 / 0
Тестовое задание
    #39480643
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskтут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели

Спецификация не отвечает за генерацию нужного SQL, за это отвечает провайдер. В случае EF, это LINQ провайдер. Поэтому подводить она не может.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480650
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskтут кроме гибкости добавляется еще б о льшая уверенность в том, что ОРМ сгенерит "нужный SQL" (спецификация тут может подводить). но этот шаблон фактически означает написание готовых параметризированных запросов под разные, возможно, схожие цели

Спецификация не отвечает за генерацию нужного SQL, за это отвечает провайдер. В случае EF, это LINQ провайдер. Поэтому подводить она не может.

может даже не работать в зависимости от EF/NH
...
Рейтинг: 0 / 0
Тестовое задание
    #39480652
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskможет даже не работать в зависимости от EF/NH

Конкретные реализации могут работать и с EF и с LINQ, и даже с LINQ со своим провайдером. Но в целом, лучше абстрагироваться, чтобы иметь возможность подключать другие источники данных.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480658
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskможет даже не работать в зависимости от EF/NH

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

я про то, что не все так идеально, как хотелось бы.
вот тут
https://github.com/fiqwenbv/ParrotWings/blob/master/ParrotWings.DataService/AmountTransactionService.cs (46)
можно было бы перенести условие выборки до проекции в DТО. и там использовать спецификацию AccountByUserSpecification. и это работает в EF, проверял (какой там SQL я не смотрел), а в NH падает с "не поддерживается".
...
Рейтинг: 0 / 0
Тестовое задание
    #39480659
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы, hVostt , писали еще про фильтрацию. там еще больше будет различий реализаций EF/NH, особенно в части подзапросов. как вы с этим боретесь?
...
Рейтинг: 0 / 0
Тестовое задание
    #39480696
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskможно было бы перенести условие выборки до проекции в DТО. и там использовать спецификацию AccountByUserSpecification. и это работает в EF, проверял (какой там SQL я не смотрел), а в NH падает с "не поддерживается".

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


test_taskВы, hVostt , писали еще про фильтрацию. там еще больше будет различий реализаций EF/NH, особенно в части подзапросов. как вы с этим боретесь?

Мы решили вопрос по-другому, мы обходимся вообще без подзапросов. Вместо этого у нас плоские проекции данных в SQL и ElasticSearch, благодаря архитектуре CQRS / ES. А репозиторий у нас возвращает объекты только по ID, никаких списков, фильтров и прочего. Это не нужно совсем.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480835
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСериализация/десреиализация это вопрос, решающийся на стыке клиент-серверТак она и решается на стыке. public AjaxJsonGetResult<Paging<UwsRoles>> GetPQList это метод контроллера.

hVosttРепозиторий может выглядеть так:
А он так и выглядит, для Paging отдельный метод: repo.GetList

hVosttИнтерфейс IPaging опять же, у тебя решает несколько задач, и вообще по виду призван обслуживать прикладные запросы клиентского кода. Его в сервисах тоже не должно быть, на мой взгляд. Результат запроса по пейджингу: это срез + общее количество элементов. А IPageabe это больше относится к view model, так информация HasNext/HasPrevious и проч. нужна для презентации, в логике она не нужна.Да, это как-то выпало из внимания.

hVosttПо моему же глубокому убеждение, методов, возвращающих коллекции репозиторий иметь не должен. Он должен уметь извлечь сущность из хранилища по ID, добавить и удалить. Всё.Тогда какой в нем смысл? Все это контекст умеет делать.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480856
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТогда какой в нем смысл?
Прозрачность хранения данных.

Пишешь: дай мне объект по идентификатору, - и тебе возвращается объект. А откуда: из кэша, памяти, сетевой шары, SQL базы, NoSQL базы, стороннего сервиса, - тебе по фигу.
А контекст он прибит к конкретному типу хранилища.
...
Рейтинг: 0 / 0
Тестовое задание
    #39480877
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А репозитарий разве не прибит к конкретному типу хранилища? Или его можно прибивать сразу к нескольким типам хранилищ?
...
Рейтинг: 0 / 0
Тестовое задание
    #39480895
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА репозитарий разве не прибит к конкретному типу хранилища? Или его можно прибивать сразу к нескольким типам хранилищ?
Конкретная реализация прибита. Но обычно же используют DI.
Также можно декорирование считать за "прибивать сразу к нескольким типам хранилищ".

В комбинации получаем, что не трогая код изменили конфигурацию, и данные начали выбираться согласно последней.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481035
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТак она и решается на стыке. public AjaxJsonGetResult<Paging<UwsRoles>> GetPQList это метод контроллера.

Точно, не сразу понял, что это у тебя контроллер.

AntonariyhVosttПо моему же глубокому убеждение, методов, возвращающих коллекции репозиторий иметь не должен. Он должен уметь извлечь сущность из хранилища по ID, добавить и удалить. Всё.Тогда какой в нем смысл? Все это контекст умеет делать.

Сущность тебе нужна, чтобы произвести изменения. А приложению обычно нужны всякие разные срезы данных, с группировкой, подсчётами, фильтрацией + безопасность. Я считаю, это выходит за рамки ответственности репозитория.

С DbCobtext-ом это решается через LINQ-проекции. Это довольно неплохой и эффективный способ получать данные быстро без накладных расходов. Автоматическая генерация SQL с подзапросами опять же. Но здесь есть предел гибкости. Кеширование приделать довольно трудоёмко и сложно (инвалидация), разнести данные по разным хранилищам практически никак.

Масштабируется такое решение совсем плохо. С микросервисной архитектурой такой подход не дружит совсем, в общем информационном пространстве, но с разными ограниченными контекстами.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481155
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?

A уровнем выше тоже нет обертки в GetBy1() ?
Типа в контроллере будет repo.Find(someSpecification) ?
...
Рейтинг: 0 / 0
Тестовое задание
    #39481175
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонhVosttНу да, твой, ты предложил добавить GetBy1, GetBy2, это твоё видение, а не моё. По моим выкладкам я сказал, какому принципу это соответствует. С чем не согласен?

A уровнем выше тоже нет обертки в GetBy1() ?
Типа в контроллере будет repo.Find(someSpecification) ?
Хм, к примеру на контроллер прилетает следующее: "А найди мне проживание в Праге с 1-го по 14-е августа для двух взрослых и ребёнка до 12 лет в таком-то ценовом диапазоне".
И в GetByЧто вы это превратите?
...
Рейтинг: 0 / 0
Тестовое задание
    #39481188
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонA уровнем выше тоже нет обертки в GetBy1() ?
Типа в контроллере будет repo.Find(someSpecification) ?

Это может быть сервис, работающий с конкретными спецификациями. В контроллере дёргаем этот сервис.

Часто, когда программистами создаётся кучу всяких слоёв: репозитории, дата-сервисы, uow, менеджеры, провайдеры и ещё +100500 интерфейсов... Это вообще никак не приводит к тому, чтобы в контроллерах не писалась бизнес-логика. Она всё равно там пишется, а ещё размазывается по классам. Только используя интерфейсы, чтобы.. ну типа связать всё в одно. Подобное легко обнаружить, глядя на конструктор контроллера: видишь там 5-10 зависимостей, сразу понимаешь ниже будет треш
...
Рейтинг: 0 / 0
Тестовое задание
    #39481190
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAХм, к примеру на контроллер прилетает следующее: "А найди мне проживание в Праге с 1-го по 14-е августа для двух взрослых и ребёнка до 12 лет в таком-то ценовом диапазоне".
И в GetByЧто вы это превратите?

А у спецификации не будет названия?
...
Рейтинг: 0 / 0
Тестовое задание
    #39481195
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонskyANAХм, к примеру на контроллер прилетает следующее: "А найди мне проживание в Праге с 1-го по 14-е августа для двух взрослых и ребёнка до 12 лет в таком-то ценовом диапазоне".
И в GetByЧто вы это превратите?

А у спецификации не будет названия?
В какой именно момент?
...
Рейтинг: 0 / 0
Тестовое задание
    #39481202
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПарамонпропущено...


А у спецификации не будет названия?
В какой именно момент?
У вас строго типизированая спецификация или Generic?
Класс, который реализует конкретную спецификацию как назовете?
...
Рейтинг: 0 / 0
Тестовое задание
    #39481217
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонskyANAпропущено...

В какой именно момент?
У вас строго типизированая спецификация или Generic?
Класс, который реализует конкретную спецификацию как назовете?
Класс назову к примеру AccomodationSpecification, а интерфейс, что он реализует ISpecification :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39481228
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПарамонпропущено...

У вас строго типизированая спецификация или Generic?
Класс, который реализует конкретную спецификацию как назовете?
Класс назову к примеру AccomodationSpecification, а интерфейс, что он реализует ISpecification :)

И как такое название намекает на ваши условия? Или передаём Expression прямо из контроллера?
...
Рейтинг: 0 / 0
Тестовое задание
    #39481250
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонskyANAпропущено...

Класс назову к примеру AccomodationSpecification, а интерфейс, что он реализует ISpecification :)

И как такое название намекает на ваши условия? Или передаём Expression прямо из контроллера?
Разверните первый вопрос, не понимаю.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481264
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПарамонпропущено...


И как такое название намекает на ваши условия? Или передаём Expression прямо из контроллера?
Разверните первый вопрос, не понимаю.
Если второй понятен, то первый отпадает :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39481273
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, Expression прямо из контроллера не передаём.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481284
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Он просит показать спецификацию для условия "А найди мне проживание в Праге с 1-го по 14-е августа для двух взрослых и ребёнка до 12 лет в таком-то ценовом диапазоне".

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class AccomodationSpecification : ISpecification
{

   public Guid? CityId {get;set;}
   public DateTime? StartDate {get;set;}
   public DateTime? FinishDate {get;set;}
   public int AdultCount {get;set;}
   public int ChildrenCount {get;set;}
   public decimal? StartPrice {get;set;}
   public decimal? FinishPrice {get;set;}

   // interface specific methods
   
   ...
}



Можно разбить на несколько спецификаций и смешивать их. Или сделать Строителя.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481286
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНет, Expression прямо из контроллера не передаём.
AccomodationSpecification конкретно реализует только те условия, которые были в вашем примере?
Это сложно понять из названия, оно слишком общее.

skyANAИ в GetByЧто вы это превратите?
GetAccomodationHotels()
...
Рейтинг: 0 / 0
Тестовое задание
    #39481287
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонЭто сложно понять из названия, оно слишком общее.

В контексте букинга, сложно придумать другой смысл :)
...
Рейтинг: 0 / 0
Тестовое задание
    #39481288
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонAccomodationSpecification конкретно реализует только те условия, которые были в вашем примере?
AccomodationSpecification внутри себя содержит выражение, которому должны удовлетворять искомые услуги проживания.
Выражение это может состоять из тех условий, что я озвучил, а может и из меньшего количества, а может и из большего.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481290
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПарамонЭто сложно понять из названия, оно слишком общее.

В контексте букинга, сложно придумать другой смысл :)
Ну да. Accomodation - это размещение, или проживание.
Хотя можно и уточнить: HotelAccomodation (размещение в гостинице).
...
Рейтинг: 0 / 0
Тестовое задание
    #39481344
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПарамонЭто сложно понять из названия, оно слишком общее.

В контексте букинга, сложно придумать другой смысл :)
Пытался понять зачем мне искать название методу, который по сути просто поиск по параметрам. :) bookingService.FindHotels(searchModel) как вариант. Но, как понял передают спецификацию на прямую из контроллера.
...
Рейтинг: 0 / 0
Тестовое задание
    #39481352
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парамон,

Твой вариант потребует изменять интерфейс и реализацию сервиса, когда понадобится добавить новое условие. Если условие надо будет изменить или расширить, ты рискуешь сломать вызовы. Спецификации могут находиться в разных сборках и использоваться без изменения или перекомпиляции репозитория. Букинг сервис действительно может выглядеть как ты описал, а он может использовать спецификацию для репозитория.
...
Рейтинг: 0 / 0
Тестовое задание
    #39482818
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросы по спецификации. Такой интерфейс

Код: c#
1.
2.
3.
4.
public interface ISpecification<T> where T : BaseEntity
{
        Expression<Func<T, bool>> IsSatisfied();
}



предполагает, что эта спецификация будет воткнута до

Код: c#
1.
...select new {a, b, c }



а если надо после в виде
Код: c#
1.
q = q.Where(mySpecification.IsSatisfied())



как быть ???
...
Рейтинг: 0 / 0
Тестовое задание
    #39482937
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskкак быть ???

Например, так:

Код: c#
1.
2.
3.
4.
public interface ISpecification<T> where T : BaseEntity
{
        IQueryable<T> Specify(IQueryable<T> source);
}




test_taskа если надо после в виде
Код: c#
1.
q = q.Where(mySpecification.IsSatisfied())



Получится так:

Код: c#
1.
q = mySpecification.Specify(q);



Такая спецификация может не только отфильтровать, но и отсортировать, или сделать подвыбоку.
...
Рейтинг: 0 / 0
Тестовое задание
    #39482946
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_taskкак быть ???

Например, так:

Код: c#
1.
2.
3.
4.
public interface ISpecification<T> where T : BaseEntity
{
        IQueryable<T> Specify(IQueryable<T> source);
}




test_taskа если надо после в виде
Код: c#
1.
q = q.Where(mySpecification.IsSatisfied())



Получится так:

Код: c#
1.
q = mySpecification.Specify(q);



Такая спецификация может не только отфильтровать, но и отсортировать, или сделать подвыбоку.

тут
Код: c#
1.
2.
3.
4.
public interface ISpecification<T> where T : BaseEntity
{
        IQueryable<T> Specify(IQueryable<T> source);
}


имеем ограничение
Код: c#
1.
where T : BaseEntity



а фильтровать надо "по анонимному типу"
Код: c#
1.
new {a, b, c }
...
Рейтинг: 0 / 0
Тестовое задание
    #39483237
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Спецификации изначально не расположены для работы с анонимными типами, по тому факту, что анонимные типы закрыты в том участке кода, где они используются, а дальше только рефлексией, что уже хуже, чем ADO-шные DataTable/DataSet. Убирай анонимные типы и заменяй на DTO-классы. С ними хотя бы протестировать можно твой код и писать обвязку.
...
Рейтинг: 0 / 0
Тестовое задание
    #39483362
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
повносил некоторые изменения
https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39483378
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Код: c#
1.
repository.SaveChanges();



У тебя не поймёшь, сделай нормально SaveChanges() это задача UnitOfWork, а не IRepository, сам посмотри какой бардак: ISettingsRepository settingsRepository, IBaseRepository<Account> accountRepository... и IRepository.

Если бы сервисы не занимались построением запросов, ты бы убрал их, инкапсулировал в IQuery<TResult> (например Query<AccountDTO>), чтобы в сервисах только была логика, стало бы чище и лучше. А сейчас грязно, понамешано всего в кучу, сам попробуй свой код прочитать отстранённо, очень тяжело.
...
Рейтинг: 0 / 0
Тестовое задание
    #39483384
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class AmountTransactionQuery
    {
        public IQueryable<AmountTransactionDTO> Get(IQueryable<AmountTransaction> queryable1,
            IQueryable<Account> queryable2,
            IQueryable<User> queryable3)
        {
            return (from t in queryable1
                    join a in queryable2 on t.AccountId equals a.Id
                    join ac in queryable2 on t.СorrespondentAccountId equals ac.Id
                    join uc in queryable3 on ac.UserId equals uc.Id
                    select new AmountTransactionDTO()
                    {
                        Id = t.Id,
                        DateTransaction = t.DateTransaction,
                        Amount = Math.Round(t.Amount, 2),
                        Balance = t.Balance,
                        CorrespondentAccountUserName = uc.UserName,
                        UserId = a.UserId,
                        СorrespondentAccountId = t.СorrespondentAccountId,
                        СorrespondentAccountUserId = uc.Id
                    });
        }
}



Не особо это улучшает ситуацию, ты возвращаешь живой и ленивый IQueryable от провайдера, потом начинаешь на нём достраивать запрос. Это даже хуже, чем если бы ты сразу всё в сервисе сделал.

Попробуй так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
// нужные интерфейсы

public interface IQuery {}
public interface IQuery<TResult> : IQuery {}
public interface IQueryHandler<TQuery> where TQuery : IQuery
{
   IEnumerable<TResult> Handle(TQuery query);
}
public interface IQueryProcessor
{
   IEnumerable<TResult> Process<TResult>(IQuery<TResult> query);
}

// вот что должно быть в итоге:

public class AmountTransactionService : BaseService, IAmountTransactionService
{
   ...
   public AmountTransactionService(..., IQueryProcessor queryProcessor,...)
   {
       ...
       _queryProcessor = queryProcessor;
       ...
   }
   ...
   public IEnumerable<AccountDTO> GetListCorrespondentAccount(long userId)
        {
            
            //  вместо этой фигни
            //

            AmountTransactionQuery amountTransactionQuery = new AmountTransactionQuery();
            var qb = amountTransactionQuery.Get(amountTransactionRepository.GetList(),
                accountRepository.GetList(),
                userRepository.GetList()).Where(t => t.UserId == userId);

            var q = from t in qb
                    group t by new { t.СorrespondentAccountId, t.CorrespondentAccountUserName, t.UserId } into grp
                    orderby grp.Max(t => t.DateTransaction) descending
                    let maxDateTransaction = grp.Max(t => t.DateTransaction)
                    select new AccountDTO()
                    {
                        Id = grp.Key.СorrespondentAccountId,
                        UserId = grp.Key.UserId,
                        UserName = grp.Key.CorrespondentAccountUserName,
                        MaxDateTransaction = maxDateTransaction
                    };

            return q.ToList();

            // вот так правильно и красиво

            // получаем уже материализованные данные, а не IQueryable
            var result = _queryProcessor(new CorrespondentAccountQuery(userId));
            // делаем чо надо, отдаём результат. всё красиво и понятно, вся логика запроса инкапсулирована
            // внутри соответствующего QueryHandler, он же получает нужные зависимости и там только запрос
            // никакой логики 
            return result;
}
...
Рейтинг: 0 / 0
Тестовое задание
    #39483393
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Код: c#
1.
repository.SaveChanges();



У тебя не поймёшь, сделай нормально SaveChanges() это задача UnitOfWork, а не IRepository, сам посмотри какой бардак: 1. ISettingsRepository settingsRepository, IBaseRepository<Account> accountRepository... и 2. IRepository .

Если бы сервисы не занимались построением запросов, 3. ты бы убрал их, инкапсулировал в IQuery<TResult> (например Query<AccountDTO>), чтобы в сервисах только была логика, стало бы чище и лучше. А сейчас грязно, понамешано всего в кучу, сам попробуй свой код прочитать отстранённо, очень тяжело.
1. Это да, согласен, тут по предложению твоему и skyANA добавил декоратор. сделал так, чтобы проще было с неимплементированными методами
2. Так заканчивается работа UoW - repository.SaveChanges() - дергается из сервисов.
3. А в чем профит? на мой взгляд: не единообразно, IQuery<TResult> уже сервиса, сервис может что-то там добавить, например, какую-то пост обработку
...
Рейтинг: 0 / 0
Тестовое задание
    #39483400
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class AmountTransactionQuery
    {
        public IQueryable<AmountTransactionDTO> Get(IQueryable<AmountTransaction> queryable1,
            IQueryable<Account> queryable2,
            IQueryable<User> queryable3)
        {
            return (from t in queryable1
                    join a in queryable2 on t.AccountId equals a.Id
                    join ac in queryable2 on t.СorrespondentAccountId equals ac.Id
                    join uc in queryable3 on ac.UserId equals uc.Id
                    select new AmountTransactionDTO()
                    {
                        Id = t.Id,
                        DateTransaction = t.DateTransaction,
                        Amount = Math.Round(t.Amount, 2),
                        Balance = t.Balance,
                        CorrespondentAccountUserName = uc.UserName,
                        UserId = a.UserId,
                        СorrespondentAccountId = t.СorrespondentAccountId,
                        СorrespondentAccountUserId = uc.Id
                    });
        }
}



Не особо это улучшает ситуацию, ты возвращаешь живой и ленивый IQueryable от провайдера, потом начинаешь на нём достраивать запрос. Это даже хуже, чем если бы ты сразу всё в сервисе сделал.

Попробуй так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
// нужные интерфейсы

public interface IQuery {}
public interface IQuery<TResult> : IQuery {}
public interface IQueryHandler<TQuery> where TQuery : IQuery
{
   IEnumerable<TResult> Handle(TQuery query);
}
public interface IQueryProcessor
{
   IEnumerable<TResult> Process<TResult>(IQuery<TResult> query);
}

// вот что должно быть в итоге:

public class AmountTransactionService : BaseService, IAmountTransactionService
{
   ...
   public AmountTransactionService(..., IQueryProcessor queryProcessor,...)
   {
       ...
       _queryProcessor = queryProcessor;
       ...
   }
   ...
   public IEnumerable<AccountDTO> GetListCorrespondentAccount(long userId)
        {
            
            //  вместо этой фигни
            //

            AmountTransactionQuery amountTransactionQuery = new AmountTransactionQuery();
            var qb = amountTransactionQuery.Get(amountTransactionRepository.GetList(),
                accountRepository.GetList(),
                userRepository.GetList()).Where(t => t.UserId == userId);

            var q = from t in qb
                    group t by new { t.СorrespondentAccountId, t.CorrespondentAccountUserName, t.UserId } into grp
                    orderby grp.Max(t => t.DateTransaction) descending
                    let maxDateTransaction = grp.Max(t => t.DateTransaction)
                    select new AccountDTO()
                    {
                        Id = grp.Key.СorrespondentAccountId,
                        UserId = grp.Key.UserId,
                        UserName = grp.Key.CorrespondentAccountUserName,
                        MaxDateTransaction = maxDateTransaction
                    };

            return q.ToList();

            // вот так правильно и красиво

            // получаем уже материализованные данные, а не IQueryable
            var result = _queryProcessor(new CorrespondentAccountQuery(userId));
            // делаем чо надо, отдаём результат. всё красиво и понятно, вся логика запроса инкапсулирована
            // внутри соответствующего QueryHandler, он же получает нужные зависимости и там только запрос
            // никакой логики 
            return result;
}



спасибо. подумаю над этим
...
Рейтинг: 0 / 0
Тестовое задание
    #39483401
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task2. Так заканчивается работа UoW - repository.SaveChanges() - дергается из сервисов.

У репозитория нет задачи завершать работу, отслеживать и коммитить изменения. Просто так ты путаешь людей, которые будут работать с твоим кодом, в примере ты должен показать, что заботишься на этот счёт.


test_task3. А в чем профит? на мой взгляд: не единообразно, IQuery<TResult> уже сервиса, сервис может что-то там добавить, например, какую-то пост обработку

Пост-обработку делай. Но там и запросы колбасишь. У тебя всё в куче. Сервис не должен знать о подробностях того, как ты запросы делаешь. LINQ, или SQL собираешь из кусочков, или вообще через веб-сервис данные запрашиваешь. Смешиваешь одно с другим, из-за этого тебе будет крайне тяжело тестировать свой код и сопровождать проблематично.
...
Рейтинг: 0 / 0
Тестовое задание
    #39483413
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСервис не должен знать о подробностях того, как ты запросы делаешь. LINQ, или SQL собираешь из кусочков, или вообще через веб-сервис данные запрашиваешь.

разве это выполнимо? при использовании поддерживающих LINQ ОРМ - еще куда не шло (тот же NH при ICriteria - уже выбывает из фэншуя, вернее там свой фэншуй). но если RAW SQL - там "своя атмосфэра", про внешние веб-сервисы тоже самое.

я про то, что абстракции дырявые. для меня пока интересно чтобы работало для EF и NH
...
Рейтинг: 0 / 0
Тестовое задание
    #39483415
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_taskразве это выполнимо?

Что выполнимо? У тебя некий чёрный ящик, ты отдаёшь в него параметры запроса, получаешь результат. Как это произошло не важно. Может там использовались ICriteria для NH, или LINQ для EF, или SQL, или ещё что-то. Своя атмосфера, ок. Нам знать этого не надо. Нам нужны данные.


test_taskя про то, что абстракции дырявые. для меня пока интересно чтобы работало для EF и NH

ИМХО не вижу смысла тратить время на NH, хотя на удивление там 4-ую версию пилят.
Нафига, непонятно :)

Что до абстракций, ну надо знать меру. Надо понимать, зачем ты абстрагируешься. Что тебе это даёт. Когда ты в сервис запихал и логику и выполнение запросов, через LINQ-абстракцию, вот у тебя и она и потекла. А что, если нужно сделать запрос, не реализуемый на LINQ? Например, CTE? На самом деле CTE можно сделать через вью, но это костыль. Напрямую нельзя. Придётся втыкать какие-то распорки.
...
Рейтинг: 0 / 0
Тестовое задание
    #39483423
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttУ тебя некий чёрный ящик, ты отдаёшь в него параметры запроса, получаешь результат. Как это произошло не важно. Может там использовались ICriteria для NH, или LINQ для EF, или SQL, или ещё что-то. Своя атмосфера, ок. Нам знать этого не надо. Нам нужны данные.

для меня это проблема, может, и надуманная (я же не могу в сервисах использовать ICriteria, это прибиваться к реализации ОРМ). корень - фильтрация, проекции..., это же обязанность бизнес уровня, вроде. если не так, не получится никаких спецификаций, проекций, агрегаций. да и репозиторий теряет свою значимость.

или я чего-то не знаю...
...
Рейтинг: 0 / 0
Тестовое задание
    #39483441
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Фильтры реализуются спецификациями. По сути те же яйца как ICriteria, только чуть более высокоуровневые, они для NH могут конвертится в ICriteria, а для EF в LINQ и т.д. Но это если ты хочешь получить объекты ORM (сущности).

Запрос с параметрами и динамические фильтры -- это не одно и то же. Одним из параметров запроса может быть фильтр.

У тебя из-за этого и протекает в сервисы какой-нибудь LINQ, а если бы не LINQ, то ошмётки ICriteria. В общем, ORM тебе только мешает в данном случае :) Если не сможешь просто разделить понятия.
...
Рейтинг: 0 / 0
Тестовое задание
    #39483519
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttest_task,

Спецификации изначально не расположены для работы с анонимными типами, по тому факту, что анонимные типы закрыты в том участке кода, где они используются, а дальше только рефлексией, что уже хуже, чем ADO-шные DataTable/DataSet. Убирай анонимные типы и заменяй на DTO-классы. С ними хотя бы протестировать можно твой код и писать обвязку.
с чего эт гости понаехали? Какая такая рефлексия?
...
Рейтинг: 0 / 0
Тестовое задание
    #39483533
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВс чего эт гости понаехали? Какая такая рефлексия?

А что ты будешь делать с объектом, не зная его типа?

return IEnumerable<anonymous type>

дальше что по твоему? без рефлексии?
...
Рейтинг: 0 / 0
Тестовое задание
    #39483606
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому вернуть и как использовать?
hVostt
return IEnumerable<anonymous type>
...
Рейтинг: 0 / 0
Тестовое задание
    #39483659
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВКому вернуть и как использовать?
hVosttreturn IEnumerable<anonymous type>


Я хз, с чем ты не согласен, и что ты хочешь узнать. Вернуть тому, кому нужно, использовать так, как хочется использовать. В чём проблема? По существу будет?
...
Рейтинг: 0 / 0
Тестовое задание
    #39484124
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реализовал, согласно рекомендациям hVostt, Query object
https://github.com/fiqwenbv/ParrotWings
...
Рейтинг: 0 / 0
Тестовое задание
    #39484129
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_task,

Стало намного лучше
...
Рейтинг: 0 / 0
Тестовое задание
    #39484317
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Если есть
Код: c#
1.
return IQueryable<что то там>

, то это так же хорошо, как например что
Код: c#
1.
Queryable.FirstOrDefault


может принимать в качестве аргумента
Код: c#
1.
Expression<Func<TSource,&#8194;bool>> predicate


Написанный фик знает кем.

На крайняк есть картежи.
...
Рейтинг: 0 / 0
Тестовое задание
    #39484320
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

С анонимным типом ты за рамки метода не выйдешь, значит тебе придётся сосредоточить всю логику и запрос внутри. И получится каша. Чем тут помогут кортежи? Кортежи придётся строго типизировать в контрактах, это не лучше, чем отдельный класс.
...
Рейтинг: 0 / 0
Тестовое задание
    #39484609
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВ,

С анонимным типом ты за рамки метода не выйдешь, значит тебе придётся сосредоточить всю логику и запрос внутри.
Смотря чего хочешь.
Если нужно просто получить данные и прибиндить их к UI, то почему бы и нет?
...
Рейтинг: 0 / 0
Тестовое задание
    #39484819
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я про анонимный тип в проекции, если честно, задал риторический вопрос - типа "дальше еще хуже". IQuery - это мощь. как я раньше не обращал на него внимание. и отношение к репозиторию сильно поменял
...
Рейтинг: 0 / 0
Тестовое задание
    #39484832
test_task
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, я у Вас несколько мастер-классов бы взял, если Вы не против (за деньги). мне не хватает общения с опытными разрабами.
...
Рейтинг: 0 / 0
153 сообщений из 153, показаны все 7 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Тестовое задание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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