|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Всем привет, хочется реализовать следующую конструкцию. Есть базовый абстрактный класс, который инжектит в себя зависимость, которая нужна всем потомках. И необходимо освободить потомков от внедрения этой же самой зависимости. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Такой вариант требует внедрения IMediator в конструктор WarehouseController, хотелось бы полностью спрятать эту зависимость в базовом классе ApiControllerBase. Раньше скорее всего проканал бы вариант с PropertyInjection, но заводской ASP Core DI-контейнер не имеет такой функциональности. Подскажите как можно сделать, или такой вариант зло и все равно необходимо в каждом потомке внедрять зависимость. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 13:26 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Чем тебе не нравится инъекция в свойство, которое ты можешь объявить в базовом классе? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 13:34 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
vb_sub но заводской ASP Core DI-контейнер не имеет такой функциональности. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 13:41 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Shocker.Pro, для контроллеров и POCO не работает- единственное где заводится- в Blazor-компоненте. Внедренный сервис посредством [Inject] атрибута все время null. Пробовал максимально открывать класс, его свойства и сеттеры-не помогает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 14:40 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
а, мне казалось, что использовал Ну фабрику можешь сделать простейшую, чтобы инициализировала свойство. В общем, можно даже регистрировать сразу с мини-фабрикой в виде лямбды, но если есть единый базовый класс, можно организовать и фабрику. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 15:58 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
vb_sub или такой вариант зло Зло. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 20:30 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
vb_sub Такой вариант требует внедрения IMediator в конструктор WarehouseController, хотелось бы полностью спрятать эту зависимость в базовом классе ApiControllerBase. Типа экономия? :) Ох, лень же писать конструктор в каждом контроллере. Вы можете поступить так: Код: c# 1. 2. 3. 4.
Всё. Но это говнокод и рано или поздно вы или кто-то другой будет материть вас за подобную херню :) Отдельно про медиатор. Вы скорее всего пытаетесь наступить на грабли, которые уже знатно врезали по многим лбам. Полностью делать всё через медиатор. Ох и пожалеете об этом ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 22:00 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
hVostt vb_sub Такой вариант требует внедрения IMediator в конструктор WarehouseController, хотелось бы полностью спрятать эту зависимость в базовом классе ApiControllerBase. Типа экономия? :) Ох, лень же писать конструктор в каждом контроллере. Вы можете поступить так: Код: c# 1. 2. 3. 4.
Всё. Но это говнокод и рано или поздно вы или кто-то другой будет материть вас за подобную херню :) Отдельно про медиатор. Вы скорее всего пытаетесь наступить на грабли, которые уже знатно врезали по многим лбам. Полностью делать всё через медиатор. Ох и пожалеете об этом Типа экономия? :) Нет, хотелось бы сделать код почище. Вы скорее всего пытаетесь наступить на грабли, которые уже знатно врезали по многим лбам. К каким косякам приведет медиатор? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2021, 11:55 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
vb_sub Типа экономия? :) Нет, хотелось бы сделать код почище. Если у вас и правда все контроллеры должны использовать медиатор, тогда используйте код, который я привёл, или его вариации. vb_sub К каким косякам приведет медиатор? Уменьшение связности, справиться с которой будет невозможно. Это приведёт к тому, что логика будет размазана по модулям, как ошмётки кишок по стенам новобранца, доигравшегося с гранатой :) В противовес к этому сильная зависимость от медиатора, как у наркомана со стажем от героина. Ничего нельзя будет сделать без медиатора в принципе. Проблемы с отладкой как бонус. Навигация по коду -- давай до свидания! Это что навскидку. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2021, 02:40 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Похоже на то, что злой дух ServiceLocator периодически воскресает в различных реализациях, но честно говоря все лучше и лучше с каждой реинкарнацией. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2021, 11:03 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Контроллер по сути и так является медиатором ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2021, 13:49 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Roman Mejtes, Если бы контроллер был один. Но их много. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2021, 15:51 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
очень плохая идея, если какой то базовый класс, будет инжектировать в тихую какую то зависимость. по моему, это просто жопа. наследование сегодня вообще под гонениями :), но автор хочет поддать огня и выстрелить себе в ногу сам. Суть в том, что вам тут не нужен базовый класс. "Базовый класс" нужно вынести в сервис передам ему эту часть базового функционала, этот новый сервис будет иметь ту самую зависимость, что вы хотите передать в базовый класс. А "порожденные классы" от "базового" будут иметь зависимость к этому "базовому классу". Делать то, что вы задумали, я бы не стал, и не дал бы не одному человеку, который со мной бы это делал, даже если бы он убеждал меня в крутости идеи и что это даст хоть какой то полезный результат (если это вообще возможно) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2021, 23:20 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Roman Mejtes, Соглашусь с тем, что плохая идея инжектить зависимость не через конструктор, с точки зрения идеального дизайна архитектуры. Не соглашусь с тем, что на практике это прям всегда плохая идея. Так как тотальное слепое следование идеальному дизайну, пытаясь соблюдать кристальную чистоту кода, безусловно следуя всем принципам и подходам "в лоб", легко может привести к тому, что комфортная и простая разработка будет пожертвована идеалам. Пытаясь не выстрелить в ногу мы можем вообще получить ружьё, которое не стреляет в принципе. Или для совершения выстрела потребуется привлечь профессиональную команду инженеров. В общем, разработка это в первую очередь компромисс. Иногда нужно выбирать между двух зол. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 02:32 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
hVostt Иногда нужно выбирать между двух зол. Тут, скорее, между добром и злом :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 09:38 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Идея с сервисом от Романа мне понравилась, но она по сути эта просто декоратор над прямым внедрением зависимости в конструктор. То есть вместо внедрения Imediator в каждый контроллер будет внедряться ImediatorService-просто дополнительный уровень абстракции. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 09:45 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Я еще могу понять (с огромнейшим натягом) наследование ради наследования какого-нибудь нетривиального функционала, но наследование ради наследования одного поля это откровенное зло. Да и вообще наследование постоянно абьюзят так, что его вообще запретить впору. Можно было бы, например, в csc добавить какую-нибудь опцию типа "sealed by default" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 09:57 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
fkthat, Это всё хейтеры. Хейтят всё, что нынче не модно. Спустя пять лет будут наследование нахваливать, откроют его заново и экое дивное диво, смотрите! ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 20:22 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
hVostt Это всё хейтеры Рихтер, Саттер и АА - компашка хейтеров ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 22:17 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
fkthat hVostt Это всё хейтеры Рихтер, Саттер и АА - компашка хейтеров У них как раз по существу всё, наследование не хейтится, а объясняются последствия при неправильном дизайне наследования. Но это вырывается из контекста, оставляя только "наследование -- зло" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2021, 09:33 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
hVostt Но это вырывается из контекста, оставляя только "наследование -- зло" :) Ну так и я ведь не писал, что наследование это Зло. Сказал только что его абьюзят. Бухлом тоже некоторые пассажиры абьюзят, но это не значит что совсем никогда нельзя побухать ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 04:30 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
fkthat hVostt Но это вырывается из контекста, оставляя только "наследование -- зло" :) Ну так и я ведь не писал, что наследование это Зло. Сказал только что его абьюзят. Бухлом тоже некоторые пассажиры абьюзят, но это не значит что совсем никогда нельзя побухать Ну это игра слов :) На деле, то "абьюзят" приводит к крестовым походам с факелами и вилами к тем, кто наследование успешно применяет. fkthat Да и вообще наследование постоянно абьюзят так, что его вообще запретить впору . :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 11:56 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
hVostt Ох, лень же писать конструктор в каждом контроллере. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 21:52 |
|
Инжектить зависимость только в базовом классе, а использовать во всех потомках
|
|||
---|---|---|---|
#18+
Antonariy, А asp.net core тем временем вообще практикуется инъекция в делегаты :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2021, 00:34 |
|
|
start [/forum/topic.php?fid=18&fpage=4&tid=1354569]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
25ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 134ms |
0 / 0 |