Art*_*yom 3 asp.net asp.net-mvc autofac signalr owin
Asp.net Mvc 5.2,SignalR 2.1,MS Owin(Katana)3.0的Autofac 3.5配置应该是什么?注册Autofac解析器的方法是否不那么复杂(现在有两个)?或者为什么ILifetimeScope我的中心不可见?
例外:
Autofac.Core.DependencyResolutionException:在类型'OperatorHub'上调用构造函数'Void .ctor(Autofac.ILifetimeScope)'时抛出异常.--->
从请求实例的作用域中看不到具有匹配"AutofacWebRequest"的标记的作用域.这通常表示SingleInstance()组件(或类似场景)正在请求注册为每HTTP请求的组件.在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求.(详见内部异常.)--->
Autofac.Core.DependencyResolutionException:从请求实例的作用域中看不到具有匹配'AutofacWebRequest'的标记的作用域.这通常表示SingleInstance()组件(或类似场景)正在请求注册为每HTTP请求的组件.在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求.
在我的OwinStartup中(请参阅owin中的autofac + mvc owin和autofac + signalr):
public void Configuration(IAppBuilder app)
{
var builder = new ContainerBuilder();
// ... registration. There is .InstancePerRequest() and .SingleInstance()
Autofac.Integration.Mvc.RegistrationExtensions.RegisterControllers(builder,typeof(MvcApplication).Assembly);
Autofac.Integration.SignalR.RegistrationExtensions.RegisterHubs(builder, Assembly.GetExecutingAssembly());
var container = builder.Build();
// 1st resolver
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
// yet the 2nd resolver!
app.MapSignalR(new HubConfiguration { Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container) });
}
Run Code Online (Sandbox Code Playgroud)
枢纽:
public class OperatorHub : Hub
{
public OperatorHub(ILifetimeScope hubLifetimeScope)
{
hubLifetimeScope.BeginLifetimeScope();
// ...
// HERE IT FALLS. The IMyService relates to MyDbContext (see below)
var myservice = hubLifetimeScope.Resolve<IMyService>();
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
破坏组件注册(EF上下文:
builder.RegisterType<MyDbContext>().AsSelf().As<DbContext>().InstancePerRequest("OwinLifetimeScope");
Run Code Online (Sandbox Code Playgroud)
简而言之,bug MyDbContext不在"root"生命周期范围内,而是传递给OperatorHub构造函数.
更新2
在@TravisIllig的帮助下,解决方案是使用.InstancePerLifetimeScope()和在集线器中创建一个MyDbContext服务.将在asp mvc中为http请求创建另一个生命周期范围.在没有请求的应用程序之间共享依赖关系创建帮助.
集线器也不应该处理给定的范围,因为它是ObjectDisposedException在第二次运行时产生的根目录.
有关在Autofac doc站点上处理此确切异常的常见问题解答.问题源于您InstancePerRequest与SignalR一起使用的事实,也是根据文档:
由于SignalR内部,SignalR中不支持每个请求的生命周期依赖性.
您似乎已经查看了Autofac SignalR文档,因为我看到您注入了一个生命周期范围来帮助您管理实例生命周期,但这并没有为您提供每个请求的生命周期范围,它只是为您提供了一个集线器生命周期范围.我可能会建议重新审视该文档以进行复习.
我提到的常见问题解答与SignalR集成文档一起,应该为您指出适合您应用的解决方案.许多人只是简单地将注册转换为InstancePerRequest,InstancePerLifetimeScope但我强烈建议您阅读常见问题解答并查看您的选项,然后才能做出决定.它可能是正确的选择,但可能不是 - 这取决于您的应用程序在内部的工作方式.
| 归档时间: |
|
| 查看次数: |
2890 次 |
| 最近记录: |