powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
25 сообщений из 141, страница 4 из 6
Autofac как в любой точке программы получить резолвер ?
    #39183356
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЗачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно.Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183364
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttLTS создаётся как контекст единицы работы в рамках некой транзакционной деятельности приложения (обработка запроса, создание окна, обработка джоба). В прикладном коде и внутри реализации сервисов этого знать не нужно . Никаких обёрток над LTS в прикладной код пролазить не должно, это уже даже не запашок, а конкретная вонища говнокода."Никогда не говори никогда" (ц)

Если умеешь пользоваться мозгом, то не придётся тащить в прикадуху LTS.
В обратном случае я хз. Тащи...
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183365
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КЭти классы решают аналогичную задачу. Ну назови это адаптером, что от этого изменится?

Эти классы решают прямую задачу -- реализуют существующие интерфейсы, они адаптируют контейнер Autofac для инфраструктуры MVC/WebAPIНу правильно. В моём примере происходит адаптация ДИ-контейнера под прикладной код.

hVosttВ конечных приложениях в обёртках нет смысла. Кому в голову придёт в огромном ПО менять Autofac на Unity, или наоборот? Даже если придёт, это делается с одинаковой сложностью как с обёртками, так и без.Это тема для размышления. Я бы не стал утверждать, что всегда и везде это так или не так.

В моём случае спрятать ДИ-контейнер за абстракцией мне ничего не стоило, поэтому это было сделано "на всякий случай".
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183372
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttЗачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно.Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем?

Не так это как? Создаёшь некую стратегию типа Owner Single Instance Per All Lifetimes, и джобы как незнали ничего про LTS, так и продолжают не знать.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183374
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВ моём случае спрятать ДИ-контейнер за абстракцией мне ничего не стоило, поэтому это было сделано "на всякий случай".

Func<T> решает эту задачу за тебя
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183380
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу правильно. В моём примере происходит адаптация ДИ-контейнера под прикладной код.

Зачем прикладному коду вообще контейнер? Даже в обёртке? Ну то есть я понимаю, что гораздо проще не напрягая мозг дать прикладухе весь резолвер, вместо продумывания архитектуры. Пусть прикладной код сам резолвит что хочет и когда хочет, и сам LTS создаёт, сам их убивает, пофигу вообще. Нафига вообще думать?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183418
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЗачем прикладному коду вообще контейнер? Даже в обёртке? Ну то есть я понимаю, что гораздо проще не напрягая мозг дать прикладухе весь резолвер, вместо продумывания архитектуры. Пусть прикладной код сам резолвит что хочет и когда хочет, и сам LTS создаёт, сам их убивает, пофигу вообще. Нафига вообще думать? Тебе это не надо, расслабься.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183419
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем?

Не так это как? Создаёшь некую стратегию типа Owner Single Instance Per All Lifetimes, и джобы как незнали ничего про LTS, так и продолжают не знать.Нет.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183586
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Вы так и не ответили, как вы в своем решении работаете с временными-скопами.

Я так понимаю, что фабрику-обертку можно написать двумя способами:
Как указал Алексей К. 18882170 - через универсальный GetServices.
Либо как указал я 18884017 - через явное указание IService1 ResolveService1 (){}

В первом случае мне не ясно как вообще обеспечить защиту от GOD MODE ?
Разве что создавать разные IServiceProviderEx , конфигурировать их разным набором классов. Чтобы один мог резолвить только те, а другой только эти. Остается правда вопрос настройки взаимодействия объектов порожденных разными резолверам. И каждый раз при добавлении нового типа пройтись по резолверам и настроить права доступа. И если это никак не документировать то потом попробуй найди кто за что отвечает (в какой из десятка резолверов внедрить компонент). Вам знаком термин "dll hell" ? Думаю наступит именно он, если будет куча резолверов.

Во втором случае, в добавок к описанным строкой выше проблемам, начинаются проблемы с LifetimeScope.

Оба решения сложны в применении и, полагаю, существенно усложнят разработку программы и ее поддержку.

