powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
141 сообщений из 141, показаны все 6 страниц
Autofac как в любой точке программы получить резолвер ?
    #39181423
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Такой вопрос.

В AspNet приложении IDependencyResolver устанавливается на старте приложения. В любой момент можно запросить IDependencyResolver.Current и зарезолвить себе все, что нужно.
Для Autofac для этого есть AutofacDependencyResolver.

Вопрос.
Как подобное реализуется в других приложениях: консоли, WebForms и т.д. ?
IDependencyResolver там нету. Как в любой точке программы получить доступ к Autofac и зарезолвить что-то ?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39181733
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изменю (дополню) вопрос !

Меня даже интересует не просто IDependencyResolver, а ILifetimeScope. Как его получить в любой точке программы ?

Возьмем для примера вот этот класс TransactionScope

Я могу в любом месте программы написать так:
Код: c#
1.
2.
3.
4.
5.
using (var transactionScope = new TransactionScope(TransactionScopeOption.Requires)
{
   //код внутри транзакции
   transactionScope.Complete();
}


все будет работать отлично. Если при выполнении этого кода будет "окружающая транзакция" она будет взята и использована.

Есть ли в Autofac что-то подобное ?

Или мне нужно через 10 уровней тянуть ILifetimeScope, чтобы использовать его только на 11м ?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182084
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже надо третий раз сформулировать. желательно с примером кода
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182197
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлично, то что подняли тему. Как раз собирался сам. У меня правда Ninject, но думаю суть дела не меняет.
Вот я нашел такие два примера... 2ой пример наверное ответ на Ваш вопрос.
Мой же вопрос как будет правильнее использовать IoC. Второй вариант не нарушает каких либо принципов ...

[SRC C# Первый вариант]
public class Applications : IApplications
{
private readonly IDbContextApplicationsStore db;
private readonly IMapper mapper;
public Applications(IDbContextApplicationsStore Db, IMapper Mapper)
{
db = Db;
mapper = Mapper;
}
}
[/SRC]
[SRC C# Второй ваиант]
var users = (IUsers)DependencyResolver.Current.GetService(typeof(IUsers));
[/SRC]
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182200
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все тоже самое только с разметкой

Отлично, то что подняли тему. Как раз собирался сам. У меня правда Ninject, но думаю суть дела не меняет.
Вот я нашел такие два примера... 2ой пример наверное ответ на Ваш вопрос.
Мой же вопрос как будет правильнее использовать IoC. Второй вариант не нарушает каких либо принципов ...

Первый вариант
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Applications : IApplications
{
private readonly IDbContextApplicationsStore db;
private readonly IMapper mapper;
public Applications(IDbContextApplicationsStore Db, IMapper Mapper)
{
db = Db;
mapper = Mapper;
}
}


Второй ваиант
Код: c#
1.
var users = (IUsers)DependencyResolver.Current.GetService(typeof(IUsers));
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182204
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GВторой вариант не нарушает каких либо принципов

говорят, что это антипаттерн ServiceLocator, но лично на мой взгляд - вполне себе вариант.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182210
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G,

DependencyResolver же в сборке System.Web.Mvc ! Вы предлагаете ее загружать в ВинФормы ?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182237
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek
Я могу в любом месте программы написать так:
Код: c#
1.
2.
3.
4.
5.
using (var transactionScope = new TransactionScope(TransactionScopeOption.Requires)
{
   //код внутри транзакции
   transactionScope.Complete();
}



Там все тянется через локальные данные потока.

P. S. нафига вам вообще сдались эти IoC контейнеры? Никчемная новомодная штучка.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182242
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekАртем G,

DependencyResolver же в сборке System.Web.Mvc ! Вы предлагаете ее загружать в ВинФормы ?

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


Владимир Путин-ЛенинАртем GВторой вариант не нарушает каких либо принципов

говорят, что это антипаттерн ServiceLocator, но лично на мой взгляд - вполне себе вариант.

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

говорят, что это антипаттерн ServiceLocator, но лично на мой взгляд - вполне себе вариант.

В MVC так и используется. Вроде все ок.
При старте приложения задается DependencyResolver, а затем, в любой точке можно запросить этот DependencyResolver.Current и работать с ним.

Собственно мой вопрос в том и заключается: как работать в WinForms. Как там, в любой точке программы получить аналог DependencyResolver, или что там в ВинФормах вместо этого.


Не соглашусь, что это сервис локатор.
Это просто глобальная статическая переменная на DependencyResolver. Дальше он уже используется как IOC контейнер, как и положено, типы резолвятся через него.
Это гораздо лучше, чем во все существующие классы передавать DependencyResolver :)
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182257
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНе использовать резолвер, не использовать сервис локатор. Не искать способы получить статический резолвер.
Никакой не вполне себе, сервис локатор — зло. По опыту ничего хорошего ни для разработки, ни для сопровождения, ни тем более для тестирования. Зло по всем параметрам.

Вы предлагаете не использовать IOC ? Резолвер ведь это и есть IOC Container.

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

Я не использую ни в одном из своих MVC приложениях. Ни в одном, при том, что приложения построены полностью на DI.

И как это так у меня получается????

ProBiotekСобственно мой вопрос в том и заключается: как работать в WinForms. Как там, в любой точке программы получить аналог DependencyResolver, или что там в ВинФормах вместо этого.

Решать тебе конечно. Я лишь говорю, что тебе это не нужно.

ProBiotekНе соглашусь, что это сервис локатор.

Не важно, согласен ты с этим или нет, но это сервис локатор.

ProBiotekЭто просто глобальная статическая переменная на DependencyResolver. Дальше он уже используется как IOC контейнер, как и положено, типы резолвятся через него.

Это и есть сервис локатор.


ProBiotekЭто гораздо лучше, чем во все существующие классы передавать DependencyResolver :)

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

да не. штука очень полезная. просто если в той же MVC зависимости контроллеров резолвятся "за кадром" - там сама инфраструктура для этого заточена, просто передавай интерфейсы в конструктор, то в других приложениях такой может не быть. и делать её только для того чтобы "было как в MVC" - по-моему, перебор
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182283
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekВы предлагаете не использовать IOC ? Резолвер ведь это и есть IOC Container.

Я предлагаю использовать DI, который реализует принцип IoC.


ProBiotekИ как вы предлагаете обходится без статического резолвера ?

Легко. В ASP.NET MVC контроллеры создаются из контейнера, в конструкторе контроллера перечисляются интерфейсы, которые нужны ему для работы, и контейнер их туда подставляет. И так далее по цепочке. Нигде не нужен статический резолвер, нигде не нужно обращаться к контейнеру напрямую.

Советую изучить вопрос.


ProBiotekВ MVC то он есть, разработчики MVC и все кто этим пользуются глупцы ?

Естественно он есть, я не говорил, что контейнера нет. Я про то, что не надо его использовать. Вообще.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182300
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-ЛенинЕвгенийВНикчемная новомодная штучка.

да не. штука очень полезная. просто если в той же MVC зависимости контроллеров резолвятся "за кадром" - там сама инфраструктура для этого заточена, просто передавай интерфейсы в конструктор, то в других приложениях такой может не быть. и делать её только для того чтобы "было как в MVC" - по-моему, перебор

Пример использования в веб-формсах:

Код: c#
1.
2.
3.
4.
5.
6.
7.
var container = ... // build container

using(var mainForm = container.Resolve<MainForm>())
{
   mainForm.Show();
   ...
}



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

Вот вы все так интересно расписываете. и ваш подход явно отличается от общепринятого подхода (тот же глобальный IDependencyResolver). Не ясно правда чем ваш подход лучше.

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

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

P. S. нафига вам вообще сдались эти IoC контейнеры? Никчемная новомодная штучка.

Сдались, потому что решают ряд проблем и позволяют сосредоточиться на бизнес-задачах. Возможность что-то там В ЛЮБОМ месте написать это не лень продумать архитектуру, увесистая грабля для сопровождения и развития проекта, и практическая невозможность обеспечить вменяемое тестирование продукта и объяснение его поведения, любого участка кода.

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

Другое дело, если всем глубоко положить на качество продукта и его дальнейшую судьбу... в таком случае я считаю что бессмысленно что-то обсуждать на тему «как лучше».
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182325
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekВот вы все так интересно расписываете. и ваш подход явно отличается от общепринятого подхода (тот же глобальный IDependencyResolver). Не ясно правда чем ваш подход лучше.

Это не мой подход.

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

ProBiotekМожете ли вы поделить каким-то своим мелким проектом, для изучения и повышения своей квалификации ? :) Если не против, скиньте мне на почту ProBiotek@yandex.ru плиз. Может научусь чему то классному :)

