powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Инжектить зависимость только в базовом классе, а использовать во всех потомках
25 сообщений из 49, страница 1 из 2
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042590
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, хочется реализовать следующую конструкцию. Есть базовый абстрактный класс, который инжектит в себя зависимость, которая нужна всем потомках. И необходимо освободить потомков от внедрения этой же самой зависимости.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    [ApiController]
    [Route("api/[controller]")]
    public abstract class ApiControllerBase : ControllerBase
    {
        protected readonly IMediator _mediator;
        protected ApiControllerBase(IMediator mediator)
        {
            _mediator = mediator;
        }
    }

 public class WarehouseController: ApiControllerBase
    {
        public IActionResult Index()
        {   
            var mediator = _mediator;
            return Ok();
        }
    }



Такой вариант требует внедрения IMediator в конструктор WarehouseController, хотелось бы полностью спрятать эту зависимость в базовом классе ApiControllerBase.
Раньше скорее всего проканал бы вариант с PropertyInjection, но заводской ASP Core DI-контейнер не имеет такой функциональности. Подскажите как можно сделать, или такой вариант зло и все равно необходимо в каждом потомке внедрять зависимость. Спасибо
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042593
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем тебе не нравится инъекция в свойство, которое ты можешь объявить в базовом классе?
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042594
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
но заводской ASP Core DI-контейнер не имеет такой функциональности.
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.injectattribute?view=aspnetcore-5.0
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042602
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
для контроллеров и POCO не работает- единственное где заводится- в Blazor-компоненте. Внедренный сервис посредством [Inject] атрибута все время null. Пробовал максимально открывать класс, его свойства и сеттеры-не помогает.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042621
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, мне казалось, что использовал
Ну фабрику можешь сделать простейшую, чтобы инициализировала свойство.

В общем, можно даже регистрировать сразу с мини-фабрикой в виде лямбды, но если есть единый базовый класс, можно организовать и фабрику.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042690
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
или такой вариант зло

Зло.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042716
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Такой вариант требует внедрения IMediator в конструктор WarehouseController, хотелось бы полностью спрятать эту зависимость в базовом классе ApiControllerBase.


Типа экономия? :)
Ох, лень же писать конструктор в каждом контроллере.

Вы можете поступить так:

Код: c#
1.
2.
3.
4.
    public abstract class ApiControllerBase : ControllerBase
    {
        protected IMediator Mediator => HttpContext.RequestServices.GetService<IMediator>();
    }



Всё.

Но это говнокод и рано или поздно вы или кто-то другой будет материть вас за подобную херню :)


Отдельно про медиатор. Вы скорее всего пытаетесь наступить на грабли, которые уже знатно врезали по многим лбам. Полностью делать всё через медиатор. Ох и пожалеете об этом
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042772
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
vb_sub
Такой вариант требует внедрения IMediator в конструктор WarehouseController, хотелось бы полностью спрятать эту зависимость в базовом классе ApiControllerBase.


Типа экономия? :)
Ох, лень же писать конструктор в каждом контроллере.

Вы можете поступить так:

Код: c#
1.
2.
3.
4.
    public abstract class ApiControllerBase : ControllerBase
    {
        protected IMediator Mediator => HttpContext.RequestServices.GetService<IMediator>();
    }



Всё.

Но это говнокод и рано или поздно вы или кто-то другой будет материть вас за подобную херню :)


Отдельно про медиатор. Вы скорее всего пытаетесь наступить на грабли, которые уже знатно врезали по многим лбам. Полностью делать всё через медиатор. Ох и пожалеете об этом


Типа экономия? :)
Нет, хотелось бы сделать код почище.


Вы скорее всего пытаетесь наступить на грабли, которые уже знатно врезали по многим лбам.
К каким косякам приведет медиатор?
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40042986
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Типа экономия? :)
Нет, хотелось бы сделать код почище.


Если у вас и правда все контроллеры должны использовать медиатор, тогда используйте код, который я привёл, или его вариации.

vb_sub
К каким косякам приведет медиатор?


