|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Привет. Такой вопрос. В AspNet приложении IDependencyResolver устанавливается на старте приложения. В любой момент можно запросить IDependencyResolver.Current и зарезолвить себе все, что нужно. Для Autofac для этого есть AutofacDependencyResolver. Вопрос. Как подобное реализуется в других приложениях: консоли, WebForms и т.д. ? IDependencyResolver там нету. Как в любой точке программы получить доступ к Autofac и зарезолвить что-то ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 14:14 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Изменю (дополню) вопрос ! Меня даже интересует не просто IDependencyResolver, а ILifetimeScope. Как его получить в любой точке программы ? Возьмем для примера вот этот класс TransactionScope Я могу в любом месте программы написать так: Код: c# 1. 2. 3. 4. 5.
все будет работать отлично. Если при выполнении этого кода будет "окружающая транзакция" она будет взята и использована. Есть ли в Autofac что-то подобное ? Или мне нужно через 10 уровней тянуть ILifetimeScope, чтобы использовать его только на 11м ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 17:40 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
похоже надо третий раз сформулировать. желательно с примером кода ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 09:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Отлично, то что подняли тему. Как раз собирался сам. У меня правда 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] ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 10:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Все тоже самое только с разметкой Отлично, то что подняли тему. Как раз собирался сам. У меня правда Ninject, но думаю суть дела не меняет. Вот я нашел такие два примера... 2ой пример наверное ответ на Ваш вопрос. Мой же вопрос как будет правильнее использовать IoC. Второй вариант не нарушает каких либо принципов ... Первый вариант Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Второй ваиант Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 10:54 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GВторой вариант не нарушает каких либо принципов говорят, что это антипаттерн ServiceLocator, но лично на мой взгляд - вполне себе вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 10:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем G, DependencyResolver же в сборке System.Web.Mvc ! Вы предлагаете ее загружать в ВинФормы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:02 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotek Я могу в любом месте программы написать так: Код: c# 1. 2. 3. 4. 5.
Там все тянется через локальные данные потока. P. S. нафига вам вообще сдались эти IoC контейнеры? Никчемная новомодная штучка. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:18 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekАртем G, DependencyResolver же в сборке System.Web.Mvc ! Вы предлагаете ее загружать в ВинФормы ? Не использовать резолвер, не использовать сервис локатор. Не искать способы получить статический резолвер. Владимир Путин-ЛенинАртем GВторой вариант не нарушает каких либо принципов говорят, что это антипаттерн ServiceLocator, но лично на мой взгляд - вполне себе вариант. Никакой не вполне себе, сервис локатор — зло. По опыту ничего хорошего ни для разработки, ни для сопровождения, ни тем более для тестирования. Зло по всем параметрам. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:21 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинАртем GВторой вариант не нарушает каких либо принципов говорят, что это антипаттерн ServiceLocator, но лично на мой взгляд - вполне себе вариант. В MVC так и используется. Вроде все ок. При старте приложения задается DependencyResolver, а затем, в любой точке можно запросить этот DependencyResolver.Current и работать с ним. Собственно мой вопрос в том и заключается: как работать в WinForms. Как там, в любой точке программы получить аналог DependencyResolver, или что там в ВинФормах вместо этого. Не соглашусь, что это сервис локатор. Это просто глобальная статическая переменная на DependencyResolver. Дальше он уже используется как IOC контейнер, как и положено, типы резолвятся через него. Это гораздо лучше, чем во все существующие классы передавать DependencyResolver :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:25 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttНе использовать резолвер, не использовать сервис локатор. Не искать способы получить статический резолвер. Никакой не вполне себе, сервис локатор — зло. По опыту ничего хорошего ни для разработки, ни для сопровождения, ни тем более для тестирования. Зло по всем параметрам. Вы предлагаете не использовать IOC ? Резолвер ведь это и есть IOC Container. И как вы предлагаете обходится без статического резолвера ? В MVC то он есть, разработчики MVC и все кто этим пользуются глупцы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:29 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekВ MVC так и используется. Вроде все ок. Я не использую ни в одном из своих MVC приложениях. Ни в одном, при том, что приложения построены полностью на DI. И как это так у меня получается???? ProBiotekСобственно мой вопрос в том и заключается: как работать в WinForms. Как там, в любой точке программы получить аналог DependencyResolver, или что там в ВинФормах вместо этого. Решать тебе конечно. Я лишь говорю, что тебе это не нужно. ProBiotekНе соглашусь, что это сервис локатор. Не важно, согласен ты с этим или нет, но это сервис локатор. ProBiotekЭто просто глобальная статическая переменная на DependencyResolver. Дальше он уже используется как IOC контейнер, как и положено, типы резолвятся через него. Это и есть сервис локатор. ProBiotekЭто гораздо лучше, чем во все существующие классы передавать DependencyResolver :) Передавать в классы локатор это тупость в квадрате. В классы передаются только те интерфейсы, которые он реально использует. Зачем им передавать контейнер, откуда можно всё достать? Это отвратительная архитектура, проблемы неизбежны. Но дело твоё. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:37 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВНикчемная новомодная штучка. да не. штука очень полезная. просто если в той же MVC зависимости контроллеров резолвятся "за кадром" - там сама инфраструктура для этого заточена, просто передавай интерфейсы в конструктор, то в других приложениях такой может не быть. и делать её только для того чтобы "было как в MVC" - по-моему, перебор ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:38 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekВы предлагаете не использовать IOC ? Резолвер ведь это и есть IOC Container. Я предлагаю использовать DI, который реализует принцип IoC. ProBiotekИ как вы предлагаете обходится без статического резолвера ? Легко. В ASP.NET MVC контроллеры создаются из контейнера, в конструкторе контроллера перечисляются интерфейсы, которые нужны ему для работы, и контейнер их туда подставляет. И так далее по цепочке. Нигде не нужен статический резолвер, нигде не нужно обращаться к контейнеру напрямую. Советую изучить вопрос. ProBiotekВ MVC то он есть, разработчики MVC и все кто этим пользуются глупцы ? Естественно он есть, я не говорил, что контейнера нет. Я про то, что не надо его использовать. Вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:42 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинЕвгенийВНикчемная новомодная штучка. да не. штука очень полезная. просто если в той же MVC зависимости контроллеров резолвятся "за кадром" - там сама инфраструктура для этого заточена, просто передавай интерфейсы в конструктор, то в других приложениях такой может не быть. и делать её только для того чтобы "было как в MVC" - по-моему, перебор Пример использования в веб-формсах: Код: c# 1. 2. 3. 4. 5. 6. 7.
Всё, что надо зарезолвить позже, делается через фабрики или лениво. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:46 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, Вот вы все так интересно расписываете. и ваш подход явно отличается от общепринятого подхода (тот же глобальный IDependencyResolver). Не ясно правда чем ваш подход лучше. Можете ли вы поделить каким-то своим мелким проектом, для изучения и повышения своей квалификации ? :) Если не против, скиньте мне на почту ProBiotek@yandex.ru плиз. Может научусь чему то классному :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekНе ясно правда чем ваш подход лучше это если ты сильно заморочишься по тестированию. те же формы ты с подходом ServiceLocator можешь не смочь протестировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:55 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВТам все тянется через локальные данные потока. P. S. нафига вам вообще сдались эти IoC контейнеры? Никчемная новомодная штучка. Сдались, потому что решают ряд проблем и позволяют сосредоточиться на бизнес-задачах. Возможность что-то там В ЛЮБОМ месте написать это не лень продумать архитектуру, увесистая грабля для сопровождения и развития проекта, и практическая невозможность обеспечить вменяемое тестирование продукта и объяснение его поведения, любого участка кода. Как можно гарантировать, что такой-то класс будет делать только то, что от него требуется, если в любом месте кода можно обратиться куда угодно, получить какой угодно сервис и выполнить любой код? Надо полностью выключить мозг напрочь, чтобы использовать подобную архитектуру. Другое дело, если всем глубоко положить на качество продукта и его дальнейшую судьбу... в таком случае я считаю что бессмысленно что-то обсуждать на тему «как лучше». ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 11:57 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:00 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekи ваш подход явно отличается от общепринятого подхода общепринятый как раз у hVostt ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилProBiotekи ваш подход явно отличается от общепринятого подхода общепринятый как раз у hVostt Ты тоже тока из берлоги вчера вылез? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:03 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttИзопропилпропущено... общепринятый как раз у hVostt Ты тоже тока из берлоги вчера вылез? а что, общепринятым нынче является сеять зависимость от контейнера по всему говнокоду? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:07 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt Как можно гарантировать, что такой-то класс будет делать только то, что от него требуется, если в любом месте кода можно обратиться куда угодно, получить какой угодно сервис и выполнить любой код? Предложи свою реализацию свойства HttpContext.Current? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:07 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Изопропила что, общепринятым нынче является сеять зависимость от контейнера по всему говнокоду? Какого ещё контейнера? Разрабатываемые компоненты вообще знать не знают ни о каком контейнере. Благодаря этому они отлично тестируются, их поведение предсказуемое и очевидное: например, если некий компонент не получает ссылку на IEmailService, то очевидно, что почту он отправлять не будет. А запрет использования всяких статических резолверов даёт гарантию, что так оно и будет. Ты тоже не в курсе что такое DI и как он работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:21 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВПредложи свою реализацию свойства HttpContext.Current? Зачем? В контроллерах доступен контекст запроса, в фильтрах доступен контекст запроса, зачем я буду лезть в HttpContext.Current? Я что, враг себе? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:23 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttТы тоже не в курсе что такое DI и как он работает? ты меня с топискартером перепутал - выдохни ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:26 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилhVosttТы тоже не в курсе что такое DI и как он работает? ты меня с топискартером перепутал - выдохни Ну а чего ты придумываешь про какую-то зависимость от контейнера по всему коду? Не знаешь как DI устроен? В этом и суть, что зависимости от контейнера нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
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. Читал книгу Марка Сиимана. Так, что можем считать данный шаг сделан. Переходим к следующему - изучению примера проекта :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:34 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, особенно хотелось бы глянуть, как у вас там все "тестируемое" благодаря такому подходу. Нет, мне правда очень очень интересно ! А то я может прозябаю в каменном веке, пока вы там уже бороздите просторы большого театра. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:35 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttНу а чего ты придумываешь про какую-то зависимость от контейнера по всему коду? Не знаешь как DI устроен? В этом и суть, что зависимости от контейнера нет это не я , а топикстартер придумал. Да ещё объявил общепринятым подходом. внимательно прочитай мой мой первый пост в этом топике. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:37 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekкак у вас там все "тестируемое" благодаря такому подходу очень просто: ServiceLocator это завуалированный new со всеми вытекающими ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:40 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Изопропил, Так как надо тогда ? Покажите уже пример проектика. Я считал, что использовать IDependencyResolver.Current это норма. Так вроде и работают с Аутофаком. Может я что-то упустил. Покажите, научите меня. Не дайте прозябать в невежестве. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:41 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Изопропилэто не я , а топикстартер придумал. Да ещё объявил общепринятым подходом. внимательно прочитай мой мой первый пост в этом топике. А, тогды сорри ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:44 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekИли мне нужно через 10 уровней тянуть ILifetimeScope, чтобы использовать его только на 11м ?Ну инжектируй ILifetimeScope так же, как ты инжектируешь другие сервисы. зы: Попробуй поработать с TransactionScope в паре с async / await. Расскажешь потом... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:44 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
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 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:45 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилhVosttпропущено... Ты тоже тока из берлоги вчера вылез? а что, общепринятым нынче является сеять зависимость от контейнера по всему говнокоду?Обёртка вокруг контейнера пишется за 5 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:45 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttЛегко. В ASP.NET MVC контроллеры создаются из контейнера, в конструкторе контроллера перечисляются интерфейсы, которые нужны ему для работы, и контейнер их туда подставляет. И так далее по цепочке. Нигде не нужен статический резолвер, нигде не нужно обращаться к контейнеру напрямую.Если только не захочется создать вложенный LifetimeScope. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:46 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekНу это то я уже давно изучил. Использую Autofac. Читал книгу Марка Сиимана. Не похоже как-то. Суть IoC — уменьшить количество зависимостей. А ты не только не уменьшаешь, но ещё и добавляешь зависимость от контейнера. Т.е. весь твой код должен ЗНАТЬ про какой-то резолвер, чтобы получать через него зависимости. Потом, все твои компоненты ЗНАЮТ про резолвер и обращаются к нему. Теперь каждый компонент в любом месте может получить что угодно внутри реализации и ты об этом даже не узнаешь. Т.е. любая часть кода у тебя обладает возможностью GOD MODE, делаю что хочу, когда хочу, и где хочу. Логически подумай, нет ли здесь проблемы? Если умом не доходишь, тогда продолжай читать литературу до просветления. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:48 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем 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 ? тут нет "абсолютного зла/добра". если хочешь получить действительно слабосвязную архитектуру (а зачем?), то однозначно кто-то третий "со стороны" должен резолвить зависимости, иначе это все полумеры (а может они сгодятся?). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:49 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КОбёртка вокруг контейнера пишется за 5 минут. Говно в своей обёртке. Ок ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:49 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КЕсли только не захочется создать вложенный LifetimeScope. Все подробности реализации упаковываются в архитектурные фабрики. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:50 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, С тем что резолвер использовать не нужно ... это понятно. Получается завязка. Нужен живой пример. Пример с контроллером ниже он правильный? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:54 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttProBiotekНу это то я уже давно изучил. Использую Autofac. Читал книгу Марка Сиимана. Не похоже как-то. Суть IoC — уменьшить количество зависимостей. А ты не только не уменьшаешь, но ещё и добавляешь зависимость от контейнера. Т.е. весь твой код должен ЗНАТЬ про какой-то резолвер, чтобы получать через него зависимости. Потом, все твои компоненты ЗНАЮТ про резолвер и обращаются к нему. Теперь каждый компонент в любом месте может получить что угодно внутри реализации и ты об этом даже не узнаешь. Т.е. любая часть кода у тебя обладает возможностью GOD MODE, делаю что хочу, когда хочу, и где хочу. Логически подумай, нет ли здесь проблемы? Если умом не доходишь, тогда продолжай читать литературу до просветления. Ну а как надо? Теорию я прочитал. Научили бы, чем шпынять. Это все равно что сказать неучу "ты не понимаешь, читай книги пока сам не изобретешь". Ну ок, я согласен с тем, что Фабрики ограничат полный доступ к контейнеру. Хотя смотрел пример MVC проектов, где этим не заморачиваются. Билдят один контейнер и пихают его как резолвер. И потом используют по всему проекту. Так покажите пример как нужно... Хочу правильно делать, а не как сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:55 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GhVostt, С тем что резолвер использовать не нужно ... это понятно. Получается завязка. Нужен живой пример. Пример с контроллером ниже он правильный? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
правильный ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Вот вам всем. Официальная документация 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.
Что вы меня то ругаете. Я делал как указано в доке. Если вы говорите, что этот подход в корне не верный. Так покажите верный. Плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:57 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GНужен живой пример. Пример с контроллером ниже он правильный? В контексте обсуждения: правильный. Контроллер зависит от конкретных компонентов и он их как-то получает (через DI), но подробностей о том как он получает свои зависимости ему неизвестны. Всё верно. Тут глядя на сигнатуру класса мы уже знаем, что может делать этот контроллер, а что не может. Очевидно, что он не может отправить SMS, или получить прямой доступ к базе данных. И это великолепно! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:57 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekЧто вы меня то ругаете. Я делал как указано в доке. Если вы говорите, что этот подход в корне не верный. Так покажите верный. Плиз. Ну и? Всё правильно сделал. Теперь можно получать зависимости вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:14 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, Ну я понял. Вы просто против того, чтобы откуда угодно можно было получить контейнер и делать с ним все что хочешь. Для чего инъектировать в классы уже зарезолвленные объекты - не давая им повода самим резолвить. Ну ок. Мне просто, чаще, лень делать лишние прослойки :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:19 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, А как в вашем подходе быть с ILifetimeScope ? Положим в MVC все еще терпимо - там в Autofac создается ILifetimeScope на каждый запрос. А как быть в обычных WinForms (с которых я и начал тему) ? Ведь если там не контролировать создание ILifetimeScope явно, то это приведет к тому, что через 10 часов работы программы - будет висеть гектар созданных объектов, которые не будут удалены до завершения программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:23 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинАртем GhVostt, С тем что резолвер использовать не нужно ... это понятно. Получается завязка. Нужен живой пример. Пример с контроллером ниже он правильный? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
правильный ОК с DI разобрались ... это правильно Теперь IoC Container... Подскажите что Я установил 3 пакета ... Код: xml 1. 2. 3.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:24 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КЕсли только не захочется создать вложенный LifetimeScope. Все подробности реализации упаковываются в архитектурные фабрики.Ты читать вообще умеешь? Прочти меня. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:25 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КТы читать вообще умеешь? Прочти меня. Фабрика это не обёртка над контейнером. Простейшая фабрика: Func<ISomeService>() Фабрика одного объекта: Lazy<ISomeService>() Простейшая параметризованная фабрика: Func<string, IConnection> настройка в каком скопе каждый сервис живёт производится при сборке контейнера. зачем писать какую-то обёртку? более сложная стратегия создания экземпляров опять же может обойтись без ссылки на скоуп. но корневые архитектерные фабрики могут оперировать скоупами, но опять же, это не обёртка. какой смысл обёртки, если цель -- избавиться от зависимости в целом? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:34 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:45 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
дали им reflection и понеслось :)) Вот зачем каждый объект наследовать от интерфейса + замазать на хз какой фраймворк для внедрения зависимостей и писать через одно место вызов конструкторов? Ах ну да, модульное тестирование, как учили в автошколе. Правда ценности от последнего больше ровно на 100 зимбабвийских квачей, чем от просто "код компилируется". По количеству пройденных тестов рп/мп/рр может смотреть, работает программист Вася или сидит в аське. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 14:11 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВПравда ценности от последнего больше ровно на 100 зимбабвийских квачей , чем от просто "код компилируется" 100 зимбабвийских квачей - это сколько в граммах? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 14:15 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВВот зачем каждый объект наследовать от интерфейсаЭто никто не заставляет. ЕвгенийВ... писать через одно место вызов конструкторов?Можно инжектировать в свойства. ЕвгенийВАх ну да, модульное тестирование, как учили в автошколе. Правда ценности от последнего больше ровно на 100 зимбабвийских квачей, чем от просто "код компилируется". По количеству пройденных тестов рп/мп/рр может смотреть, работает программист Вася или сидит в аське.И без тестирования от IoC/DI достаточно пользы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 14:27 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Владимир Путин-ЛенинЕвгенийВПравда ценности от последнего больше ровно на 100 зимбабвийских квачей , чем от просто "код компилируется" 100 зимбабвийских квачей - это сколько в граммах? википедияИнтересные факты В 2009 году Гидеон Гоно, директор Резервного банка Зимбабве, получил Шнобелевскую премию по математике: в условиях галопирующей гиперинфляции он вынудил всё население своей страны изучить математику путём выпуска купюр номиналами от 1 цента вплоть до 100 триллионов зимбабвийских долларов. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 14:41 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Господа, я вижу что мы перешли на 3ий лист и скорее всего на мой вопрос уже ответ не дадут... если не против я продублирую По поводу DI все понятно Теперь IoC Container... Подскажите пожалуйста все ли верно в коде ниже Я установил 3 пакета ... Код: xml 1. 2. 3.
Вот создание карнела Код: 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.
Вот подгрузка модулей Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Вот бидинг Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 15:08 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GТеперь IoC Container... Подскажите пожалуйста все ли верно в коде нижеЗачем new Bootstrapper() в двух местах? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 15:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КАртем GТеперь IoC Container... Подскажите пожалуйста все ли верно в коде нижеЗачем new Bootstrapper() в двух местах? Весть код при установке пакета генерится автоматом. я только добавляю вот эту строчку. Поэтому зачем он в друх местах new это загадка ... Код: c# 1. 2. 3. 4.
Но для чего я показал код. Как мы выяснили на 1-2ой странице Service Locator это зло ... а DependencyReoslver = Service Locator Поэтому хочется услышать комментариев и советов ... как же будет "правильнее" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 16:06 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GАлексей Кпропущено... Зачем new Bootstrapper() в двух местах? Весть код при установке пакета генерится автоматом. я только добавляю вот эту строчку. Поэтому зачем он в друх местах new это загадка ...Ну я бы разобрался. Артем G Код: c# 1. 2. 3. 4.
Но для чего я показал код. Как мы выяснили на 1-2ой странице Service Locator это зло ... а DependencyReoslver = Service Locator Поэтому хочется услышать комментариев и советов ... как же будет "правильнее"Здесь нет абсолютного зла. Всё имеет свои преимущества и недостатки. Вроде как все возможные варианты в топике уже перечислены. Повторю вкратце. По возможности лучше использовать инжектирование зависимостей через конструктор или свойства. Сервислокатор приходится использовать если: 1. Нет возможности инжектировать зависимости через конструктор/свойства. Например, корневой объект всегда создаётся локатором. В твоём случае локатором создаются MVC-контроллеры, для этого и указывается нужная реализация DependencyResolver. 2. Нужно создать LifetimeScope. 3. ... может ещё какие причины есть, на первый взгляд вроде всё. Сервислокатор может быть как статическим, так и инжектироваться наряду с другими зависимостями. Вкратце вроде всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 16:20 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GВесть код при установке пакета генерится автоматом.Я бы выкинул этот код и написал бы загрузчик с нуля, усложнял бы его по мере необходимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 16:24 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КЗачем new Bootstrapper() в двух местах? Тут обсуждалось! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 16:26 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt Вот кстати необходимость иметь LifetimeScope и приведет к тому, что придется откзаться от ваших, предлагаемых, фабриках. Ну или придется написать свою реализацию. Но тогда начнутся проблемы ! Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Как вы будете решать эту проблему я не знаю. А как вы ее решаете сейчас ? Позвольте угадаю , вы резолвите непосредственно из DependencyResolver ? После чего получаете классическую проблему Captive Dependency ? Т.е. каждый раз когда резолвите что-то, то потом не освобождаете и оно висит все время выполнения программы ? Полагаю вас спасает лишь то, что в MVC LifetimeScope генерится в режиме "на каждый вызов" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 18:29 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНазывай это как хочешь. Как по мне, так вполне себе "обёртка": Наличие обёртки ничего здесь не решает. Совсем. Дополнительная нафиг не упавшая прослойка. Тебе смотрю совсем заняться нечем Обёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 08:07 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekКак вы будете решать эту проблему я не знаю. А как вы ее решаете сейчас ? Я не создаю проблем, чтобы их решать. Я решаю задачи, обхожу ненужные проблемы. Инструменты и решения выбираю такие, которые упрощая что-то одно, не создают при этом вагон сложностей сейчас и на перспективу. Фабрики к скоупам не имеют отношения. По какой стратегии компоненту жить определяется при регистрации. ProBiotek Позвольте угадаю , вы резолвите непосредственно из DependencyResolver ? Нет, никогда. ProBiotekПосле чего получаете классическую проблему Captive Dependency ? Я не создаю ни себе, ни других таких проблем. Поэтому не решаю её. ProBiotekТ.е. каждый раз когда резолвите что-то, то потом не освобождаете и оно висит все время выполнения программы ? Есть разные стратегии, в том числе для коротко живущих зависимостей на основе концепции Owner, т.е. без необходимости создания скоупа. ProBiotekПолагаю вас спасает лишь то, что в MVC LifetimeScope генерится в режиме "на каждый вызов" :) При чём тут MVC вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 08:15 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КНазывай это как хочешь. Как по мне, так вполне себе "обёртка": Наличие обёртки ничего здесь не решает. Совсем. Дополнительная нафиг не упавшая прослойка.Обёртка даёт независимость прикладного кода от конкретного ДИ-контейнера. На это ранее уже обращалось внимание. hVosttОбёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. Ну предложи своё решение, как в прикладном коде создавать LifetimeScope и при этом не зависеть от конкретного ДИ-контейнера. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 09:19 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttОбёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. Авторы классов AutofacDependencyResolver, AutofacWebApiDependencyResolver, AutofacHostFactory и т. п. больные люди? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 09:25 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КОбёртка даёт независимость прикладного кода от конкретного ДИ-контейнера. На это ранее уже обращалось внимание. Прикладной код вообще не должен знать про DI контейнер. Нафига эта обёртка? Контейнер используется только в точке входа и регистрации компонентов, там нет никакого смысла в обёртках, так как каждый контейнер используется по-разному. Никакая обёртка не поможет при внезапной замене одного контейнера на другой, это изначально глупая и бесполезная затея. Ещё раз. Компоненты не должны знать о DI, ни напряму, ни через глупые обёртки. Иначе это фейл, и не умение применять DI. Алексей КНу предложи своё решение, как в прикладном коде создавать LifetimeScope и при этом не зависеть от конкретного ДИ-контейнера. Зачем в прикладном коде создавать LTS? Прикладной код не должен ничего знать про DI, не должен знать про LTS, иначе это программирование на кишках, изначально говнокод. LTS используются при разработке архитектурной платформы приложения, например, в ASP.NET MVC это фабрики фильтров и контроллеров, за их пределами никаких LTS быть не должно, даже запаха. Для служб и декстопов регистрация по принципу транизентности в рамках овнера, например окна, или джоба, внутри которых опять же кишки LTS нафиг не упали. LTS создаётся как контекст единицы работы в рамках некой транзакционной деятельности приложения (обработка запроса, создание окна, обработка джоба). В прикладном коде и внутри реализации сервисов этого знать не нужно. Никаких обёрток над LTS в прикладной код пролазить не должно, это уже даже не запашок, а конкретная вонища говнокода. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:21 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttОбёрточничество — это тяжкое заболевание: наивная уверенность, что поголовное создание обёрток для всего подряд решает проблему.. Ггг... хорошо, что оно часто поддаётся лечению. Авторы классов AutofacDependencyResolver, AutofacWebApiDependencyResolver, AutofacHostFactory и т. п. больные люди? При чём же тут обёртки? Где ты их увидел? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:22 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttЗачем в прикладном коде создавать LTS?Например, для удобства управления временем жизни EF DbContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:41 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Авторы классов AutofacDependencyResolver, AutofacWebApiDependencyResolver, AutofacHostFactory и т. п. больные люди? При чём же тут обёртки? Где ты их увидел?Эти классы решают аналогичную задачу. Ну назови это адаптером, что от этого изменится? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:43 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttЗачем в прикладном коде создавать LTS?Например, для удобства управления временем жизни EF DbContext. Зачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно. Но если очень хочется всё делать через одно место, то конечно нужно как-то протащить в прикладуху LTS, обернув для душевного спокойствия в бессмысленную обёртку. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:45 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttLTS создаётся как контекст единицы работы в рамках некой транзакционной деятельности приложения (обработка запроса, создание окна, обработка джоба). В прикладном коде и внутри реализации сервисов этого знать не нужно . Никаких обёрток над LTS в прикладной код пролазить не должно, это уже даже не запашок, а конкретная вонища говнокода."Никогда не говори никогда" (ц) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:46 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КЭти классы решают аналогичную задачу. Ну назови это адаптером, что от этого изменится? Эти классы решают прямую задачу -- реализуют существующие интерфейсы, они адаптируют контейнер Autofac для инфраструктуры MVC/WebAPI, об этом разработчики майкрософт заранее позаботились. Внутри прикладного кода никто не обращается к этим классам, и знать не знают об их существовании. В конечных приложениях в обёртках нет смысла. Кому в голову придёт в огромном ПО менять Autofac на Unity, или наоборот? Даже если придёт, это делается с одинаковой сложностью как с обёртками, так и без. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:48 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttЗачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно.Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:50 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttLTS создаётся как контекст единицы работы в рамках некой транзакционной деятельности приложения (обработка запроса, создание окна, обработка джоба). В прикладном коде и внутри реализации сервисов этого знать не нужно . Никаких обёрток над LTS в прикладной код пролазить не должно, это уже даже не запашок, а конкретная вонища говнокода."Никогда не говори никогда" (ц) Если умеешь пользоваться мозгом, то не придётся тащить в прикадуху LTS. В обратном случае я хз. Тащи... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КЭти классы решают аналогичную задачу. Ну назови это адаптером, что от этого изменится? Эти классы решают прямую задачу -- реализуют существующие интерфейсы, они адаптируют контейнер Autofac для инфраструктуры MVC/WebAPIНу правильно. В моём примере происходит адаптация ДИ-контейнера под прикладной код. hVosttВ конечных приложениях в обёртках нет смысла. Кому в голову придёт в огромном ПО менять Autofac на Unity, или наоборот? Даже если придёт, это делается с одинаковой сложностью как с обёртками, так и без.Это тема для размышления. Я бы не стал утверждать, что всегда и везде это так или не так. В моём случае спрятать ДИ-контейнер за абстракцией мне ничего не стоило, поэтому это было сделано "на всякий случай". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttЗачем прикладному коду управлять временем жизни дб контекста? В общем, это неправильно.Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем? Не так это как? Создаёшь некую стратегию типа Owner Single Instance Per All Lifetimes, и джобы как незнали ничего про LTS, так и продолжают не знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КВ моём случае спрятать ДИ-контейнер за абстракцией мне ничего не стоило, поэтому это было сделано "на всякий случай". Func<T> решает эту задачу за тебя ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:57 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНу правильно. В моём примере происходит адаптация ДИ-контейнера под прикладной код. Зачем прикладному коду вообще контейнер? Даже в обёртке? Ну то есть я понимаю, что гораздо проще не напрягая мозг дать прикладухе весь резолвер, вместо продумывания архитектуры. Пусть прикладной код сам резолвит что хочет и когда хочет, и сам LTS создаёт, сам их убивает, пофигу вообще. Нафига вообще думать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 10:59 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttЗачем прикладному коду вообще контейнер? Даже в обёртке? Ну то есть я понимаю, что гораздо проще не напрягая мозг дать прикладухе весь резолвер, вместо продумывания архитектуры. Пусть прикладной код сам резолвит что хочет и когда хочет, и сам LTS создаёт, сам их убивает, пофигу вообще. Нафига вообще думать? Тебе это не надо, расслабься. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 11:17 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей Кпропущено... Ну вот представь, что есть некий фреймворк, запускающий джобы. Разумеется 99% случаев один джоб == один DbContext + одна транзакция. Но в 1% случаев это не так. Заказчику сказать, что такой джоб мы писать не будем? Не так это как? Создаёшь некую стратегию типа Owner Single Instance Per All Lifetimes, и джобы как незнали ничего про LTS, так и продолжают не знать.Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 11:18 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt, Вы так и не ответили, как вы в своем решении работаете с временными-скопами. Я так понимаю, что фабрику-обертку можно написать двумя способами: Как указал Алексей К. 18882170 - через универсальный GetServices. Либо как указал я 18884017 - через явное указание IService1 ResolveService1 (){} В первом случае мне не ясно как вообще обеспечить защиту от GOD MODE ? Разве что создавать разные IServiceProviderEx , конфигурировать их разным набором классов. Чтобы один мог резолвить только те, а другой только эти. Остается правда вопрос настройки взаимодействия объектов порожденных разными резолверам. И каждый раз при добавлении нового типа пройтись по резолверам и настроить права доступа. И если это никак не документировать то потом попробуй найди кто за что отвечает (в какой из десятка резолверов внедрить компонент). Вам знаком термин "dll hell" ? Думаю наступит именно он, если будет куча резолверов. Во втором случае, в добавок к описанным строкой выше проблемам, начинаются проблемы с LifetimeScope. Оба решения сложны в применении и, полагаю, существенно усложнят разработку программы и ее поддержку. Говорите, что еще якобы сложность тестирования наступает, если передавать IDependencyResolver. Но в чем сложность ? Замокайте IDependencyResolver который передается, и все. Можно хоть всю цепочку резолвинга замокать - чтобы мок генерил другой мок который сгенерит уже тестовый объект, который и будет применяться в тестировании. Соглашусь, что есть риск, что какая-то сторонняя либа сможет получить IDependencyResolver после чего сможет делать что угодно. Но с другой стороны у нас получается сложность поддержки. Не знаю что выбрать из двух зол. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:38 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekМожно хоть всю цепочку резолвинга замокать - чтобы мок генерил другой мок который сгенерит уже тестовый объект, который и будет применяться в тестировании это уже трешак ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekhVostt, Вы так и не ответили, как вы в своем решении работаете с временными-скопами.Он считает, что временные скопы в прикладном коде никому не нужны. В его мире нужны только те скопы, которые привязаны к системным событиям, вроде HTTP-запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:53 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
а вообще интересно, какой-нить содержательный пример, когда надо разный LifetimeScope можно привести? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:54 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 12:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Владимир Путин-Ленин, Ну вон статейка как раз про это. http://blog.ploeh.dk/2014/06/02/captive-dependency/ Да любой пример, когда долгоживущий объект должен использовать короткоживущие. Если не уследить, будет примерна та же проблема, что с делегатами, которые как веревочка не дают удалить большой объект, С делегатами решается через слабые ссылки конечно, но говорим сейчас про DI - где для этого, вроде бы, и придуман LifetimeScope. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:00 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Хотя с Dependency hell я пожалуй загнул. Это не та проблема :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КОн считает, что временные скопы в прикладном коде никому не нужны в прикладном -да, не нужны. только в инфраструктурном, причём без всякой привязки к HTTP и т п потроха запуска джоба, транзацкии, команды, открытия формы и т д - это не прикладой код ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КОн считает, что временные скопы в прикладном коде никому не нужны в прикладном -да, не нужны. только в инфраструктурном, причём без всякой привязки к HTTP и т пВ 99% случаев - да. Но 1% всегда остаётся, про него и речь. Изопропилпотроха запуска джоба, транзацкии, команды, открытия формы и т д - это не прикладой кодДа. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:22 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Изопропилпричём без всякой привязки к HTTP и т пА как по другому. Можно пример для веб-сервера? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерах ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:31 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерах per-request lifetime support это прикладной или инфраструктурный код ? я уже запутался :) Вот это нужно. После обработки каждого входящего запроса сервер будет чистить сгенеренный мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:37 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерахНу оказалось, что нужно создавать несколько DbContext в джобе. Ради одного джоба менять системный код нет желания. Я не понимаю, что плохого в том, что в прикладном коде есть абстракция LifetimeScope. Чему это противоречит? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:41 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekПосле обработки каждого входящего запроса сервер будет чистить сгенеренный мусор. инфракструктурный. Прикладной обработчик запроса не знает, откуда взялись параметры конструкторов и методов, кто и как установил свойства. ЗЫ что за сервер и есть ли там вообще какой-нибудь MVC - значения не имеет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 13:47 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНо 1% всегда остаётся, про него и речь. Что за процент - поясни на примерах LifetimeScope чтобы в принципе существует, чтобы контролировать время жизни объектов. Это просто более высокоуровневая абстракция над IDisposable. В принципе, наверное, можно обойти без передачи LifetimeScope пользовательскому коду. Просто в этом случае нужно конфигурировать резолвинг объекта, указав, что "освобождаться он будет вне контейнера": IRegistrationBuilder.ExternallyOwned Method ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 14:19 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНу оказалось, что нужно создавать несколько DbContext в джобе. и чем эти дополнительные дбконтексты отличаются от прочих инжектируемых объектов? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 14:24 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Что вы привязались к этому Autofac? На эту страницу без слез не взглянешь! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 15:01 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВЧто вы привязались к этому Autofac? кто привязался? обсуждение с конкретным контейнером никак не связано ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 15:07 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Что именно вас там не устраивает ? Список стабильно выходящих релизов с 2011 года ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 15:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КНу оказалось, что нужно создавать несколько 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.
Повторю вопрос: что в этом плохого? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 15:44 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей К, фабрика где-то потерялась - вот и пришлось городить невменяемый IServiceProviderEx ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 16:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КОн считает, что временные скопы в прикладном коде никому не нужны. В его мире нужны только те скопы, которые привязаны к системным событиям, вроде HTTP-запроса. Я считаю, что скоупы -- это архитектурное решение. В прикладном коде надо решать бизнес-задачи. Алексей же не собирается включать мозг, видимо пользоваться этим инструментом его не учили. Не понимает как это так можно обойтись в прикладухе без зависимости от контейнера и скопа. Как так сделать? Невероятно просто, магия, волшебство -- не меньше! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:13 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekВы так и не ответили, как вы в своем решении работаете с временными-скопами. Я работаю со скопами на уровне архитектуры. Сервисы и прикладной код понятия не имеют ни про какие скоупы -- им это НЕ НУЖНО. Они решают сугубо свои задачи, и ничего больше. В этом и заключается суть, смысл DI. На кой хрен сдались бы эти DI, IoC, контейнеры, если весь код написан так же, как и с использованием new/using? Не парь мозг, пиши как писали 10 лет назад. И думать особо не надо. Какая разница что будет завтра? Как будут сопровождать этот код, как его тестировать. Наступит завтра и будем решать проблемы завтра. Пока в это же время другие люди выпускают новые продукты и свежие стабильные версии.. ProBiotekСоглашусь, что есть риск, что какая-то сторонняя либа сможет получить IDependencyResolver после чего сможет делать что угодно. Но с другой стороны у нас получается сложность поддержки. Не знаю что выбрать из двух зол. Не надо выбирать зло. Правильное использование DI -- это полнейшее отсутствие зависимости от контейнера, и даже от его обёрток. Полное незнание про DI внутри компонентов. Что в этом сложного, я не пойму. Вы голову попробуйте включить, хотя бы на пол часа и увидите, это отличное решение, для поддержки, развития и тестирования -- сплошной профит. Ё ж моё.... ппц. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:18 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ProBiotekДа любой пример, когда долгоживущий объект должен использовать короткоживущие. Долгоживущий объект, использующий короткоживущий, это всё равно что сначала возводить стены, а потом пытаться подсунуть под них фундамент -- действительно -- КАК это сделать? Проблеееема. Решение -- подумать головой и потратить время на проектирование архитектуры. Сложно? Ну фиг знает что ещё посоветовать. Создавайте самим себе проблемы и решайте, если так нравится. Добавить нечего. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:20 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КВ 99% случаев - да. Но 1% всегда остаётся, про него и речь. 1% решается через стратегии, тот же Autofac отлично расширяется, очень гибкий инструмент. Жаль конечно, что не каждый его осилить может, и тащит всякие скоупы и контейнеры в прикладуху. Что поделать... КЛиника ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:21 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt Не надо выбирать зло. Правильное использование DI -- это полнейшее отсутствие зависимости от контейнера, и даже от его обёрток. Полное незнание про DI внутри компонентов. Эт если кто то за тебя его дернет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:22 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КЯ не понимаю, что плохого в том, что в прикладном коде есть абстракция LifetimeScope. Чему это противоречит? Ну это как ключ от сейфа, который повесили на его ручку... Или пароль, записанный на стикер и приклеенный к монитору. Несколько DbContext-ов создать легче лёгкого, через Func<IDbContext>. Но это ж надо было подумать.. Думать — не наш метод! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:24 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей К, фабрика где-то потерялась - вот и пришлось городить невменяемый IServiceProviderEx"Если я найду потерянную фабрику", то как она инжектирует DbContext в сервисы Service2, Service3 и рекурсивно вглубь их зависимостей? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:24 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttНу это как ключ от сейфа, который повесили на его ручку... Или пароль, записанный на стикер и приклеенный к монитору.Нужны факты. hVosttНесколько DbContext-ов создать легче лёгкого, через Func<IDbContext>. Но это ж надо было подумать.. Думать — не наш метод! Будешь таскать DbContext между методами параметром? Много раз уже обсуждалось. Ambient DbContext vs Explicit DbContext vs Injected Dbcontext ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей К, у тебя два вложенных джоба создаётся? им точно персональный скоуп нужен? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:33 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей К, у тебя два вложенных джоба создаётся?Можно и так сказать. Изопропилим точно персональный скоуп нужен?В этом случае, к сожалению, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:40 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КБудешь таскать DbContext между методами параметром? Много раз уже обсуждалось. Решений масса в зависимости от конечных требований. Например, можно ввести концепцию изолированной команды, которая на уровне архитектуры регистрируется со своим скоупом, ведь нам нужен не только DbContext и и весь стек UOW, который работает как единое пространство зависимости. И это будет архитектурное решение, понятное, сопровождаемое и тестируемое. Также при необходимости можно раскидать по тредам. А вообще необходимость нескольких DbContext в одной команде — уже конкретно попахивает, и оправдывания дескать «вот здесь именно нужно так» как-то не тянут на аргумент. У любой задачи всегда больше одного решения, и не обязательно выбирать проблемное решение из-за которого надо делать дурно пахнущую дырень в архитектуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:41 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КБудешь таскать DbContext между методами параметром? Много раз уже обсуждалось. Решений масса в зависимости от конечных требований.Я в курсе. В моём случае все остальные решения хуже. hVosttНапример, можно ввести концепцию изолированной команды, которая на уровне архитектуры регистрируется со своим скоупом, ведь нам нужен не только DbContext и и весь стек UOW, который работает как единое пространство зависимости. И это будет архитектурное решение, понятное, сопровождаемое и тестируемое. Также при необходимости можно раскидать по тредам. А вообще необходимость нескольких DbContext в одной команде — уже конкретно попахивает, и оправдывания дескать «вот здесь именно нужно так» как-то не тянут на аргумент.Спасибо, мне такого не надо. hVosttУ любой задачи всегда больше одного решения, и не обязательно выбирать проблемное решение из-за которого надо делать дурно пахнущую дырень в архитектуре.Факты будут? Теперь уже в сравнении с альтернативными решениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:48 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КВ этом случае, к сожалению, да. Странно, а я думал, что прикладному коду нужны: - получить данные - обработать данные - сохранить данные с фига ли прикладухе нужен какой-то DbContext контекст? В общем ясно, что там за решение, где «к сожалению, да» ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:50 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КФакты будут? Теперь уже в сравнении с альтернативными решениями. Факт такой: прикладной код не работает с DbContext и не должен. DbContext всего лишь реализует доступ к данным. В хорошей архитектуре его можно заменить на ISession, DbConnection/DbCommand, или чем угодно другим. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КФакты будут? Теперь уже в сравнении с альтернативными решениями. Факт такой: прикладной код не работает с DbContext и не должен. DbContext всего лишь реализует доступ к данным. В хорошей архитектуре его можно заменить на ISession, DbConnection/DbCommand, или чем угодно другим.Вынос выполнения прикладной логики из БД в моём случае приведёт к недопустимому снижению производительности. Другими словами, хватит тупить, сказано надо, значит надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 17:58 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КВынос выполнения прикладной логики из БД в моём случае приведёт к недопустимому снижению производительности этого собственно не предлагали. Предлагали вынести нахер за пределы Service1 потроха создания вложенных Service2 и Service3 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 18:09 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилПредлагали вынести нахер за пределы Service1 потроха создания вложенных Service2 и Service3В слой инфраструктуры? Можно, но зачем? И я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 18:32 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КВынос выполнения прикладной логики из БД в моём случае приведёт к недопустимому снижению производительности этого собственно не предлагали. Предлагали . Это приведёт к множеству "N+1 запрос" и прочим неприятностям - мне такого счастья не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2016, 18:35 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей К И я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...". Вот ИХМО самое толковое объяснение. Хотя если класс объявить как internal, то нет проблем! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 11:08 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КИ я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...". Конкретно уже всё сказали миллион раз множество разных уважаемых людей, в статьях, блогах и книгах. Основные постулаты: 1. Внесение зависимости от сервис локатора. 2. Жестокое нарушение инкапсуляции. 3. Затруднение, до практической невозможности местами, модульного тестирования. 4. Снижение читабельности кода, так как теперь по сигнатуре невозможно сказать определённо, что может или не может конкретный класс, т.к. доступ к контейнеру означает доступ ко всему, GOD MODE ON. И это против одного сомнительного профита: 1. Не надо думать об архитектуре, просто пиши код, получай что хочешь и делай что хочешь в любом месте кода. Сомнительный в данному случае, потому что профитом он кожется только для зелёного новичка, ну или для туповатого программиста со стажем. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 11:18 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей К Предлагали . Это приведёт к множеству "N+1 запрос" и прочим неприятностям - мне такого счастья не надо. Открой для себя проекции. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 11:20 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVostt1. Внесение зависимости от сервис локатора.Ну есть зависимость от какого-то там интерфейса, описанного в системном слое. Ужас-то в чём? Выше ты предлагал зависимость от другого интерфейса: изолированной команды". Чем та зависимость хуже этой? hVostt2. Жестокое нарушение инкапсуляции.Как инкапсуляцию можно нарушить? Ты вообще читаешь что пишешь? hVostt3. Затруднение, до практической невозможности местами, модульного тестирования.Враньё. При необходимости можно подпихнуть тестовую реализацию IServiceProvider. hVostt4. Снижение читабельности кода, так как теперь по сигнатуре невозможно сказать определённо, что может или не может конкретный класс, т.к. доступ к контейнеру означает доступ ко всему, GOD MODE ON.Страшилка конца 90-х - эпохи начала поклонения паттернам. Скажи ещё, что все публичные поля нужно обёртывать в свойства - вместе посмеёмся. hVosttСомнительный в данному случае, потому что профитом он кожется только для зелёного новичка, ну или для туповатого программиста со стажем . Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 13:26 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей К, Не нужно банить - серьезно, дискутировать не с кем будет. Здесь на форуме и так 3-5 людей кто отвечает на вопросы... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 13:45 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
ЕвгенийВАлексей КИ я наконец хочу услышать конкретные факты, что-то более весомое, чем: "ServiceLocator-у не место в прикладном коде, потому что мне это не нравится и вообще...". Вот ИХМО самое толковое объяснение. Хотя если класс объявить как internal, то нет проблем!Стандартная страшилка, ничего особенного. Причём некоторые страхи связаны с тем, что ServiceLocator описан статическим классом. Я же предлагаю инжектировать IServiceProvider аналогично другим зависимостям. Это многое меняет. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 13:49 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Артем GАлексей К, Не нужно банить - серьезно, дискутировать не с кем будет. Здесь на форуме и так 3-5 людей кто отвечает на вопросы...Ну не банить, предупредить хотя бы. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 13:52 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
хвоста банить?! с дубу рухнули. тут останется тогда один скайна ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:17 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
а были времена и МСУ тут ошивался ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 19:46 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttСомнительный в данному случае, потому что профитом он кожется только для зелёного новичка, ну или для туповатого программиста со стажем . Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего. ИМХУ сказано нейтрально, банить не за что. Если ты лично сам на себя эти слова спроецировал и обиделся - тут не виноват тот кто это сказал. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 20:25 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КНу есть зависимость от какого-то там интерфейса, описанного в системном слое. Ужас-то в чём? Смысл в новой зависимости, при чём жёсткой. Захочешь перетащить компонент в другой проект, придётся тащить за ним контейнер. Ужас в том, что ты либо прикидываешься, либо до тебя 2+2 является сложнейшей концепцией для понимания. Алексей ККак инкапсуляцию можно нарушить? Ты вообще читаешь что пишешь? Если компонент обладает доступом к контейнеру, его больше нельзя считать изолированным. Он теперь может всё — зарезолвить любой компонент и выполнить любое действие, и контролировать его теперь нельзя. Никаких гарантий давать нельзя. Всё сломать может любой компонент. Разработчик компонента, который не должен лезть в базу данных, с контейнером может легко накласть на это «не должен» и никто этого не узнает до поры до времени. Алексей КВраньё. При необходимости можно подпихнуть тестовую реализацию IServiceProvider. Когда начнёшь покрывать код тестами, тогда и поговорим. Алексей КСтрашилка конца 90-х - эпохи начала поклонения паттернам. Скажи ещё, что все публичные поля нужно обёртывать в свойства - вместе посмеёмся. Мда... публичные поля... Я бы посмеялся, если бы не было так грустно. А вроде ты давно как уже в разработке. Неужели самому не интересно двигаться дальше в профессиональном смысле? Что на уровне студента-то у тебя всё? Неужели устраивает? Эээхх... Алексей К Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего. Нет смысла хамить, у меня аргументов вагон, а у тебя какие-то наивные детско-студенческие «нехочу-небуду-ненравится». Ну и ладно, чо. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2016, 23:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Иммануил Канта были времена и МСУ тут ошивалсяСогласен, зря его выгнали.Dima TАлексей Кпропущено... Модератор , почему ты не банишь убогого за хамство и тупость? Он не в первый раз уже позволяет себе лишнего. ИМХУ сказано нейтрально, банить не за что. Если ты лично сам на себя эти слова спроецировал и обиделся - тут не виноват тот кто это сказал.Он сказал, что все кто с ним не согласны являются дословно: "зелёного новичка, ну или для туповатого программиста со стажем". Я с ним не согласен, почему я не должен это воспринимать в свой адрес? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 05:33 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttСмысл в новой зависимости, при чём жёсткой. Захочешь перетащить компонент в другой проект, придётся тащить за ним контейнер.В новом проекте не будет контейнера, поддерживающего скоупы? hVosttЕсли компонент обладает доступом к контейнеру, его больше нельзя считать изолированным. Он теперь может всё — зарезолвить любой компонент и выполнить любое действие, и контролировать его теперь нельзя. Разработчик компонента, который не должен лезть в базу данных, с контейнером может легко накласть на это «не должен» и никто этого не узнает до поры до времени.Чем инжектирование зависимостей в конструктор/свойства принципиально отличается от запроса через локатор? Заресольвить зависимость любого доступного типа можно и через инжектирование. В этом отношении здесь нет никакой разницы. hVosttНет смысла хамить, у меня аргументов вагон Сам себя хвалишь? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 05:56 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КВ новом проекте не будет контейнера, поддерживающего скоупы? В новом проекте может быть что угодно, при правильной разрабокте, компонент можно дёрнуть в другой проект и использовать его вообще в new / using, или с другим контейнером, и вообще в другой архитектуре. Это ж очевидно... Алексей КЧем инжектирование зависимостей в конструктор/свойства принципиально отличается от запроса через локатор? Заресольвить зависимость любого доступного типа можно и через инжектирование. В этом отношении здесь нет никакой разницы. Инжектирование, это внешнее разрешение зависимостей, компонент не знает о том, как зависимости будут ему предоставлены. Локатор и через переданный контейнер, компонет сам вынужден доставать свои зависимости из контейнера, при чём он может достать и вовсе не свои зависимости, а что угодно. Для работы компонента нужен контейнер и локатор. Разница -- просто космос. Ты уж извини меня, и не сочти за хамство, но: ты реально не способен осилить простейшую даже для новичков тему? Чего так жёстко тупишь? Алексей КСам себя хвалишь? Это факт, я аргументирую свои слова, а ты пока не привёл ни одной аргументации. То что ты пишешь, похоже либо на троллинг, либо... Уж лучше бы это был троллинг. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 08:45 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАлексей КВ новом проекте не будет контейнера, поддерживающего скоупы? В новом проекте может быть что угодно, при правильной разрабокте, компонент можно дёрнуть в другой проект и использовать его вообще в new / using, или с другим контейнером, и вообще в другой архитектуре. Это ж очевидно...Реализовать IServiceProvider для тех единичных случаев можно и без полноценного ДИ-контейнера. "Это ж очевидно..." (ц) hVosttАлексей КЧем инжектирование зависимостей в конструктор/свойства принципиально отличается от запроса через локатор? Заресольвить зависимость любого доступного типа можно и через инжектирование. В этом отношении здесь нет никакой разницы. Инжектирование, это внешнее разрешение зависимостей, компонент не знает о том, как зависимости будут ему предоставлены. Локатор и через переданный контейнер, компонет сам вынужден доставать свои зависимости из контейнера, при чём он может достать и вовсе не свои зависимости, а что угодно. Для работы компонента нужен контейнер и локатор. Разница -- просто космос. Ты уж извини меня, и не сочти за хамство, но: ты реально не способен осилить простейшую даже для новичков тему? Чего так жёстко тупишь? Я тебе отвечал про отсутствие разницы применительно к этому твоему утверждению: авторЕсли компонент обладает доступом к контейнеру, его больше нельзя считать изолированным. Он теперь может всё — зарезолвить любой компонент и выполнить любое действие, и контролировать его теперь нельзя. Никаких гарантий давать нельзя. Всё сломать может любой компонент. Разработчик компонента, который не должен лезть в базу данных, с контейнером может легко накласть на это «не должен» и никто этого не узнает до поры до времени.Выходи уже из судорога! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 09:29 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КРеализовать IServiceProvider для тех единичных случаев можно и без полноценного ДИ-контейнера. "Это ж очевидно..." (ц) Надо тащить IServiceProvider, и реализовывать его в том объёме, как этого требует компоненты. Таким образом мы получили ещё +1 зависимость. Браво! Алексей КЯ тебе отвечал про отсутствие разницы применительно к этому твоему утверждению: Алексей КВыходи уже из судорога! Аргументация будет? Или очередные инсинуации с красноречием? Почитай, что такое инкапсуляция. Если ты изначально клал на паттерны, теорию и принципы программирования, то о чём мы тогда вообще разговариваем? Иди клади дальше, не пудри людям мозги. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 10:30 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
hVosttАргументация будет?Больше пока не будет. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 10:34 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КhVosttАргументация будет?Больше пока не будет. Удачи! Не было и не будет, мы уже поняли. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 10:43 |
|
Autofac как в любой точке программы получить резолвер ?
|
|||
---|---|---|---|
#18+
Алексей КСтрашилка конца 90-х - эпохи начала поклонения паттернам. Скажи ещё, что все публичные поля нужно обёртывать в свойства - вместе посмеёмся. Не поверишь, но я даже в JavaScript все оборачиваю в свойства :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2016, 17:18 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1400755]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
147ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 262ms |
0 / 0 |