Сначала изучи вопрос, литературы и информации в сети дофига.

https://www.google.ru/?gfe_rd=cr&ei=FFrVVrzwJoTAtAGIqJCQBA&gws_rd=ssl#q=dependency injection C#&safe=off&tbs=lr:lang_1ru&lr=lang_ru
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182328
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekи ваш подход явно отличается от общепринятого подхода
общепринятый как раз у hVostt
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182332
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилProBiotekи ваш подход явно отличается от общепринятого подхода
общепринятый как раз у hVostt

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

общепринятый как раз у hVostt

Ты тоже тока из берлоги вчера вылез?

а что, общепринятым нынче является сеять зависимость от контейнера по всему говнокоду?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182342
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Как можно гарантировать, что такой-то класс будет делать только то, что от него требуется, если в любом месте кода можно обратиться куда угодно, получить какой угодно сервис и выполнить любой код?
Предложи свою реализацию свойства HttpContext.Current?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182358
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила что, общепринятым нынче является сеять зависимость от контейнера по всему говнокоду?

Какого ещё контейнера? Разрабатываемые компоненты вообще знать не знают ни о каком контейнере. Благодаря этому они отлично тестируются, их поведение предсказуемое и очевидное: например, если некий компонент не получает ссылку на IEmailService, то очевидно, что почту он отправлять не будет. А запрет использования всяких статических резолверов даёт гарантию, что так оно и будет.

Ты тоже не в курсе что такое DI и как он работает?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182359
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВПредложи свою реализацию свойства HttpContext.Current?

Зачем? В контроллерах доступен контекст запроса, в фильтрах доступен контекст запроса, зачем я буду лезть в HttpContext.Current? Я что, враг себе?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182366
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТы тоже не в курсе что такое DI и как он работает?
ты меня с топискартером перепутал - выдохни
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182371
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилhVosttТы тоже не в курсе что такое DI и как он работает?
ты меня с топискартером перепутал - выдохни

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

https://www.google.ru/?gfe_rd=cr&ei=FFrVVrzwJoTAtAGIqJCQBA&gws_rd=ssl#q=dependency injection C#&safe=off&tbs=lr:lang_1ru&lr=lang_ru

Ну это то я уже давно изучил. Использую Autofac. Читал книгу Марка Сиимана.

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

особенно хотелось бы глянуть, как у вас там все "тестируемое" благодаря такому подходу. Нет, мне правда очень очень интересно ! А то я может прозябаю в каменном веке, пока вы там уже бороздите просторы большого театра.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182385
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу а чего ты придумываешь про какую-то зависимость от контейнера по всему коду? Не знаешь как DI устроен? В этом и суть, что зависимости от контейнера нет
это не я , а топикстартер придумал. Да ещё объявил общепринятым подходом.
внимательно прочитай мой мой первый пост в этом топике.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182390
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekкак у вас там все "тестируемое" благодаря такому подходу

очень просто: ServiceLocator это завуалированный new со всеми вытекающими
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182393
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Так как надо тогда ? Покажите уже пример проектика.
Я считал, что использовать IDependencyResolver.Current это норма. Так вроде и работают с Аутофаком. Может я что-то упустил.

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

А, тогды сорри
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182405
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekИли мне нужно через 10 уровней тянуть ILifetimeScope, чтобы использовать его только на 11м ?Ну инжектируй ILifetimeScope так же, как ты инжектируешь другие сервисы.

