2014-02-20 2 views
2

У меня есть сайт MVC asp.net, у которого есть много компонентов, зарегистрированных с помощью области InstancePerHttpRequest, однако у меня также есть «фоновая задача», которая будет выполняться каждые несколько часов, в которой не будет httpcontext.Конфигурация контейнера Autofac для фонового потока

Я хотел бы получить экземпляр моего IRepository, который был зарегистрирован как этот

builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)) 
    .InstancePerHttpRequest(); 

Как мне это сделать из не контекста HTTP с использованием Autofac? Я думаю, что IRepository следует использовать InstancePerLifetimeScope

+0

См http://stackoverflow.com/a/27903481/389424 – janv8000

ответ

5

Есть несколько способов, как вы можете сделать это:

  1. Лучшим один, на моем взгляде. Вы можете зарегистрировать репозиторий как InstancePerLifetimeScope, как вы сказали. Он работает с HttpRequests и LifetimeScopes одинаково хорошо.

    builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)) 
        .InstancePerLifetimeScope(); 
    
  2. Ваша регистрация для HttpRequest может отличаться от регистрации для LifetimeScope, то вы можете иметь два отдельных регистрации:

    builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)) 
        .WithParameter(...) 
        .InstancePerHttpRequest(); // will be resolved per HttpRequest 
    
    builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)) 
        .InstancePerLifetimeScope(); // will be resolved per LifetimeScope 
    
  3. Вы можете явно создать "HttpRequest" сферу, используя тэг. Экспозиция через MatchingScopeLifetimeTags.RequestLifetimeScopeTag Недвижимость в новых версиях.

    using (var httpRequestScope = container.BeginLifetimeScope("httpRequest")) // or "AutofacWebRequest" for MVC4/5 integrations 
    { 
        var repository = httpRequestScope.Resolve<IRepository<Entity>>(); 
    } 
    
+0

Я сделал вариант 3, как это: _container.BeginLifetimeScope ("AutofacWebRequest") – Paul

+0

@Paul Спасибо. Тег запроса был изменен на «AutofacWebRequest» и выставлен через MatchingScopeLifetimeTags.RequestLifetimeScopeTag в новых версиях. Обновлен ответ. –

+0

# 1 хорошо работает. Чтобы получить контейнер, вы можете сделать следующее: 'var container = AutofacDependencyResolver.Current.ApplicationContainer;' –

Смежные вопросы