170 похожих чатов

Смотри. Цель: передать Dto с параметрами и получить ViewModel. Есть 2 ViewModel’и.

Для простоты - Vm1 и Vm2 и Dto с параметрами для их конструирования - Dto1 и Dto2.
Цель - передать в некий сервис Dto1 и получить Vm1 и Dto2 - Vm2 соответственно.

Есть 3 сервиса - Svc1, Svc2, Svc3.
Vm1 хочет в конструкторе Dto1, Svc1, Svc2, а вот Vm2 хочет Dto2, Svc1, Svc2, Svc3.

Суть идеи - ты регистрируешь Func<Dto1, Vm1> и Func<Dto2,Vm2>.
При регистрации ты передаёшь в неё сам контейнер. В итоге Dto ты передаёшь как параметр, а сервисы подрезолвливаешь ручками из переданного при регистрации контейнера (это минус этого подхода, я о нём уже рассказывал). По сути получаются фабрики.

Какие от этого плюсы?
- Вью модельки ничего не знают о сервисах друг друга. Весь контракт для создания новой вью-модели - это передача Dto в сервис. Т.е. даже резолвинг Func и его вызов скрыт от них.
- При необходимости порефакторить параметры какой-то вью-модельки - ты рефакторишь Dto, и если это требуется - то резолвинг остальных сервисов, которые ей нужны. При этом порядок и количество аргументов для тебя перестают иметь значение, так как все они живут в Dto, который ты можешь вертеть как угодно. Для твоих вью-моделек весь контракт - это засунуть Dto в сервис и забрать новую вью-модель.
- При рефакторинге параметров для конструирования вью-моделек ты имеешь полную статическую типизацию, и если ты напишешь откровенную херню или что-то забудешь изменить - то код просто не соберётся. Этого нельзя достичь с аргументами, которые передаются у тебя как массив object’ов и потом в рантайме приводятся к нужному типу, как это у тебя было реализовано через метод Set.
- Все зависимости вью модельки получают через конструктор, и следовательно - после создания не требуют дополнительных телодвижений по какой-либо инициализации. Т.е. ты не сможешь создать объект с некорректным внутренним состоянием. При использовании подхода с отдельным методом, выполняющим инициализацию - ты можешь сконструировать объект, но забыть его вызвать.
- По причине того что все зависимости прилетают в конструкторе - их нетрудно тестировать.

Все приседания с Func нужны для упрощения контракта, по которому вью-модельки будут общаться между собой)

1 ответов

8 просмотров

Ресолвить сервисы ручками — работа, регистрировать Func<> — работа, писать DTO — работа. Мне проще отправлять аргументы фабрике, и если resolvable-вьюмодель захочет их принять, инжектить в неё сервис, который может всё ей отдать. Просто, универсально и работать много не надо. Да, существенный минут — проё###### статическую типизацию и анализ кода на корректность. Но ведь работаем меньше!

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта