Autofac生命周期和匹配生命周期范围内的默认提供者

Mic*_*ito 6 c# autofac

我有一个使用Autofac进行依赖注入的ASP.NET MVC Web应用程序.有时,此Web应用程序将启动一个线程,以便与请求线程分开执行某些工作.当后台线程启动时,它会从根容器建立新的Autofac生存期范围并运行一些操作.

public IAsyncResult Run<T>(Action<T> action)
{
    var NewTask = System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
        using (var Scope = Runtime.Container.BeginLifetimeScope())
        {
            var Input = Scope.Resolve<T>();
            action(Input);
        }
    });

    return NewTask;
}
Run Code Online (Sandbox Code Playgroud)

我的一个与Autofac注册的依赖有两种不同的实现:一个适用于HTTP请求的寿命和其他适合所有其他的寿命.我试着将它们注册如下:

builder
.Register(c => new Foo())
.As<IFoo>()
.InstancePerLifetimeScope();

builder
.Register(c => new FooForHttp(HttpContext.Current))
.As<IFoo>()
.InstancePerMatchingLifetimeScope(WebLifetime.Request);
Run Code Online (Sandbox Code Playgroud)

Autofac选择FooForHttphttp请求(如预期的那样).但是,当我的后台线程旋转时,任何解决的尝试都会IFoo导致异常:

从请求实例的作用域中看不到具有匹配"httpRequest"的标记的作用域.这通常表示注册为每HTTP请求的组件正被SingleInstance()组件(或类似场景)重新请求.在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求.

我知道Autofac总是使用最后注册的提供程序作为特定组件的默认提供程序.我在这里假设它将使用最后注册的合适提供者.

我是否遗漏了某些内容,或者是否有更好的方法根据当前生命周期范围的标记选择提供商?

Nic*_*rdt 7

正常注册Web Foo,但不注册其他Foo.在为异步任务创建生命周期范围时,请使用在ContainerBuilder上执行操作的BeginLifetimeScope()重载.在此操作中注册背景Foo(b => b.Register()),这应该覆盖web.(小键盘在这抱歉:))