зы: Попробуй поработать с TransactionScope в паре с async / await. Расскажешь потом...
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182406
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Спасибо за ответы ...
вот теория
IoC (Inversion of control/инверсия зависимостей) реализуется с помощью:
1) DI (Dependency Injection/инъекция зависимости) через: - 1. A constructor injection; - 2. Parameter injection; - 3. A setter injection; - 4. An interface injection
2) IoC container через: Castle, Ninject, Autofac и др.
3) Service Locator (не путать с контейнером, ps. пункт 2, хотя очень похожи)



ок с пунктом 3 понятно ... зло. я правильно понял IDependencyResolver = Service Locator ?

правильно понимаю что хорошим тоном будет использования DI + IoC container ?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182410
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилhVosttпропущено...


Ты тоже тока из берлоги вчера вылез?

а что, общепринятым нынче является сеять зависимость от контейнера по всему говнокоду?Обёртка вокруг контейнера пишется за 5 минут.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182412
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЛегко. В ASP.NET MVC контроллеры создаются из контейнера, в конструкторе контроллера перечисляются интерфейсы, которые нужны ему для работы, и контейнер их туда подставляет. И так далее по цепочке. Нигде не нужен статический резолвер, нигде не нужно обращаться к контейнеру напрямую.Если только не захочется создать вложенный LifetimeScope.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182417
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekНу это то я уже давно изучил. Использую Autofac. Читал книгу Марка Сиимана.

Не похоже как-то.

Суть IoC — уменьшить количество зависимостей.

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

Потом, все твои компоненты ЗНАЮТ про резолвер и обращаются к нему. Теперь каждый компонент в любом месте может получить что угодно внутри реализации и ты об этом даже не узнаешь. Т.е. любая часть кода у тебя обладает возможностью GOD MODE, делаю что хочу, когда хочу, и где хочу.

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

Спасибо за ответы ...
вот теория
IoC (Inversion of control/инверсия зависимостей) реализуется с помощью:
1) DI (Dependency Injection/инъекция зависимости) через: - 1. A constructor injection; - 2. Parameter injection; - 3. A setter injection; - 4. An interface injection
2) IoC container через: Castle, Ninject, Autofac и др.
3) Service Locator (не путать с контейнером, ps. пункт 2, хотя очень похожи)



ок с пунктом 3 понятно ... зло. я правильно понял IDependencyResolver = Service Locator ?

правильно понимаю что хорошим тоном будет использования DI + IoC container ?

тут нет "абсолютного зла/добра". если хочешь получить действительно слабосвязную архитектуру (а зачем?), то однозначно кто-то третий "со стороны" должен резолвить зависимости, иначе это все полумеры (а может они сгодятся?).
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182422
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОбёртка вокруг контейнера пишется за 5 минут.

Говно в своей обёртке. Ок
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182426
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЕсли только не захочется создать вложенный LifetimeScope.

Все подробности реализации упаковываются в архитектурные фабрики.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182430
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

С тем что резолвер использовать не нужно ... это понятно. Получается завязка.

Нужен живой пример. Пример с контроллером ниже он правильный?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class ApplicationsController : Controller
    {
        private readonly IApplications applications;
        private readonly IMapper mapper;
        public ApplicationsController(IApplications Applications, IMapper Mapper)
        {
            mapper = Mapper;
            applications = Applications;
        }
        [HttpGet]
        public ActionResult List()
        {
            var model = mapper.Map<IEnumerable<Application>, IEnumerable<ApplicationViewModel>>(applications.GetApplications(Blocked:false));
            return View(model);
        }
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182431
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttProBiotekНу это то я уже давно изучил. Использую Autofac. Читал книгу Марка Сиимана.

Не похоже как-то.

Суть IoC — уменьшить количество зависимостей.

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

Потом, все твои компоненты ЗНАЮТ про резолвер и обращаются к нему. Теперь каждый компонент в любом месте может получить что угодно внутри реализации и ты об этом даже не узнаешь. Т.е. любая часть кода у тебя обладает возможностью GOD MODE, делаю что хочу, когда хочу, и где хочу.

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

Ну а как надо? Теорию я прочитал.
Научили бы, чем шпынять. Это все равно что сказать неучу "ты не понимаешь, читай книги пока сам не изобретешь".

Ну ок, я согласен с тем, что Фабрики ограничат полный доступ к контейнеру. Хотя смотрел пример MVC проектов, где этим не заморачиваются. Билдят один контейнер и пихают его как резолвер. И потом используют по всему проекту.

Так покажите пример как нужно... Хочу правильно делать, а не как сейчас.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182433
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GhVostt,

С тем что резолвер использовать не нужно ... это понятно. Получается завязка.

Нужен живой пример. Пример с контроллером ниже он правильный?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class ApplicationsController : Controller
    {
        private readonly IApplications applications;
        private readonly IMapper mapper;
        public ApplicationsController(IApplications Applications, IMapper Mapper)
        {
            mapper = Mapper;
            applications = Applications;
        }
        [HttpGet]
        public ActionResult List()
        {
            var model = mapper.Map<IEnumerable<Application>, IEnumerable<ApplicationViewModel>>(applications.GetApplications(Blocked:false));
            return View(model);
        }



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

http://docs.autofac.org/en/latest/integration/mvc.html

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var builder = new ContainerBuilder();

  // Register your MVC controllers.
  builder.RegisterControllers(typeof(MvcApplication).Assembly);

  // OPTIONAL: Register model binders that require DI.
  builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
  builder.RegisterModelBinderProvider();

  // OPTIONAL: Register web abstractions like HttpContextBase.
  builder.RegisterModule<AutofacWebTypesModule>();

  // OPTIONAL: Enable property injection in view pages.
  builder.RegisterSource(new ViewRegistrationSource());

  // OPTIONAL: Enable property injection into action filters.
  builder.RegisterFilterProvider();

  // Set the dependency resolver to be Autofac.
  var container = builder.Build();
  DependencyResolver.SetResolver(new AutofacDependencyResolver(container));



Что вы меня то ругаете. Я делал как указано в доке.

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

В контексте обсуждения: правильный. Контроллер зависит от конкретных компонентов и он их как-то получает (через DI), но подробностей о том как он получает свои зависимости ему неизвестны. Всё верно.

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

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

Если вы говорите, что этот подход в корне не верный. Так покажите верный. Плиз.

Ну и? Всё правильно сделал. Теперь можно получать зависимости вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class MyController : Controller
{
    public MyController(ISomeOneService s1, ISomeTwoService s2)
    {
       // s1 и s2 будут автоматически созданы контейнером
       // если у них есть зависимости, они тоже получат инстансы из контейнера
       // использовать DependencyResolver напрямую нигде не надо
    }
}
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182465
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

Ну ок. Мне просто, чаще, лень делать лишние прослойки :)
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182473
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

А как в вашем подходе быть с ILifetimeScope ?
Положим в MVC все еще терпимо - там в Autofac создается ILifetimeScope на каждый запрос.

А как быть в обычных WinForms (с которых я и начал тему) ?
Ведь если там не контролировать создание ILifetimeScope явно, то это приведет к тому, что через 10 часов работы программы - будет висеть гектар созданных объектов, которые не будут удалены до завершения программы.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182476
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир Путин-ЛенинАртем GhVostt,

С тем что резолвер использовать не нужно ... это понятно. Получается завязка.

Нужен живой пример. Пример с контроллером ниже он правильный?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class ApplicationsController : Controller
    {
        private readonly IApplications applications;
        private readonly IMapper mapper;
        public ApplicationsController(IApplications Applications, IMapper Mapper)
        {
            mapper = Mapper;
            applications = Applications;
        }
        [HttpGet]
        public ActionResult List()
        {
            var model = mapper.Map<IEnumerable<Application>, IEnumerable<ApplicationViewModel>>(applications.GetApplications(Blocked:false));
            return View(model);
        }



правильный

ОК с DI разобрались ... это правильно


Теперь IoC Container... Подскажите что

Я установил 3 пакета ...
Код: xml
1.
2.
3.
  <package id="Ninject" version="3.2.2.0" targetFramework="net45" />
  <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net45" />
  <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net45" />


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Вот создание карнела
    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }
        private static void RegisterServices(IKernel kernel)
        {
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
        }
    }

