powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
25 сообщений из 141, страница 2 из 6
Autofac как в любой точке программы получить резолвер ?
    #39182366
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТы тоже не в курсе что такое DI и как он работает?
ты меня с топискартером перепутал - выдохни
...
Рейтинг: 0 / 0
Autofac как в любой точке программы получить резолвер ?
    #39182371
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилhVosttТы тоже не в курсе что такое DI и как он работает?
ты меня с топискартером перепутал - выдохни

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

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

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

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

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

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

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

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

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

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

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



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

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


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

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

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

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

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

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

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

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



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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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



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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



правильный

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


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

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


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

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

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

Вот бидинг
    public class ApplicationsNinject : NinjectModule
    {
        public override void Load()
        {
            Bind<IApplications>().To<Applications>();
        }
    }
...
Рейтинг: 0 / 0
25 сообщений из 141, страница 2 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac как в любой точке программы получить резолвер ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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