2017-02-21 38 views
2

Я хотел бы иметь доступ к встроенному контейнеру IoC (IServiceProvider, я считаю).Получить доступ к IServiceProvider/container в ядре .net

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

Мое особое заявление для этого заключается в том, что я использую другой продукт Hangfire. Эта структура создает объекты сами. Чтобы иметь зависимости, вводимые в эти объекты, вам необходимо переопределить класс JobActivator и обратиться к своему собственному контейнеру.

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

Может ли кто-нибудь помочь?

+0

Ваш случай вполне справедлива. Иногда вам нужно отложить или отправить создание объектов, а это значит, что вам нужно перезвонить в «контейнер». Пока этот обратный вызов реализуется внутри [Корень композиции] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/), это [абсолютно отлично] (http://blog.ploeh.dk /2011/08/25/ServiceLocatorrolesvs.mechanics/). – Steven

ответ

0

Вы можете получить доступ к IServiceProvider на этапе конфигурации app.ApplicationServices или с помощью HttpContext.RequestServices. Обычай JobActivator должен выглядеть следующим образом:

public class AspNetCoreJobActivator : JobActivator 
{ 
    private IServiceProvider _serviceProvider; 

    public AspNetCoreJobActivator(IServiceProvider serviceProvider) 
    { 
     _serviceProvider = serviceProvider; 
    } 

    public AspNetCoreJobActivator(IHttpContextAccessor httpContextAccessor) 
    { 
     _serviceProvider = httpContextAccessor.HttpContext.RequestServices; 
    } 

    public AspNetCoreJobActivator(HttpContext context) 
    { 
     _serviceProvider = context.RequestServices; 
    } 

    public override object ActivateJob(Type type) 
    { 
     return _serviceProvider.GetService(type); 
    } 
} 

В файле Startup.cs:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) 
{ 
    GlobalConfiguration.Configuration.UseActivator(new AspNetCoreJobActivator(serviceProvider)); // or app.ApplicationServices 
    var server = new Hangfire.BackgroundJobServer(); 

    app.UseMvcWithDefaultRoute(); 
} 
+0

Спасибо. Так я получил доступ к поставщику услуг. У меня были разные проблемы с Hangfire, но это уже в другое время! :) – Zak