Вот подгрузка модулей
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private readonly IKernel kernel;
        public NinjectDependencyResolver(IKernel Kernel)
        {
            kernel = Kernel;
            INinjectModule[] ninjectModules =
            {
                new ApplicationsNinject(),
            };
            kernel.Load(ninjectModules);
        }
        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }
        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }
    }

Вот бидинг
    public class ApplicationsNinject : NinjectModule
    {
        public override void Load()
        {
            Bind<IApplications>().To<Applications>();
        }
    }
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182477
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КЕсли только не захочется создать вложенный LifetimeScope.

Все подробности реализации упаковываются в архитектурные фабрики.Ты читать вообще умеешь?

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

Прочти меня.

Фабрика это не обёртка над контейнером.

Простейшая фабрика: Func<ISomeService>()

Фабрика одного объекта: Lazy<ISomeService>()

Простейшая параметризованная фабрика: Func<string, IConnection>

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

Прочти меня.

Фабрика это не обёртка над контейнером.

Простейшая фабрика: Func<ISomeService>()

Фабрика одного объекта: Lazy<ISomeService>()

Простейшая параметризованная фабрика: Func<string, IConnection>

настройка в каком скопе каждый сервис живёт производится при сборке контейнера. зачем писать какую-то обёртку? более сложная стратегия создания экземпляров опять же может обойтись без ссылки на скоуп. но корневые архитектерные фабрики могут оперировать скоупами, но опять же, это не обёртка. какой смысл обёртки, если цель -- избавиться от зависимости в целом?Называй это как хочешь. Как по мне, так вполне себе "обёртка":
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
    // абстракция
    public interface IServiceProviderEx : IServiceProvider, IDisposable
    {
        IEnumerable<object> GetServices(Type serviceType);

        IServiceProviderEx BeginScope();
    }

    // реализация под Autofac
    public class AppServiceProvider : IServiceProviderEx
    {
        public ILifetimeScope InnerProvider { get; set; }

        public bool IsInnerProviderOwned { get; set; }

        public IServiceProviderEx BeginScope()
        {
            return new AppServiceProvider 
            { 
                InnerProvider = InnerProvider.BeginLifetimeScope(),
                IsInnerProviderOwned = true
            };
        }

        public void Dispose()
        {
            if (IsInnerProviderOwned)
                InnerProvider.Dispose();
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            var types = typeof(IEnumerable<>).MakeGenericType(serviceType);
            return (IEnumerable<object>)InnerProvider.Resolve(types);
        }

        public object GetService(Type serviceType)
        {
            return InnerProvider.IsRegistered(serviceType) ? InnerProvider.Resolve(serviceType) : null;
        }        
    }

    // использование
    class MyService
    {
        public IServiceProviderEx ServiceProvider { get; set; }

        public void Do()
        {
             using(var sp = ServiceProvider.BeginScope())
                  sp.Resolve<MyService2>().Do2();
        }
    }
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182551
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дали им reflection и понеслось :))
Вот зачем каждый объект наследовать от интерфейса + замазать на хз какой фраймворк для внедрения зависимостей и писать через одно место вызов конструкторов?
Ах ну да, модульное тестирование, как учили в автошколе.
Правда ценности от последнего больше ровно на 100 зимбабвийских квачей, чем от просто "код компилируется". По количеству пройденных тестов рп/мп/рр может смотреть, работает программист Вася или сидит в аське.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182556
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВПравда ценности от последнего больше ровно на 100 зимбабвийских квачей , чем от просто "код компилируется"

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

Правда ценности от последнего больше ровно на 100 зимбабвийских квачей, чем от просто "код компилируется". По количеству пройденных тестов рп/мп/рр может смотреть, работает программист Вася или сидит в аське.И без тестирования от IoC/DI достаточно пользы.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182599
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-ЛенинЕвгенийВПравда ценности от последнего больше ровно на 100 зимбабвийских квачей , чем от просто "код компилируется"

