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

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

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

Прочти меня.

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

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

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

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

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

Прочти меня.

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

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

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

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

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

        IServiceProviderEx BeginScope();
    }

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

        public bool IsInnerProviderOwned { get; set; }

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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



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

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



Вот бидинг

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


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



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



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

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

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

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

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

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

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

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

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

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

   public IService1 ResolveService1 (){} 
}
...

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



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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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