|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttЗачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно.Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:50 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttLTS создаётся как контекст единицы работы в рамках некой транзакционной деятельности приложения (обработка запроса, создание окна, обработка джоба). В прикладном коде и внутри реализации сервисов этого знать не нужно . Никаких обёрток над LTS в прикладной код пролазить не должно, это уже даже не запашок, а конкретная вонища говнокода."Никогда не говори никогда" (ц) Если умеешь пользоваться мозгом, то не придётся тащить в прикадуху LTS. В обратном случае я хз. Тащи... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КЭти классы решают аналогичную задачу. Ну назови это адаптером, что от этого изменится? Эти классы решают прямую задачу -- реализуют существующие интерфейсы, они адаптируют контейнер Autofac для инфраструктуры MVC/WebAPIНу правильно. В моём примере происходит адаптация ДИ-контейнера под прикладной код. hVosttВ конечных приложениях в обёртках нет смысла. Кому в голову придёт в огромном ПО менять Autofac на Unity, или наоборот? Даже если придёт, это делается с одинаковой сложностью как с обёртками, так и без.Это тема для размышления. Я бы не стал утверждать, что всегда и везде это так или не так. В моём случае спрятать ДИ-контейнер за абстракцией мне ничего не стоило, поэтому это было сделано "на всякий случай". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttЗачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно.Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем? Не так это как? Создаёшь некую стратегию типа Owner Single Instance Per All Lifetimes, и джобы как незнали ничего про LTS, так и продолжают не знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КВ моём случае спрятать ДИ-контейнер за абстракцией мне ничего не стоило, поэтому это было сделано "на всякий случай". Func<T> решает эту задачу за тебя ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:57 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНу правильно. В моём примере происходит адаптация ДИ-контейнера под прикладной код. Зачем прикладному коду вообще контейнер? Даже в обёртке? Ну то есть я понимаю, что гораздо проще не напрягая мозг дать прикладухе весь резолвер, вместо продумывания архитектуры. Пусть прикладной код сам резолвит что хочет и когда хочет, и сам LTS создаёт, сам их убивает, пофигу вообще. Нафига вообще думать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:59 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttЗачем прикладному коду вообще контейнер? Даже в обёртке? Ну то есть я понимаю, что гораздо проще не напрягая мозг дать прикладухе весь резолвер, вместо продумывания архитектуры. Пусть прикладной код сам резолвит что хочет и когда хочет, и сам LTS создаёт, сам их убивает, пофигу вообще. Нафига вообще думать? Тебе это не надо, расслабься. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 11:17 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем? Не так это как? Создаёшь некую стратегию типа Owner Single Instance Per All Lifetimes, и джобы как незнали ничего про LTS, так и продолжают не знать.Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 11:18 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, Вы так и не ответили, как вы в своем решении работаете с временными-скопами. Я так понимаю, что фабрику-обертку можно написать двумя способами: Как указал Алексей К. 18882170 - через универсальный GetServices. Либо как указал я 18884017 - через явное указание IService1 ResolveService1 (){} В первом случае мне не ясно как вообще обеспечить защиту от GOD MODE ? Разве что создавать разные IServiceProviderEx , конфигурировать их разным набором классов. Чтобы один мог резолвить только те, а другой только эти. Остается правда вопрос настройки взаимодействия объектов порожденных разными резолверам. И каждый раз при добавлении нового типа пройтись по резолверам и настроить права доступа. И если это никак не документировать то потом попробуй найди кто за что отвечает (в какой из десятка резолверов внедрить компонент). Вам знаком термин "dll hell" ? Думаю наступит именно он, если будет куча резолверов. Во втором случае, в добавок к описанным строкой выше проблемам, начинаются проблемы с LifetimeScope. Оба решения сложны в применении и, полагаю, существенно усложнят разработку программы и ее поддержку. Говорите, что еще якобы сложность тестирования наступает, если передавать IDependencyResolver. Но в чем сложность ? Замокайте IDependencyResolver который передается, и все. Можно хоть всю цепочку резолвинга замокать - чтобы мок генерил другой мок который сгенерит уже тестовый объект, который и будет применяться в тестировании. Соглашусь, что есть риск, что какая-то сторонняя либа сможет получить IDependencyResolver после чего сможет делать что угодно. Но с другой стороны у нас получается сложность поддержки. Не знаю что выбрать из двух зол. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:38 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekМожно хоть всю цепочку резолвинга замокать - чтобы мок генерил другой мок который сгенерит уже тестовый объект, который и будет применяться в тестировании это уже трешак ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekhVostt, Вы так и не ответили, как вы в своем решении работаете с временными-скопами.Он считает, что временные скопы в прикладном коде никому не нужны. В его мире нужны только те скопы, которые привязаны к системным событиям, вроде HTTP-запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
а вообще интересно, какой-нить содержательный пример, когда надо разный LifetimeScope можно привести? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:54 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленин, Ну вон статейка как раз про это. http://blog.ploeh.dk/2014/06/02/captive-dependency/ Да любой пример, когда долгоживущий объект должен использовать короткоживущие. Если не уследить, будет примерна та же проблема, что с делегатами, которые как веревочка не дают удалить большой объект, С делегатами решается через слабые ссылки конечно, но говорим сейчас про DI - где для этого, вроде бы, и придуман LifetimeScope. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:00 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Хотя с Dependency hell я пожалуй загнул. Это не та проблема :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КОн считает, что временные скопы в прикладном коде никому не нужны в прикладном -да, не нужны. только в инфраструктурном, причём без всякой привязки к HTTP и т п потроха запуска джоба, транзацкии, команды, открытия формы и т д - это не прикладой код ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КОн считает, что временные скопы в прикладном коде никому не нужны в прикладном -да, не нужны. только в инфраструктурном, причём без всякой привязки к HTTP и т пВ 99% случаев - да. Но 1% всегда остаётся, про него и речь. Изопропилпотроха запуска джоба, транзацкии, команды, открытия формы и т д - это не прикладой кодДа. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:22 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Изопропилпричём без всякой привязки к HTTP и т пА как по другому. Можно пример для веб-сервера? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерах ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:31 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерах per-request lifetime support это прикладной или инфраструктурный код ? я уже запутался :) Вот это нужно. После обработки каждого входящего запроса сервер будет чистить сгенеренный мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:37 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерахНу оказалось, что нужно создавать несколько DbContext в джобе. Ради одного джоба менять системный код нет желания. Я не понимаю, что плохого в том, что в прикладном коде есть абстракция LifetimeScope. Чему это противоречит? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:41 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekПосле обработки каждого входящего запроса сервер будет чистить сгенеренный мусор. инфракструктурный. Прикладной обработчик запроса не знает, откуда взялись параметры конструкторов и методов, кто и как установил свойства. ЗЫ что за сервер и есть ли там вообще какой-нибудь MVC - значения не имеет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:47 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерах LifetimeScope чтобы в принципе существует, чтобы контролировать время жизни объектов. Это просто более высокоуровневая абстракция над IDisposable. В принципе, наверное, можно обойти без передачи LifetimeScope пользовательскому коду. Просто в этом случае нужно конфигурировать резолвинг объекта, указав, что "освобождаться он будет вне контейнера": IRegistrationBuilder.ExternallyOwned Method ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 14:19 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНу оказалось, что нужно создавать несколько DbContext в джобе. и чем эти дополнительные дбконтексты отличаются от прочих инжектируемых объектов? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 14:24 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Что вы привязались к этому Autofac? На эту страницу без слез не взглянешь! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 15:01 |
|
|
start [/forum/topic.php?fid=20&msg=39183824&tid=1400755]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 145ms |
0 / 0 |