100 зимбабвийских квачей - это сколько в граммах?
википедияИнтересные факты
В 2009 году Гидеон Гоно, директор Резервного банка Зимбабве, получил Шнобелевскую премию по математике: в условиях галопирующей гиперинфляции он вынудил всё население своей страны изучить математику путём выпуска купюр номиналами от 1 цента вплоть до 100 триллионов зимбабвийских долларов.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182646
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, я вижу что мы перешли на 3ий лист и скорее всего на мой вопрос уже ответ не дадут... если не против я продублирую
По поводу DI все понятно

Теперь IoC Container... Подскажите пожалуйста все ли верно в коде ниже

Я установил 3 пакета ...

Код: xml
1.
2.
3.
  <package id="Ninject" version="3.2.2.0" targetFramework="net45" />
  <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net45" />
  <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net45" />



Вот создание карнела

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }
        private static void RegisterServices(IKernel kernel)
        {
           [color=red] DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));[/color]
        }
    }



Вот подгрузка модулей

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private readonly IKernel kernel;
        public NinjectDependencyResolver(IKernel Kernel)
        {
            kernel = Kernel;
[color=red]            INinjectModule[] ninjectModules =
            {
                new ApplicationsNinject(),
            };[/color]
            kernel.Load(ninjectModules);
        }
        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }
        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }
    }



Вот бидинг

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class ApplicationsNinject : NinjectModule
    {
        public override void Load()
        {
            Bind<IApplications>().To<Applications>();
        }
    }


...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182718
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GТеперь IoC Container... Подскажите пожалуйста все ли верно в коде нижеЗачем new Bootstrapper() в двух местах?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182746
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КАртем GТеперь IoC Container... Подскажите пожалуйста все ли верно в коде нижеЗачем new Bootstrapper() в двух местах?
Весть код при установке пакета генерится автоматом.
я только добавляю вот эту строчку. Поэтому зачем он в друх местах new это загадка ...
Код: c#
1.
2.
3.
4.
        private static void RegisterServices(IKernel kernel)
        {
           DependencyReoslver.SetResolver(new NinjectDependencyResolver(kernel));
        }



Но для чего я показал код. Как мы выяснили на 1-2ой странице Service Locator это зло ... а DependencyReoslver = Service Locator
Поэтому хочется услышать комментариев и советов ... как же будет "правильнее"
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182762
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GАлексей Кпропущено...
Зачем new Bootstrapper() в двух местах?
Весть код при установке пакета генерится автоматом.
я только добавляю вот эту строчку. Поэтому зачем он в друх местах new это загадка ...Ну я бы разобрался.
Артем G
Код: c#
1.
2.
3.
4.
        private static void RegisterServices(IKernel kernel)
        {
           DependencyReoslver.SetResolver(new NinjectDependencyResolver(kernel));
        }



Но для чего я показал код. Как мы выяснили на 1-2ой странице Service Locator это зло ... а DependencyReoslver = Service Locator
Поэтому хочется услышать комментариев и советов ... как же будет "правильнее"Здесь нет абсолютного зла. Всё имеет свои преимущества и недостатки. Вроде как все возможные варианты в топике уже перечислены. Повторю вкратце.

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

1. Нет возможности инжектировать зависимости через конструктор/свойства. Например, корневой объект всегда создаётся локатором. В твоём случае локатором создаются MVC-контроллеры, для этого и указывается нужная реализация DependencyResolver.

2. Нужно создать LifetimeScope.

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

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

Вкратце вроде всё.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182767
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GВесть код при установке пакета генерится автоматом.Я бы выкинул этот код и написал бы загрузчик с нуля, усложнял бы его по мере необходимости.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182771
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЗачем new Bootstrapper() в двух местах?
Тут обсуждалось!
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182936
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public struct FactoryLifetimeScope :IDisposable
{...}

// это ваша фабрика, которая позволит скрыть контейнер, чтобы никто не мог получить GOD MODE
public class DependencyFactory 
{
   public FactoryLifetimeScope  BeginLifetimeScope (){}

   public IService1 ResolveService1 (){} 
}
...

  using (FactoryLifetimeScope scope = _factory.BeginLifetimeScope )
  {
    scope.ResolveService1(); // но у  FactoryLifetimeScope нету такого метода !
  }



Как вы будете решать эту проблему я не знаю.
А как вы ее решаете сейчас ?
Позвольте угадаю , вы резолвите непосредственно из DependencyResolver ?
После чего получаете классическую проблему Captive Dependency ?


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

Наличие обёртки ничего здесь не решает. Совсем. Дополнительная нафиг не упавшая прослойка. Тебе смотрю совсем заняться нечем

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

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

Фабрики к скоупам не имеют отношения. По какой стратегии компоненту жить определяется при регистрации.

ProBiotek Позвольте угадаю , вы резолвите непосредственно из DependencyResolver ?

Нет, никогда.

ProBiotekПосле чего получаете классическую проблему Captive Dependency ?

Я не создаю ни себе, ни других таких проблем. Поэтому не решаю её.

ProBiotekТ.е. каждый раз когда резолвите что-то, то потом не освобождаете и оно висит все время выполнения программы ?

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


ProBiotekПолагаю вас спасает лишь то, что в MVC LifetimeScope генерится в режиме "на каждый вызов" :)

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

Наличие обёртки ничего здесь не решает. Совсем. Дополнительная нафиг не упавшая прослойка.Обёртка даёт независимость прикладного кода от конкретного ДИ-контейнера. На это ранее уже обращалось внимание.
hVosttОбёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. Ну предложи своё решение, как в прикладном коде создавать LifetimeScope и при этом не зависеть от конкретного ДИ-контейнера.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183263
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttОбёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. Авторы классов AutofacDependencyResolver, AutofacWebApiDependencyResolver, AutofacHostFactory и т. п. больные люди?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183314
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОбёртка даёт независимость прикладного кода от конкретного ДИ-контейнера. На это ранее уже обращалось внимание.

