powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Инжектить зависимость только в базовом классе, а использовать во всех потомках
49 сообщений из 49, показаны все 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
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047388
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047389
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
hVostt

Ох, лень же писать конструктор в каждом контроллере.
Тоже когда-то было лень. Но оказалось, что все остальное отливается еще большей возней, чем написание конструктора.

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

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


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

То, что ты говоришь похоже на ситуацию, когда ударился ногой об скамейку == скамейка виновата == скамейки зло!! Это никак не относится к взрослому осмысленному и грамотнонму применению инструментов. Никаких фейерверков не начинается.


fkthat
Хм... А что там необычного, и при чем там делегаты? Всему что там написано уже сто лет в обед.


Либо ты не внимательный, либо покажи что-то подобное в ASP.NET MVC 5 хотя бы. Уже не будем откатываться на сто лет назад. Давай в классическом ASP покажи такое же.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047468
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Корень зла тут в наследовании


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

Но в данном случае грядет говнокод почему-то именно с наследованием

hVostt
Либо ты не внимательный, либо покажи что-то подобное в ASP.NET MVC 5 хотя бы.

При чем тут это - там DI встроенного вообще не было. Я просто так и не понял, при чем там по твоей ссылке именно делегаты и их инжекция. Сначала даже подумал, что в дотнет delegate factories завезли, как в автофаке, но зашел и не увидел ничего нового.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047569
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Но в данном случае грядет говнокод почему-то именно с наследованием


Есть правило: предпочитайте композицию наследованию — является вспомогательным советом, с какой стороны подходить к построению архитектуры классов. И для этого есть обоснование.

Обоснования для утверждения "наследование — зло", которое хотя бы чуть-чуть дотягивало до аналогичного утверждения для goto, нет и пока не предвидится.

fkthat
При чем тут это - там DI встроенного вообще не было. Я просто так и не понял, при чем там по твоей ссылке именно делегаты и их инжекция. Сначала даже подумал, что в дотнет delegate factories завезли, как в автофаке, но зашел и не увидел ничего нового.


Ну вот же:

Код: c#
1.
public async Task Invoke(HttpContext httpContext, IMyScopedService svc)



Как видишь, инъекция в аргументы метода, можно добавить ещё сервисов. Это -- новое. Если нет, покажи как это работало раньше в ASP.NET MVC 5, пусть хоть и с автофаком )
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047574
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Как видишь, инъекция в аргументы метода, можно добавить ещё сервисов.

Ну и при чем здесь все-таки какие-то делегаты? И это не совсем иньекция - это скорее сервис-локатор, который запрятан в фреймворке и вызывается при вызове Invoke. Такая же тема есть для акций контроллеров, но с совершенно произвольным методом такой фокус не пройдет, да и невозможен хотя бы из-за синтаксиса C#.

hVostt
Это -- новое.

Время просыпаться . Новым это было в 2.1.

hVostt
покажи как это работало раньше в ASP.NET MVC 5, пусть хоть и с автофаком

В МВЦ5 вообще мидлеваров не было. Был со стороны OWIN, который, кстати, с автофаком интегрировался . В Invoke он инжектить не мог, но там и нужды такой не было, т.к. инстанс мидлевара создавался per request.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047577
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ну и при чем здесь все-таки какие-то делегаты?


Еси провалишься вглубь фреймворка -- узнаешь :)

fkthat
И это не совсем иньекция - это скорее сервис-локатор, который запрятан в фреймворке и вызывается при вызове Invoke.


В смысле "не совсем инъекция"? )) А ты тогда не совсем человек, а просто сборище молекул :)
Самая что ни на есть чистая инъекция. DI вообще работает через сервис-локатор, иначе откуда он будет зависимости брать, из космоса чтоли?

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

fkthat
hVostt
Это -- новое.

Время просыпаться . Новым это было в 2.1.


Ну так и проснись уже! Вот моё оригинальное сообщение:

hVostt
Antonariy,

А asp.net core тем временем вообще практикуется инъекция в делегаты :)


Я как бы про весь asp.net core говорю, очевидно, сравнивая с его предшественником.

fkthat
В МВЦ5 вообще мидлеваров не было. Был со стороны OWIN, который, кстати, с автофаком интегрировался . В Invoke он инжектить не мог, но там и нужды такой не было, т.к. инстанс мидлевара создавался per request.


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

В смысле, что это специфичная иньекция, работающая только в конкретном случае, а не где угодно, как иньекция в конструктор.

hVostt
DI вообще работает через сервис-локатор, иначе откуда он будет зависимости брать, из космоса чтоли?

DI может быть вообще без какого-либо контейнера или фреймворка. DI говорит только о разделении создания зависимости и её использования.

hVostt
Нужды и в asp.net core такой тоже нет, прям острой. Или всё сломается и не взлетит без этой фичи?

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


Зависимость внедряется? Внедряется :)

