powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
25 сообщений из 141, страница 1 из 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
25 сообщений из 141, страница 1 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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