powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / cqrs в каком направление
21 сообщений из 21, страница 1 из 1
cqrs в каком направление
    #39454838
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем делаю для себя демо с помощью cqrs + инжектирование. Столкнулся с не понимаем с моей стороны куда идти. Допустим вот так выглядел бы контролер с инжектированием каждой команды( аналогично с query)
Код: 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.
public class SomeController : Controller
    {
        private readonly SomeCommand1 _someCommand1;
        private readonly SomeCommand2 _someCommand2;
        .....

        public SomeController (SomeCommand1 someCommand1, SomeCommand2 someCommand2)
        {
            _someCommand1 = someCommand1;
            _someCommand2 = someCommand2;
            .....
        }

        public JsonResult SomeAction1(SomeModel1 model)
        {
            _someCommand1.Execute(model);
            return String.empty;
        }

        public JsonResult SomeAction2(SomeModel2 model)
        {
            _someCommand2.Execute(model);
            return String.empty;
        }
        ...
    }


меня пугает кол-во параметров в инжектирования, а если там 20-30 экшенов и на каждый своя команда или запрос? я может не так понимаю cqrs? еще по идее я также должен конкретную SomeModel подать в конкретный SomeCommand в конструктор вроде как, тогда я так понимаю можно сделать что то типо сервиса который по модели будет находить команду и будет прокидывать в конструктор команды модель, но я что то не соображу как эт сделать лучше.
Код: 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.
public class SomeController : Controller
    {
        private readonly SomeCommandLocator _someCommandLocator;

        public SomeController (SomeCommandLocator someCommandLocator)
        {
            _someCommandLocator= someCommandLocator;
        }

        public JsonResult SomeAction1(SomeModel1 model)
        {
            var command = _someCommandLocator.get(model);
            command.Execute()
            return String.empty;
        }

        public JsonResult SomeAction2(SomeModel2 model)
        {
           var command = _someCommandLocator.get(model);
            command.Execute()
            return String.empty;
        }
        ...
    }


подсобите в кое направление копать.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39454863
Vladimir A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39454929
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39455839
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Я использую в базовом контроллере две строчки

Код: c#
1.
2.
protected readonly ICommandDispatcher CommandDispatcher;
 protected readonly IQueryDispatcher QueryDispatcher;



Код action
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  [HttpPost, ValidateAntiForgeryToken, Authorize, LocalUrl]
        public ActionResult PreUploadPhoto(HttpPostedFileBase image)
        {
            var command = new PreUploadPersonPhotoCommand { Stream = image.InputStream };
            var res = CommandDispatcher.CanDispatch(command);
            if (!res.Any())
            {
                CommandDispatcher.Dispatch(command);
                Response.StatusCode = 200;
                return Json(command.UploadedPhotoUrl, JsonRequestBehavior.AllowGet);
            }
            else
            {
                Response.StatusCode = 400;
                return Json(ValidationHelper.ShowResultAsString(res), JsonRequestBehavior.AllowGet);
            }
        }
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39455966
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллеги Vladimir A, skyANA эт я читал но у меня в голове каша после прочитанного, поэтому я и написал тут чтоб вы на моем примере мне пояснили что не так, если не сложно.

big-duke,

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

поясните вот эт CommandDispatcher.CanDispatch(command) зачем эт проверка?

п.с. кстати по поводу ошибок
я вот думал что можно просто в базовом контролере переопределить методы к примеру для json
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public JsonResult ProcessJson(ICommandHandler handler)
        {
            try
            {
                var res = handler.Execute();
                return JsonOk(res);
            }
            catch (BlException e)
            {  
               Response.StatusCode = 400;
               return JsonError();//тут Modelstate просто преобразует в массив строк 
            }
        }


но почему то многие говорят что выкидывание ошибок эт плохо, но на мой взгляд из глубин бизнеслогики - эт единственный способ указать что не так, а уже на веб сайте, веб апи консоли или чем еще обработать как надо.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456138
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu, в статье, на которую я сослался, описаны два способа маршрутизации.
Лично я пользуюсь тем, что через IoC-конейнер. А так как у меня StructureMap, то зашиваюсь не на контекст, а на имя.

Регистрация в контейнере:
Код: c#
1.
this.For<ICommand<SomeContext>>().WcfOrHttpOrThreadScoped().Use<SomeCommand>().Named(CommandName.SomeCommand);


Получение объекта и выполнение:
Код: c#
1.
2.
3.
4.
var context = new SomeContext();
var command = F.Get<ICommand<SomeContext>>(CommandName.SomeCommand);

command.Execute(context);
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456578
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парни, у меня вопрос по теме.

А зачем всё это?
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456589
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом, что конкретно Вас смущает?
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456595
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомПарни, у меня вопрос по теме.

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

Зачем эти слои при пайплайне "запрос-обработка-ответ".

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

Зачем эти слои при пайплайне "запрос-обработка-ответ".

В чем выгода?
Будет выгода, и какая, или не будет - это надо смотреть на конкретном проекте.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456616
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот например точка зрения Microsoft:

Command and Query Responsibility Segregation (CQRS)Segregate operations that read data from operations that update data by using separate interfaces.
This can maximize performance, scalability, and security. Supports the evolution of the system over time through higher flexibility, and prevent update commands from causing merge conflicts at the domain level.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456618
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также с микросервисами зачастую используется, а там тоже можно сказать "запрос-обработка-ответ" :)
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456620
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeАгнец за бортомПарни, у меня вопрос по теме.

А зачем всё это?
Видишь ли, хелловордл теперь не по феншую.
Что значит теперь? :) CQRS придумал Мейер ещё в 1988 году, если не ошибаюсь.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456630
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВот например точка зрения Microsoft:

Command and Query Responsibility Segregation (CQRS)Segregate operations that read data from operations that update data by using separate interfaces.
This can maximize performance, scalability, and security. Supports the evolution of the system over time through higher flexibility, and prevent update commands from causing merge conflicts at the domain level.

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


Зачем эти слои при пайплайне "запрос-обработка-ответ".

В чем выгода?
Будет выгода, и какая, или не будет - это надо смотреть на конкретном проекте.

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

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


У тебя _своя_ точка зрения есть?
Мне очень удобно такое разделение в определённых случаях и действительно гибко.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456739
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, когда узнал о CQRS, тоже сперва воспринимал его поверхностно.

Однако, нужно смотреть глубже! Например, цитата из статьи CQRS Фаулера:

Martin FowlerBy separate models we most commonly mean different object models, probably running in different logical processes, perhaps on separate hardware.

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

Конечно, это может повысить сложность проекта.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39456797
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikКонечно, это может повысить сложность проекта.
А может и понизить :)

Я у нас на проекте начал применять CQRS, когда в одной фиче, в отдельном модуле системы, отвечающем за биллинг, надо было реализовать выполнение определённых массовых действий по cron-у.
Действий над различными срезами данных.

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

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

И стал применять CQRS. Таким образом и сложность понизилась, и инкапсуляция улучшилась.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39457695
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
поясните вот эт CommandDispatcher.CanDispatch(command) зачем эт проверка?


Я должен убедиться, что входные данные валидны и я могу выполнить команду.
Для данной команды в candispatch я проверяю тип файла и его размер.
...
Рейтинг: 0 / 0
cqrs в каком направление
    #39457758
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-duke,
понял спасибо, я такое переложил на саму команду ..внутри неё есть Validate откуда я и выкидываю исключения если надо
Код: c#
1.
2.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / cqrs в каком направление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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