fkthat
DI может быть вообще без какого-либо контейнера или фреймворка. DI говорит только о разделении создания зависимости и её использования.


Ты наверное путаешь с IoC.

fkthat
В коре мидлеваре это синглетон. Если бы не было этой фичи, то это пришлось бы делать обходными путями (например, с помощью фабрики).


Что значит "пришлось бы"? :)

https://docs.microsoft.com/en-US/aspnet/core/fundamentals/middleware/extensibility?view=aspnetcore-5.0

А ну да, я ж забыл. Кто ж доку читает, дока, знания "всякой хрени" это всё для лохов.
Реальный пацан пишет код чисто на базовой пацанской интуиции
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047621
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ты наверное путаешь с IoC.

Нет, не путаю. Сам по себе принцип DI - разделение использования зависимости и создания её экземпляра ничего не говорит о том как эта зависимость должна создаваться. И ты сам же выше об этом написал:
hVostt
Зависимость внедряется? Внедряется :)


hVostt
А ну да, я ж забыл. Кто ж доку читает, дока, знания "всякой хрени" это всё для лохов.
Реальный пацан пишет код чисто на базовой пацанской интуиции

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


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

Скорее частный случай применения. Потому что IoC очень сильно намного шире, чем DI. Например, когда ты в очередной раз пишешь свой любимый button_Сlick, то ты, на самом деле, тоже используешь IoC. Если посмотреть на SOLID, то IoC это "O", а DI где-то ближе к "D".
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40047805
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Скорее частный случай применения. Потому что IoC очень сильно намного шире, чем DI. Например, когда ты в очередной раз пишешь свой любимый button_Сlick, то ты, на самом деле, тоже используешь IoC. Если посмотреть на SOLID, то IoC это "O", а DI где-то ближе к "D".


Не понял, как связан обработчик события нажатия кнопки с IoC.
Если смотреть на SOLID, то IoC имеет прямое отношение к D.
Принцип открытости/закрытости (O) к IoC прямого отношения не имеет.

Вообще рекомендую почитать книженцию Паттерны проектирования на платформе .NET Сергея Теплякова.

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

А ты скажи своей мобиле "Hey Google!" и спроси у неё, что означает аббревиатура IoC.

wikiИнверсия управления (англ. Inversion of Control, IoC) — важный принцип объектно-ориентированного программирования, используемый для уменьшения зацепления (связанности) в компьютерных программах. Также архитектурное решение интеграции, упрощающее расширение возможностей системы, при котором поток управления программы контролируется фреймворком.

В обычной программе программист сам решает, в какой последовательности делать вызовы процедур. Но, если используется фреймворк, программист может разместить свой код в определенных точках выполнения (используя callback или другие механизмы), затем запустить «главную функцию» фреймворка, которая обеспечит все выполнение и вызовет код программиста тогда, когда это будет необходимо. Как следствие, происходит утеря контроля над выполнением кода — это и называется инверсией управления (фреймворк управляет кодом программиста, а не программист управляет фреймворком).


hVostt
Принцип открытости/закрытости (O) к IoC прямого отношения не имеет.

Очень даже имеет, пускай даже и не прямое (я и не говорил что это прямо-таки одно и то же). Потому что при IoC мы расширяем/модифицируем поведение приложения не меняя ничего в существующем фреймворке (закрытость к изменениям), а дополняя его своими "расширениями" в виде коллбеков, обработчиков событий и, в том числе, инжекцией зависимостей, которые этот фрейморк будет вызывать (открытость к расширению).

hVostt
Вообще рекомендую почитать книженцию Паттерны проектирования на платформе .NET Сергея Теплякова.

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

А ты скажи своей мобиле "Hey Google!" и спроси у неё, что означает аббревиатура IoC.


Ясень не ответил мне. Если пояснишь, буду благодарен. Если не пояснишь, будем считать это очередной игрой твоего воображения ))

fkthat
hVostt
Принцип открытости/закрытости (O) к IoC прямого отношения не имеет.

Очень даже имеет, пускай даже и не прямое (я и не говорил что это прямо-таки одно и то же). Потому что при IoC мы расширяем/модифицируем поведение приложения не меняя ничего в существующем фреймворке (закрытость к изменениям), а дополняя его своими "расширениями" в виде коллбеков, обработчиков событий и, в том числе, инжекцией зависимостей, которые этот фрейморк будет вызывать (открытость к расширению).


IoC решает совершенно другую задачу. Инверсия управления потоком исполнения служит только для уменьшения связанности (coupling).
Никакого отношения к принципу открытости/закрытости не имеет. Более того, агрессивнное снижение связанности может только навредить, при чём довольно сильно. Такое может наблюдаться при снижении связности (cohension).
И при IoC мы никак модицифируем поведение, мы изменяем направление контроля, это всё что мы делаем. Ещё и колбеки какие-то у тебя появились... боже какая же у тебя адская каша в голове, просто уму не постижимо!!
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40048375
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ясень не ответил мне. Если пояснишь, буду благодарен. Если не пояснишь, будем считать это очередной игрой твоего воображения ))

