将ASP.NET中的Autofac与ContainerDisposalModule一起使用,我如何才能支持具有需要解决的组件依赖性的调用并忘记调用?我遇到的问题是ASP.NET请求在任务运行之前完成并处理了请求的生存期范围,因此任何需要在新线程中解析的组件都会失败,并显示消息“实例无法解析”并且无法从此LifetimeScope创建嵌套的生存期,因为它已经被处理掉了”。在ASP.NET中使用Autofac支持发火和忘记通话的最佳方法是什么?我不想延迟执行可以在后台线程上完成的某些任务的请求。
我有一项任务需要在后台的单独线程中运行,并且我正在使用SignalR报告进度。这在前一段时间奏效,并且我进行了一些代码修改,但是对于现在收到的错误我完全不知所措:
“从实例被请求的范围中看不到带有匹配'AutofacWebRequest'的标签的范围。这通常表明SingleInstance()组件正在请求注册为HTTP请求的组件(或类似情况)。在网络集成下,始终从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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的Startup.Container.cs文件中:
builder.RegisterType<MyService>().As<MyService>().InstancePerLifetimeScope();
builder.RegisterType<EntityContext>().InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)