Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / cqrs в каком направление / 21 сообщений из 21, страница 1 из 1
17.05.2017, 16:36
    #39454838
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
вообщем делаю для себя демо с помощью 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
17.05.2017, 16:57
    #39454863
Vladimir A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
...
Рейтинг: 0 / 0
17.05.2017, 17:57
    #39454929
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
...
Рейтинг: 0 / 0
19.05.2017, 09:38
    #39455839
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
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
19.05.2017, 11:25
    #39455966
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
коллеги 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
19.05.2017, 14:06
    #39456138
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
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
20.05.2017, 11:14
    #39456578
Агнец за бортом
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
Парни, у меня вопрос по теме.

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

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

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

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

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

В чем выгода?
Будет выгода, и какая, или не будет - это надо смотреть на конкретном проекте.
...
Рейтинг: 0 / 0
20.05.2017, 14:06
    #39456616
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
Вот например точка зрения 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
20.05.2017, 14:12
    #39456618
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
Также с микросервисами зачастую используется, а там тоже можно сказать "запрос-обработка-ответ" :)
...
Рейтинг: 0 / 0
20.05.2017, 14:15
    #39456620
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
ShSergeАгнец за бортомПарни, у меня вопрос по теме.

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


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

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

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

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


У тебя _своя_ точка зрения есть?
Мне очень удобно такое разделение в определённых случаях и действительно гибко.
...
Рейтинг: 0 / 0
20.05.2017, 23:33
    #39456739
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
Я, когда узнал о 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
21.05.2017, 10:28
    #39456797
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cqrs в каком направление
petalvikКонечно, это может повысить сложность проекта.
А может и понизить :)

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

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

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

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


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


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