Я же процитировал ниже.

hVostt
Инверсия управления потоком исполнения служит только для уменьшения связанности (coupling).

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

См. выше. Изменение направления контроля тоже только ради изменения направления контроля?

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

wiki Inversion of control is used to increase modularity of the program and make it extensible , and has applications in object-oriented programming and other programming paradigms. The term was used by Michael Mattsson in a thesis, taken from there by Stefano Mazzocchi and popularized by him in 1999 in a defunct Apache Software Foundation project, Avalon, then further popularized in 2004 by Robert C. Martin and Martin Fowler.

The term is related to, but different from, the dependency inversion principle, which concerns itself with decoupling dependencies between high-level and low-level layers through shared abstractions. The general concept is also related to event-driven programming in that it is often implemented using IoC so that the custom code is commonly only concerned with the handling of events , whereas the event loop and dispatch of events/messages is handled by the framework or the runtime environment.
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40048396
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Наводящий вопрос - а уменьшение связности это самоцель или все-таки тоже для чего-то служит?


Уменьшение связАнности. Связность как раз надо увеличивать:)

Цель очень простая -- обособление связной логики, повышение шансов переиспользования (модульность, расширение функционала программы за этот счёт), упрощает (или даже вообще разрешает) юнит-тестирование. Плюс уменьшение связанности даёт возможность применять аспектное программирование.

Нет, наводящий вопрос никак не наводит на мысль, что это как-то говорит про открытость/закрытость.


fkthat
См. выше. Изменение направления контроля тоже только ради изменения направления контроля?

Ты как те слепые из притчи, которые трогали слона за хер различные части тела. Где-то на что-то наткнулся, прочитал, запомнил, а общей картины у тебя так и нет. Потому что надо не только читать и запоминать, а еще и хоть немного пытаться это осмысливать.


Есть более общий и глобальный принцип: необходимо стремиться к уменьшению связАнности и увеличению связности. IoC позволяет решить задачу по уменьшению связАнности.


fkthat
wiki Inversion of control is used to increase modularity of the program and make it extensible , and has applications in object-oriented programming and other programming paradigms. The term was used by Michael Mattsson in a thesis, taken from there by Stefano Mazzocchi and popularized by him in 1999 in a defunct Apache Software Foundation project, Avalon, then further popularized in 2004 by Robert C. Martin and Martin Fowler.

The term is related to, but different from, the dependency inversion principle, which concerns itself with decoupling dependencies between high-level and low-level layers through shared abstractions. The general concept is also related to event-driven programming in that it is often implemented using IoC so that the custom code is commonly only concerned with the handling of events , whereas the event loop and dispatch of events/messages is handled by the framework or the runtime environment.


Ты путаешь расширяемость архитектуры приложения (модульность), с расширяемостью в архитектуре иерархии классов.

IoC может использоваться для чего угодно, в том числе для получения обработчика события из контейнера. Но это задача конкретного компонента, откуда он будет обработчик брать, из IoC, или из собственного реестра -- значения не имеет. Никакого отношения к событиям IoC не имеет. Нет такой концепции, нет такого определения, в IoC событийная модель никак не участвует и не прослеживается. Её там нет. Посмотри на описание и диаграммы.

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

Я хз, потому что читаю практически только англоязычные источники. Loose coupling.

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

При чем тут контейнер вообще. Там даже ниже по процитированной ссылке:
wikiInversion of control carries the strong connotation that the reusable code and the problem-specific code are developed independently even though they operate together in an application. Callbacks, schedulers, event loops, dependency injection, and the template method are examples of design patterns that follow the inversion of control principle , although the term is most commonly used in the context of object-oriented programming.
Контейнер это как раз хер хобот слона, за который ты сейчас держишься

hVostt
значит IoC это про события

Чушь. Где я такое говорил. Событийная модель - один из авторexamples of design patterns that follow the inversion of control principle
...
Рейтинг: 0 / 0
Инжектить зависимость только в базовом классе, а использовать во всех потомках
    #40048522
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
wikiInversion of control carries the strong connotation that the reusable code and the problem-specific code are developed independently even though they operate together in an application. Callbacks, schedulers, event loops, dependency injection, and the template method are examples of design patterns that follow the inversion of control principle , although the term is most commonly used in the context of object-oriented programming.

Контейнер это как раз хер хобот слона, за который ты сейчас держишься

fkthat
Чушь. Где я такое говорил. Событийная модель - один из авторexamples of design patterns that follow the inversion of control principle


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


fkthat
Чушь. Где я такое говорил. Событийная модель - один из пропущено...


Признаю. Имел в виду DIP, так как мы начали с SOLID-а...


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


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