Прикладной код вообще не должен знать про DI контейнер. Нафига эта обёртка? Контейнер используется только в точке входа и регистрации компонентов, там нет никакого смысла в обёртках, так как каждый контейнер используется по-разному. Никакая обёртка не поможет при внезапной замене одного контейнера на другой, это изначально глупая и бесполезная затея.

Ещё раз. Компоненты не должны знать о DI, ни напряму, ни через глупые обёртки. Иначе это фейл, и не умение применять DI.

Алексей КНу предложи своё решение, как в прикладном коде создавать LifetimeScope и при этом не зависеть от конкретного ДИ-контейнера.

Зачем в прикладном коде создавать LTS? Прикладной код не должен ничего знать про DI, не должен знать про LTS, иначе это программирование на кишках, изначально говнокод.

LTS используются при разработке архитектурной платформы приложения, например, в ASP.NET MVC это фабрики фильтров и контроллеров, за их пределами никаких LTS быть не должно, даже запаха.

Для служб и декстопов регистрация по принципу транизентности в рамках овнера, например окна, или джоба, внутри которых опять же кишки LTS нафиг не упали.

LTS создаётся как контекст единицы работы в рамках некой транзакционной деятельности приложения (обработка запроса, создание окна, обработка джоба). В прикладном коде и внутри реализации сервисов этого знать не нужно. Никаких обёрток над LTS в прикладной код пролазить не должно, это уже даже не запашок, а конкретная вонища говнокода.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183318
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttОбёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. Авторы классов AutofacDependencyResolver, AutofacWebApiDependencyResolver, AutofacHostFactory и т. п. больные люди?

При чём же тут обёртки? Где ты их увидел?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183343
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЗачем в прикладном коде создавать LTS?Например, для удобства управления временем жизни EF DbContext.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183344
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
Авторы классов AutofacDependencyResolver, AutofacWebApiDependencyResolver, AutofacHostFactory и т. п. больные люди?

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

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

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

Эти классы решают прямую задачу -- реализуют существующие интерфейсы, они адаптируют контейнер Autofac для инфраструктуры MVC/WebAPI, об этом разработчики майкрософт заранее позаботились.

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

В конечных приложениях в обёртках нет смысла. Кому в голову придёт в огромном ПО менять Autofac на Unity, или наоборот? Даже если придёт, это делается с одинаковой сложностью как с обёртками, так и без.
...
Рейтинг: 0 / 0
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
Autofac как в любой точке программы получить резолвер ?
    #39183834
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЧто вы привязались к этому Autofac?
кто привязался? обсуждение с конкретным контейнером никак не связано
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183874
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Что именно вас там не устраивает ? Список стабильно выходящих релизов с 2011 года ?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39183900
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КНу оказалось, что нужно создавать несколько DbContext в джобе.
и чем эти дополнительные дбконтексты отличаются от прочих инжектируемых объектов?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
// все сервисы и DbContext зарегистрированы как PerScope

class Service1
{
    public AppDbContext Db { get; set; }

    public IServiceProviderEx ServiceProvider { get; set; }

    public void F1()
    {
         // ну так сложилось, что в данном случае нужно иметь разные AppDbContext
         // об стену теперь убиться что ли?

          using (var sp = ServiceProvider.BeginScope())
              sp.Resolve<Service2>().F2();

           using (var sp = ServiceProvider.BeginScope())
              sp.Resolve<Service3>().F3();
    }
}

class Service2
{
      public AppDbContext Db { get; set; }

      public void F2()
      { }
}

class Service3
{
      public AppDbContext Db { get; set; }

      public void F3()
      { }
}


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

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

Я считаю, что скоупы -- это архитектурное решение. В прикладном коде надо решать бизнес-задачи.

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

Я работаю со скопами на уровне архитектуры. Сервисы и прикладной код понятия не имеют ни про какие скоупы -- им это НЕ НУЖНО. Они решают сугубо свои задачи, и ничего больше. В этом и заключается суть, смысл DI.

На кой хрен сдались бы эти DI, IoC, контейнеры, если весь код написан так же, как и с использованием new/using? Не парь мозг, пиши как писали 10 лет назад. И думать особо не надо. Какая разница что будет завтра? Как будут сопровождать этот код, как его тестировать. Наступит завтра и будем решать проблемы завтра.

Пока в это же время другие люди выпускают новые продукты и свежие стабильные версии..


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

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

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

Ё ж моё.... ппц.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184101
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekДа любой пример, когда долгоживущий объект должен использовать короткоживущие.

Долгоживущий объект, использующий короткоживущий, это всё равно что сначала возводить стены, а потом пытаться подсунуть под них фундамент -- действительно -- КАК это сделать? Проблеееема.

Решение -- подумать головой и потратить время на проектирование архитектуры. Сложно? Ну фиг знает что ещё посоветовать.

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

1% решается через стратегии, тот же Autofac отлично расширяется, очень гибкий инструмент. Жаль конечно, что не каждый его осилить может, и тащит всякие скоупы и контейнеры в прикладуху. Что поделать... КЛиника
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184106
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Не надо выбирать зло. Правильное использование DI -- это полнейшее отсутствие зависимости от контейнера, и даже от его обёрток. Полное незнание про DI внутри компонентов.

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

Ну это как ключ от сейфа, который повесили на его ручку... Или пароль, записанный на стикер и приклеенный к монитору.

Несколько DbContext-ов создать легче лёгкого, через Func<IDbContext>. Но это ж надо было подумать.. Думать — не наш метод!
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184109
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей К,

фабрика где-то потерялась - вот и пришлось городить невменяемый IServiceProviderEx"Если я найду потерянную фабрику", то как она инжектирует DbContext в сервисы Service2, Service3 и рекурсивно вглубь их зависимостей?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184119
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу это как ключ от сейфа, который повесили на его ручку... Или пароль, записанный на стикер и приклеенный к монитору.Нужны факты.

hVosttНесколько DbContext-ов создать легче лёгкого, через Func<IDbContext>. Но это ж надо было подумать.. Думать — не наш метод! Будешь таскать DbContext между методами параметром? Много раз уже обсуждалось.

