我有一个使用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总是使用最后注册的提供程序作为特定组件的默认提供程序.我在这里假设它将使用最后注册的合适提供者.
我是否遗漏了某些内容,或者是否有更好的方法根据当前生命周期范围的标记选择提供商?
正常注册Web Foo,但不注册其他Foo.在为异步任务创建生命周期范围时,请使用在ContainerBuilder上执行操作的BeginLifetimeScope()重载.在此操作中注册背景Foo(b => b.Register()),这应该覆盖web.(小键盘在这抱歉:))
| 归档时间: |
|
| 查看次数: |
4012 次 |
| 最近记录: |