Уменьшение связности, справиться с которой будет невозможно. Это приведёт к тому, что логика будет размазана по модулям, как ошмётки кишок по стенам новобранца, доигравшегося с гранатой :)

В противовес к этому сильная зависимость от медиатора, как у наркомана со стажем от героина. Ничего нельзя будет сделать без медиатора в принципе.

Проблемы с отладкой как бонус. Навигация по коду -- давай до свидания!

Это что навскидку.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043179
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на то, что злой дух ServiceLocator периодически воскресает в различных реализациях, но честно говоря все лучше и лучше с каждой реинкарнацией.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043270
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контроллер по сути и так является медиатором
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043334
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Если бы контроллер был один. Но их много.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043840
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень плохая идея, если какой то базовый класс, будет инжектировать в тихую какую то зависимость. по моему, это просто жопа.
наследование сегодня вообще под гонениями :), но автор хочет поддать огня и выстрелить себе в ногу сам.
Суть в том, что вам тут не нужен базовый класс. "Базовый класс" нужно вынести в сервис передам ему эту часть базового функционала, этот новый сервис будет иметь ту самую зависимость, что вы хотите передать в базовый класс.
А "порожденные классы" от "базового" будут иметь зависимость к этому "базовому классу".
Делать то, что вы задумали, я бы не стал, и не дал бы не одному человеку, который со мной бы это делал, даже если бы он убеждал меня в крутости идеи и что это даст хоть какой то полезный результат (если это вообще возможно)
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043854
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Соглашусь с тем, что плохая идея инжектить зависимость не через конструктор, с точки зрения идеального дизайна архитектуры.

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

В общем, разработка это в первую очередь компромисс. Иногда нужно выбирать между двух зол.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043890
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Иногда нужно выбирать между двух зол.

Тут, скорее, между добром и злом :))
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043891
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея с сервисом от Романа мне понравилась, но она по сути эта просто декоратор над прямым внедрением зависимости в конструктор. То есть вместо внедрения Imediator в каждый контроллер будет внедряться ImediatorService-просто дополнительный уровень абстракции.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40043894
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я еще могу понять (с огромнейшим натягом) наследование ради наследования какого-нибудь нетривиального функционала, но наследование ради наследования одного поля это откровенное зло. Да и вообще наследование постоянно абьюзят так, что его вообще запретить впору. Можно было бы, например, в csc добавить какую-нибудь опцию типа "sealed by default"
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40044185
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Это всё хейтеры. Хейтят всё, что нынче не модно. Спустя пять лет будут наследование нахваливать, откроют его заново и экое дивное диво, смотрите! )))
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40044217
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Это всё хейтеры

Рихтер, Саттер и АА - компашка хейтеров
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40044290
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Это всё хейтеры

Рихтер, Саттер и АА - компашка хейтеров


У них как раз по существу всё, наследование не хейтится, а объясняются последствия при неправильном дизайне наследования.

Но это вырывается из контекста, оставляя только "наследование -- зло" :)
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40044703
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Но это вырывается из контекста, оставляя только "наследование -- зло" :)

Ну так и я ведь не писал, что наследование это Зло. Сказал только что его абьюзят. Бухлом тоже некоторые пассажиры абьюзят, но это не значит что совсем никогда нельзя побухать
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40044767
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Но это вырывается из контекста, оставляя только "наследование -- зло" :)

Ну так и я ведь не писал, что наследование это Зло. Сказал только что его абьюзят. Бухлом тоже некоторые пассажиры абьюзят, но это не значит что совсем никогда нельзя побухать


Ну это игра слов :) На деле, то "абьюзят" приводит к крестовым походам с факелами и вилами к тем, кто наследование успешно применяет.

fkthat
Да и вообще наследование постоянно абьюзят так, что его вообще запретить впору .


:)
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047359
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Ох, лень же писать конструктор в каждом контроллере.
Тоже когда-то было лень. Но оказалось, что все остальное отливается еще большей возней, чем написание конструктора.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

А asp.net core тем временем вообще практикуется инъекция в делегаты :)
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047386
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
инъекция в делегаты

А это что за зверь такой?
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Инжектить зависимость только в базовом классе, а использовать во всех потомках
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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