Ambient DbContext vs Explicit DbContext vs Injected Dbcontext
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184125
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

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

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

Решений масса в зависимости от конечных требований.

Например, можно ввести концепцию изолированной команды, которая на уровне архитектуры регистрируется со своим скоупом, ведь нам нужен не только DbContext и и весь стек UOW, который работает как единое пространство зависимости. И это будет архитектурное решение, понятное, сопровождаемое и тестируемое.

Также при необходимости можно раскидать по тредам. А вообще необходимость нескольких DbContext в одной команде — уже конкретно попахивает, и оправдывания дескать «вот здесь именно нужно так» как-то не тянут на аргумент. У любой задачи всегда больше одного решения, и не обязательно выбирать проблемное решение из-за которого надо делать дурно пахнущую дырень в архитектуре.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184138
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КБудешь таскать DbContext между методами параметром? Много раз уже обсуждалось.

Решений масса в зависимости от конечных требований.Я в курсе. В моём случае все остальные решения хуже.
hVosttНапример, можно ввести концепцию изолированной команды, которая на уровне архитектуры регистрируется со своим скоупом, ведь нам нужен не только DbContext и и весь стек UOW, который работает как единое пространство зависимости. И это будет архитектурное решение, понятное, сопровождаемое и тестируемое.

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

Странно, а я думал, что прикладному коду нужны:

- получить данные
- обработать данные
- сохранить данные

с фига ли прикладухе нужен какой-то DbContext контекст?

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

Факт такой: прикладной код не работает с DbContext и не должен.

DbContext всего лишь реализует доступ к данным. В хорошей архитектуре его можно заменить на ISession, DbConnection/DbCommand, или чем угодно другим.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184151
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КФакты будут? Теперь уже в сравнении с альтернативными решениями.

Факт такой: прикладной код не работает с DbContext и не должен.

DbContext всего лишь реализует доступ к данным. В хорошей архитектуре его можно заменить на ISession, DbConnection/DbCommand, или чем угодно другим.Вынос выполнения прикладной логики из БД в моём случае приведёт к недопустимому снижению производительности.

Другими словами, хватит тупить, сказано надо, значит надо.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184158
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВынос выполнения прикладной логики из БД в моём случае приведёт к недопустимому снижению производительности
этого собственно не предлагали.
Предлагали вынести нахер за пределы Service1 потроха создания вложенных Service2 и Service3
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184176
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилПредлагали вынести нахер за пределы Service1 потроха создания вложенных Service2 и Service3В слой инфраструктуры? Можно, но зачем?

И я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...".
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184179
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КВынос выполнения прикладной логики из БД в моём случае приведёт к недопустимому снижению производительности
этого собственно не предлагали. Предлагали . Это приведёт к множеству "N+1 запрос" и прочим неприятностям - мне такого счастья не надо.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184572
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
И я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...".
Вот ИХМО самое толковое объяснение.
Хотя если класс объявить как internal, то нет проблем!
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184582
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИ я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...".

Конкретно уже всё сказали миллион раз множество разных уважаемых людей, в статьях, блогах и книгах.

Основные постулаты:

1. Внесение зависимости от сервис локатора.
2. Жестокое нарушение инкапсуляции.
3. Затруднение, до практической невозможности местами, модульного тестирования.
4. Снижение читабельности кода, так как теперь по сигнатуре невозможно сказать определённо, что может или не может конкретный класс, т.к. доступ к контейнеру означает доступ ко всему, GOD MODE ON.

И это против одного сомнительного профита:

1. Не надо думать об архитектуре, просто пиши код, получай что хочешь и делай что хочешь в любом месте кода.

Сомнительный в данному случае, потому что профитом он кожется только для зелёного новичка, ну или для туповатого программиста со стажем.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184584
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Предлагали . Это приведёт к множеству "N+1 запрос" и прочим неприятностям - мне такого счастья не надо.

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

Выше ты предлагал зависимость от другого интерфейса: изолированной команды". Чем та зависимость хуже этой?
hVostt2. Жестокое нарушение инкапсуляции.Как инкапсуляцию можно нарушить? Ты вообще читаешь что пишешь?
hVostt3. Затруднение, до практической невозможности местами, модульного тестирования.Враньё. При необходимости можно подпихнуть тестовую реализацию IServiceProvider.
hVostt4. Снижение читабельности кода, так как теперь по сигнатуре невозможно сказать определённо, что может или не может конкретный класс, т.к. доступ к контейнеру означает доступ ко всему, GOD MODE ON.Страшилка конца 90-х - эпохи начала поклонения паттернам. Скажи ещё, что все публичные поля нужно обёртывать в свойства - вместе посмеёмся.
hVosttСомнительный в данному случае, потому что профитом он кожется только для зелёного новичка, ну или для туповатого программиста со стажем . Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184879
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Не нужно банить - серьезно, дискутировать не с кем будет. Здесь на форуме и так 3-5 людей кто отвечает на вопросы...
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184886
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВАлексей КИ я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...".
Вот ИХМО самое толковое объяснение.
Хотя если класс объявить как internal, то нет проблем!Стандартная страшилка, ничего особенного. Причём некоторые страхи связаны с тем, что ServiceLocator описан статическим классом. Я же предлагаю инжектировать IServiceProvider аналогично другим зависимостям. Это многое меняет.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39184892
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GАлексей К,

Не нужно банить - серьезно, дискутировать не с кем будет. Здесь на форуме и так 3-5 людей кто отвечает на вопросы...Ну не банить, предупредить хотя бы. :-)
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185326
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хвоста банить?! с дубу рухнули. тут останется тогда один скайна
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185351
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а были времена и МСУ тут ошивался
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185372
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttСомнительный в данному случае, потому что профитом он кожется только для зелёного новичка, ну или для туповатого программиста со стажем . Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего.
ИМХУ сказано нейтрально, банить не за что. Если ты лично сам на себя эти слова спроецировал и обиделся - тут не виноват тот кто это сказал.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185467
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу есть зависимость от какого-то там интерфейса, описанного в системном слое. Ужас-то в чём?

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

