tag:blogger.com,1999:blog-458002489272917533.post3372076001260544298..comments2024-02-14T14:07:38.890+05:00Comments on Блог Александра Бындю: Command and Query Responsibility Segregation (CQRS) на практикеAlexander Byndyuhttp://www.blogger.com/profile/14185486842573956085noreply@blogger.comBlogger28125tag:blogger.com,1999:blog-458002489272917533.post-63257432378699100342015-07-20T13:29:14.610+05:002015-07-20T13:29:14.610+05:00Добрый день. У меня вопрос, если мне нужно выбрать...Добрый день. У меня вопрос, если мне нужно выбрать из БД записи и заинклудить какую-либо таблицу, мне нужно писать один query, есть такие запросы, в которых не нужно будет инклудить таблицу, что бы скорость выборки была выше. Как в данном случае поступать? Писать два разлтчных query? Спасибо.Ihar Peshkanoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-46506547696579195182015-05-13T01:57:50.378+05:002015-05-13T01:57:50.378+05:00Как решить проблему, если у меня команду и запросы...Как решить проблему, если у меня команду и запросы используются одновременно в MVC, Web Api и SignalR?Ihar Peshkanoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-66570778352866205872015-03-25T14:21:53.626+05:002015-03-25T14:21:53.626+05:00Спасибо за обмен!вечерние коктейльные платьяСпасибо за обмен!<a title="вечерние коктейльные платья" href="http://www.fulldress.ru/%D0%B2%D0%B5%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BA%D1%82%D0%B5%D0%B9%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%BB%D0%B0%D1%82%D1%8C%D1%8F-c-120_122" rel="nofollow">вечерние коктейльные платья</a>baby sunoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-48513054635822221092014-09-17T16:43:41.627+06:002014-09-17T16:43:41.627+06:00В этом случае OrderListener будет менять состояние...В этом случае OrderListener будет менять состояние класса в той последовательности, в которой лежат сообщения в очереди. В чем здесь может быть проблема?Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-40443374443572801122014-09-07T22:08:21.270+06:002014-09-07T22:08:21.270+06:00К примеру, мы используем tpl dataflow у нас есть д...К примеру, мы используем tpl dataflow у нас есть два блока первый<br />блок OrderPublisher и второй<br />блок OrderLitener. OrderPublisher бубликует<br />асинхронно в очередь событие о том, что изменился ордер, а в этой очереди к<br />примеру, уже скопилось 1000 событий сответвенно когда OrderLitener доберётся до события о том<br />что ордер изменился ордер уже может снова изменится.Сергей Лукьяновnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-77334961256536529542014-09-07T13:08:16.500+06:002014-09-07T13:08:16.500+06:00Сергей, не совсем понятна цепочка. Вы отсылаете со...Сергей, не совсем понятна цепочка. Вы отсылаете событие в очередь, очередь разбирается последовательно. Как может измениться состояние класса? Приведите, пожалуйста, пример.Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-64671341277508233932014-08-30T01:38:48.235+06:002014-08-30T01:38:48.235+06:00Александр, а как быть в ситуации, когда у нас в ev...Александр, а как быть в ситуации, когда у нас в even’те составной ссылочный объект. К примеру, у меня есть класс Order я упаковываю его в OrderChangeEvent и кладу в очередь. Соответственно, когда разбираю очередь в обработчике то состояние класса может снова изменится, а я ещё не успел обработать первое изменение. Как быть в такой ситуации?Valentin Miroshnichenkonoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-54851820886429356192014-08-27T12:02:32.217+06:002014-08-27T12:02:32.217+06:00Александр, вот именно это я и имел ввиду, когда на...Александр, вот именно это я и имел ввиду, когда написал "можно еще вернуть параметр через поле в контексте, но это уже на любителя"Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-49922555218959180212014-08-27T10:26:23.919+06:002014-08-27T10:26:23.919+06:00Александр, если мы говорим про асинхронную обработ...Александр, если мы говорим про асинхронную обработку команд, то это чуть ли не единственный способ. Если обработка происходит синхронно, то, как я писал в статье, не обязательно ортодоксально придерживаться принципа CQRS, можно и вернуть какой-то параметр. Можно еще вернуть параметр через поле в контексте, но это уже на любителя.Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-23329747761022770452014-08-22T10:56:15.050+06:002014-08-22T10:56:15.050+06:00Vasya, хочу еще раз обратить внимание, что из БД в...Vasya, хочу еще раз обратить внимание, что из БД вычитывать ничего не надо.<br /><br />Вот кейс с БД:<br />1. Два сервиса А и Б<br />2. Сервис А обрабатывает данные, кладет результаты в БД<br />3. Сервис Б берет данные из БД<br /><br />В пп. 2 и 3 мы делаем 2 лишних запроса к БД. Если сервисов много, у каждого сервиса запущено много экземпляров и все они работют с SharedDB, то БД становится узкимAlexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-31492274437287994962014-08-21T21:41:03.835+06:002014-08-21T21:41:03.835+06:00>Например, 10 сервисов анализа текста не справл...>Например, 10 сервисов анализа текста не справляются с нагрузкой, что делать? Создать еще 10 копий этих сервисов и пусть очередь раздает им задачи. Мы ускорили обработку текстов в 2 раза. Просто ведь?<br />Просто, да. И в случае взаимодействия через БД все сервисы также будут вычитывать данные из БД и также легко масштабироваться. Т.е. я всё ещё не вижу преимуществ, хотя честно стараюсь их Vasyanoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-53810740019354584852014-08-19T11:09:02.710+06:002014-08-19T11:09:02.710+06:00Максим, да, спасибо. В разных проектах по-разному ...Максим, да, спасибо. В разных проектах по-разному было :)Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-43839737895884182192014-08-18T21:12:15.427+06:002014-08-18T21:12:15.427+06:00Александр, видимо опечатка:
В интерфейсе объявлен...Александр, видимо опечатка:<br /><br />В интерфейсе объявлен метод Handle(T command)<br /><br />>public interface ICommandHandler where T : ICommand<br />{<br /> void Handle(T command);<br />}<br /><br />А в реализации метод Execute(EditUser context):<br /><br />public class EditUserCommandHandler : ICommandHandler<br />{<br /> public void Execute(EditUser context)<br /> {<br />Maximnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-1906939793591087042014-08-01T07:39:46.473+06:002014-08-01T07:39:46.473+06:00Привет!
Отличная статья. Пару вопросов по теме - ...Привет!<br /><br />Отличная статья. Пару вопросов по теме - <br /><br />С Domain Model работают только команды? Что тогда возвращают Queries?<br /><br />Я правильно понимаю, что вместо прослойки, которую принято называть "бизнес-логикой" вы также делаете набор запросов/команд? Если да, то отделяется ли оно от запросов и команд, которые непосредственно работают с хранилищем? Как вообще кSergey Zwezdinhttp://zwezdin.com/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-62898868369440954772014-07-26T14:49:20.246+06:002014-07-26T14:49:20.246+06:00Дмитрий, это одна из стандартных тем Visio 2013Дмитрий, это одна из стандартных тем Visio 2013Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-84880938248467860332014-07-26T02:36:47.040+06:002014-07-26T02:36:47.040+06:00Александр, заранее прошу прощение за вопрос вне ос...Александр, заранее прошу прощение за вопрос вне основного контекста статьи. Большинство диаграм в последних статьях выполнены в одном стиле. И я бы хотел знать где они нарисованы. Если это Visio, то что за шаблон был использован? Стиль диаграм мне понравился и я хотел бы и его взять на вооружение.Dmitry Faleleevnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-59021604430194980962014-07-21T22:50:17.678+06:002014-07-21T22:50:17.678+06:00А я купил на amazon.com :)А я купил на amazon.com :)Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-29401885266656173142014-07-21T22:10:50.846+06:002014-07-21T22:10:50.846+06:00А может кто-то кинет по доброте душевной ссылку н...А может кто-то кинет по доброте душевной ссылку на книгу Vaughn Vernon в оригинале? Устал искать..., а денех жалко... :)Oleg Karpovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-29983486370883872162014-07-21T15:09:42.864+06:002014-07-21T15:09:42.864+06:00Ну, в общем да, есть ограничения. Везде надо думат...Ну, в общем да, есть ограничения. Везде надо думать надо ли оно на самом деле. :)Oleg Karpovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-61168953867149833862014-07-21T15:06:40.324+06:002014-07-21T15:06:40.324+06:00Олег, отличный пример ограничения в применении. Ка...Олег, отличный пример ограничения в применении. Как я и хотел показать CQRS не серебрянная пуля, а прием для решения конкретных проблем.<br /><br /><br />Хотя если покрутить твой пример, но возможность передачи контекста можно добиться. Например, создавать контекст на OnRequest в веб-приложении. Правда вся красота применения CQRS пропадает.Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-35933817578377778432014-07-21T13:36:44.079+06:002014-07-21T13:36:44.079+06:00Если они на столько простые и никогда не разрастаю...Если они на столько простые и никогда не разрастаются, то всё ок.Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-49046985939649615822014-07-21T13:35:46.193+06:002014-07-21T13:35:46.193+06:00Ссылку изучу, Саша, спасибо.Ссылку изучу, Саша, спасибо.Oleg Karpovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-16259998363742345422014-07-21T13:33:20.495+06:002014-07-21T13:33:20.495+06:00а какой смысл их мокать? мокают контекст. Там толь...а какой смысл их мокать? мокают контекст. Там только linq выражения и то, что продиктовано контрактом IQuerable. Да, статические методы для конкретного контракта, все нормально. В инжектировании тоже нет смысла, они инкапсулируют запрос.Oleg Karpovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-82718135092366082062014-07-21T11:56:05.582+06:002014-07-21T11:56:05.582+06:00Евгений, в видео я рассказывал об этом. Суть в том...Евгений, в видео я рассказывал об этом. Суть в том, что данные не сразу попадают в хранилище для чтения. Значит мы не можем сразу их выбрать. Если вы делаете админку и используете "отложенную" отправку данных на чтение, то пользователю нужно как-то об этом сказать.<br /><br /><br />Классический пример, когда пользователь заказывает столик. Он нажимает заказать, формируется Event, Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-85569180579237763532014-07-21T11:50:08.885+06:002014-07-21T11:50:08.885+06:00Как и любое другое решение, extension methods впол...Как и любое другое решение, extension methods вполне рабочее. Но надо понимать их недостатки:<br />- это статические методы<br />- без возможности инжектирования<br />- без возможности мОканияAlexander Byndyuhttp://www.byndyu.ru/noreply@blogger.com