2015-11-11 3 views
0

У меня есть задача, которая должна выполняться в отдельном потоке в фоновом режиме, и я использую SignalR для отчета о прогрессе. Это сработало некоторое время назад, и я сделал некоторые модификации кода, но я полностью потерял ошибку, которую я получаю сейчас:Autofac не работает с фоновые задачи

«Никакая область с тегом, соответствующая« AutofacWebRequest », видна из области, в которой экземпляр был запрошен. Как правило, это указывает, что компонент, зарегистрированный в качестве HTTP-запроса, запрашивается компонентом SingleInstance() (или подобным сценарием). В рамках веб-интеграции всегда запрашиваются зависимости от DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, никогда не из самого контейнера ».

Любая помощь очень ценится!

public ActionResult DoAction(IEnumerable<string> items){ 

    //... 
    Func<CancellationToken, Task> taskFunc = CancellationToken => performAction(items); 
    HostingEnvironment.QueueBackgroundWorkItem(taskFunc); 
    //... 
    } 

    private async Task performAction(IEnumerable<string> items){ 
    var svc = AutofacDependencyResolver.Current.AppicationContainer.BeginLifetimeScope().Resolve<MyService>(); 
    svc.Method(items); 
    } 

public class MyService{ 
    private EntityContext db; 

    public MyService(EntityContext db){ 

    this.db = db; 
    } 
} 

В моем файле Startup.Container.cs:

builder.RegisterType<MyService>().As<MyService>().InstancePerLifetimeScope(); 
    builder.RegisterType<EntityContext>().InstancePerRequest(); 
+0

Читал [Вопросы и ответы по работе с каждым запросом пожизненного объемом] (http://autofac.readthedocs.org/en/latest/faq/per-request-scope.html)? –

ответ

1

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

Другой (не-StackOverflow) answer предоставляет аналогичные рекомендации.

public Task Run<T>(Action<T> action) 
{ 
    Task.Factory.StartNew(() => 
    { 
     using (var lifetimeScope = _container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag)) 
     { 
      var service = lifetimeScope.Resolve<T>(); 
      action(service); 
     } 
    }); 
    return Task.FromResult(0); 
} 
Смежные вопросы