Ужас в том, что ты либо прикидываешься, либо до тебя 2+2 является сложнейшей концепцией для понимания.

Алексей ККак инкапсуляцию можно нарушить? Ты вообще читаешь что пишешь?

Если компонент обладает доступом к контейнеру, его больше нельзя считать изолированным. Он теперь может всё — зарезолвить любой компонент и выполнить любое действие, и контролировать его теперь нельзя. Никаких гарантий давать нельзя. Всё сломать может любой компонент. Разработчик компонента, который не должен лезть в базу данных, с контейнером может легко накласть на это «не должен» и никто этого не узнает до поры до времени.

Алексей КВраньё. При необходимости можно подпихнуть тестовую реализацию IServiceProvider.

Когда начнёшь покрывать код тестами, тогда и поговорим.

Алексей КСтрашилка конца 90-х - эпохи начала поклонения паттернам. Скажи ещё, что все публичные поля нужно обёртывать в свойства - вместе посмеёмся.

Мда... публичные поля... Я бы посмеялся, если бы не было так грустно. А вроде ты давно как уже в разработке. Неужели самому не интересно двигаться дальше в профессиональном смысле? Что на уровне студента-то у тебя всё? Неужели устраивает? Эээхх...

Алексей К Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего.

Нет смысла хамить, у меня аргументов вагон, а у тебя какие-то наивные детско-студенческие «нехочу-небуду-ненравится». Ну и ладно, чо.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185521
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил Канта были времена и МСУ тут ошивалсяСогласен, зря его выгнали.Dima TАлексей Кпропущено...
Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего.
ИМХУ сказано нейтрально, банить не за что. Если ты лично сам на себя эти слова спроецировал и обиделся - тут не виноват тот кто это сказал.Он сказал, что все кто с ним не согласны являются дословно: "зелёного новичка, ну или для туповатого программиста со стажем". Я с ним не согласен, почему я не должен это воспринимать в свой адрес?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185523
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСмысл в новой зависимости, при чём жёсткой. Захочешь перетащить компонент в другой проект, придётся тащить за ним контейнер.В новом проекте не будет контейнера, поддерживающего скоупы?
hVosttЕсли компонент обладает доступом к контейнеру, его больше нельзя считать изолированным. Он теперь может всё — зарезолвить любой компонент и выполнить любое действие, и контролировать его теперь нельзя. Разработчик компонента, который не должен лезть в базу данных, с контейнером может легко накласть на это «не должен» и никто этого не узнает до поры до времени.Чем инжектирование зависимостей в конструктор/свойства принципиально отличается от запроса через локатор? Заресольвить зависимость любого доступного типа можно и через инжектирование. В этом отношении здесь нет никакой разницы.
hVosttНет смысла хамить, у меня аргументов вагон Сам себя хвалишь?
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185563
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВ новом проекте не будет контейнера, поддерживающего скоупы?

В новом проекте может быть что угодно, при правильной разрабокте, компонент можно дёрнуть в другой проект и использовать его вообще в new / using, или с другим контейнером, и вообще в другой архитектуре.

Это ж очевидно...

Алексей КЧем инжектирование зависимостей в конструктор/свойства принципиально отличается от запроса через локатор? Заресольвить зависимость любого доступного типа можно и через инжектирование. В этом отношении здесь нет никакой разницы.

Инжектирование, это внешнее разрешение зависимостей, компонент не знает о том, как зависимости будут ему предоставлены.

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

Разница -- просто космос. Ты уж извини меня, и не сочти за хамство, но: ты реально не способен осилить простейшую даже для новичков тему? Чего так жёстко тупишь?


Алексей КСам себя хвалишь?

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

В новом проекте может быть что угодно, при правильной разрабокте, компонент можно дёрнуть в другой проект и использовать его вообще в new / using, или с другим контейнером, и вообще в другой архитектуре.

Это ж очевидно...Реализовать IServiceProvider для тех единичных случаев можно и без полноценного ДИ-контейнера.

"Это ж очевидно..." (ц)
hVosttАлексей КЧем инжектирование зависимостей в конструктор/свойства принципиально отличается от запроса через локатор? Заресольвить зависимость любого доступного типа можно и через инжектирование. В этом отношении здесь нет никакой разницы.

Инжектирование, это внешнее разрешение зависимостей, компонент не знает о том, как зависимости будут ему предоставлены.

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

Разница -- просто космос. Ты уж извини меня, и не сочти за хамство, но: ты реально не способен осилить простейшую даже для новичков тему? Чего так жёстко тупишь?
Я тебе отвечал про отсутствие разницы применительно к этому твоему утверждению:
авторЕсли компонент обладает доступом к контейнеру, его больше нельзя считать изолированным. Он теперь может всё — зарезолвить любой компонент и выполнить любое действие, и контролировать его теперь нельзя. Никаких гарантий давать нельзя. Всё сломать может любой компонент. Разработчик компонента, который не должен лезть в базу данных, с контейнером может легко накласть на это «не должен» и никто этого не узнает до поры до времени.Выходи уже из судорога!
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185641
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КРеализовать IServiceProvider для тех единичных случаев можно и без полноценного ДИ-контейнера.

"Это ж очевидно..." (ц)

Надо тащить IServiceProvider, и реализовывать его в том объёме, как этого требует компоненты. Таким образом мы получили ещё +1 зависимость. Браво!


Алексей КЯ тебе отвечал про отсутствие разницы применительно к этому твоему утверждению:
Алексей КВыходи уже из судорога!

Аргументация будет? Или очередные инсинуации с красноречием?

Почитай, что такое инкапсуляция. Если ты изначально клал на паттерны, теорию и принципы программирования, то о чём мы тогда вообще разговариваем? Иди клади дальше, не пудри людям мозги.
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185645
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАргументация будет?Больше пока не будет. Удачи!
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39185659
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttАргументация будет?Больше пока не будет. Удачи!

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

Не поверишь, но я даже в JavaScript все оборачиваю в свойства :)
...
Рейтинг: 0 / 0
141 сообщений из 141, показаны все 6 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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