ILifetimeScope的autofac DependencyResolutionException用于asp.net中的集线器mvc,signalr,MS owin

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 owinautofac + 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在第二次运行时产生的根目录.

Tra*_*lig 7

有关在Autofac doc站点上处理此确切异常的常见问题解答.问题源于您InstancePerRequest与SignalR一起使用的事实,也是根据文档:

由于SignalR内部,SignalR中不支持每个请求的生命周期依赖性.

您似乎已经查看了Autofac SignalR文档,因为我看到您注入了一个生命周期范围来帮助您管理实例生命周期,但这并没有为您提供每个请求的生命周期范围,它只是为您提供了一个集线器生命周期范围.我可能会建议重新审视该文档以进行复习.

我提到的常见问题解答与SignalR集成文档一起,应该为您指出适合您应用的解决方案.许多人只是简单地将注册转换为InstancePerRequest,InstancePerLifetimeScope但我强烈建议您阅读常见问题解答并查看您的选项,然后才能做出决定.它可能是正确的选择,但可能不是 - 这取决于您的应用程序在内部的工作方式.