Говорите, что еще якобы сложность тестирования наступает, если передавать IDependencyResolver.
Но в чем сложность ? Замокайте IDependencyResolver который передается, и все. Можно хоть всю цепочку резолвинга замокать - чтобы мок генерил другой мок который сгенерит уже тестовый объект, который и будет применяться в тестировании.

Соглашусь, что есть риск, что какая-то сторонняя либа сможет получить IDependencyResolver после чего сможет делать что угодно. Но с другой стороны у нас получается сложность поддержки. Не знаю что выбрать из двух зол.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183604
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekМожно хоть всю цепочку резолвинга замокать - чтобы мок генерил другой мок который сгенерит уже тестовый объект, который и будет применяться в тестировании

это уже трешак
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183605
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekhVostt,

Вы так и не ответили, как вы в своем решении работаете с временными-скопами.Он считает, что временные скопы в прикладном коде никому не нужны. В его мире нужны только те скопы, которые привязаны к системным событиям, вроде HTTP-запроса.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183607
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще интересно, какой-нить содержательный пример, когда надо разный LifetimeScope можно привести?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183609
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

* Dependency hell
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183614
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-Ленин,

Ну вон статейка как раз про это.
http://blog.ploeh.dk/2014/06/02/captive-dependency/

Да любой пример, когда долгоживущий объект должен использовать короткоживущие. Если не уследить, будет примерна та же проблема, что с делегатами, которые как веревочка не дают удалить большой объект, С делегатами решается через слабые ссылки конечно, но говорим сейчас про DI - где для этого, вроде бы, и придуман LifetimeScope.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183619
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя с Dependency hell я пожалуй загнул. Это не та проблема :)
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183621
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОн считает, что временные скопы в прикладном коде никому не нужны
в прикладном -да, не нужны. только в инфраструктурном, причём без всякой привязки к HTTP и т п

потроха запуска джоба, транзацкии, команды, открытия формы и т д - это не прикладой код
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183665
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КОн считает, что временные скопы в прикладном коде никому не нужны
в прикладном -да, не нужны. только в инфраструктурном, причём без всякой привязки к HTTP и т пВ 99% случаев - да. Но 1% всегда остаётся, про него и речь.

Изопропилпотроха запуска джоба, транзацкии, команды, открытия формы и т д - это не прикладой кодДа.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183681
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилпричём без всякой привязки к HTTP и т пА как по другому. Можно пример для веб-сервера?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183682
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНо 1% всегда остаётся, про него и речь.
Что за процент - поясни на примерах
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183689
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь.
Что за процент - поясни на примерах

per-request lifetime support это прикладной или инфраструктурный код ? я уже запутался :)
Вот это нужно. После обработки каждого входящего запроса сервер будет чистить сгенеренный мусор.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183701
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь.
Что за процент - поясни на примерахНу оказалось, что нужно создавать несколько DbContext в джобе. Ради одного джоба менять системный код нет желания.

Я не понимаю, что плохого в том, что в прикладном коде есть абстракция LifetimeScope. Чему это противоречит?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183716
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПосле обработки каждого входящего запроса сервер будет чистить сгенеренный мусор.
инфракструктурный.

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


ЗЫ что за сервер и есть ли там вообще какой-нибудь MVC - значения не имеет
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183761
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь.
Что за процент - поясни на примерах

LifetimeScope чтобы в принципе существует, чтобы контролировать время жизни объектов. Это просто более высокоуровневая абстракция над IDisposable.
В принципе, наверное, можно обойти без передачи LifetimeScope пользовательскому коду.
Просто в этом случае нужно конфигурировать резолвинг объекта, указав, что "освобождаться он будет вне контейнера":
IRegistrationBuilder.ExternallyOwned Method
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183766
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу оказалось, что нужно создавать несколько DbContext в джобе.
и чем эти дополнительные дбконтексты отличаются от прочих инжектируемых объектов?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183824
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вы привязались к этому Autofac?
На эту страницу без слез не взглянешь!
...
Рейтинг: 0 / 0
25 сообщений из 141, страница 4 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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