ASP.NET Core v2.0中用Autofac实现SignalR依赖注入的问题咨询
解决ASP.NET Core 2.0 + SignalR Alpha2-Final + Autofac的依赖注入问题
我刚好踩过这个版本的SignalR配置坑,你遇到的核心问题是旧的IHub接口已经被移除,再加上Autofac注册逻辑和顺序的小失误,导致依赖注入完全失效。下面是一步步的修复方案:
1. 修正Hub的注册逻辑
在你使用的Microsoft.AspNetCore.SignalR 1.0.0-alpha2-final版本里,IHub接口已经被彻底废弃,所有Hub直接继承自Hub基类。你之前的RegisterSignalRHubs扩展里用typeof(IHub).IsAssignableFrom(t)根本找不到你的MyHub,这是最关键的问题。
把扩展方法改成检查是否是Hub的子类,同时明确生命周期(SignalR的Hub是每次连接请求都会新建的,所以必须用瞬时生命周期):
public static class AutofacExtensions { public static IRegistrationBuilder<object, ScanningActivatorData, DynamicRegistrationStyle> RegisterSignalRHubs(this ContainerBuilder builder, params Assembly[] assemblies) { return builder.RegisterAssemblyTypes(assemblies) .Where(t => t.IsSubclassOf(typeof(Hub))) // 替换为检查Hub子类 .InstancePerDependency(); // 明确瞬时生命周期,匹配SignalR的要求 } }
2. 调整Startup的注册顺序
Autofac的注册顺序很重要,你需要先把ASP.NET Core原生服务集合里的内容导入Autofac,再注册自己的依赖和Hub,避免覆盖SignalR的内置服务。修改ConfigureServices方法:
public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSignalR(); // 先添加SignalR的原生服务 var containerBuilder = new ContainerBuilder(); containerBuilder.Populate(services); // 先导入原生服务到Autofac containerBuilder.RegisterModule<MyModule>(); // 注册你的依赖模块 containerBuilder.RegisterSignalRHubs(typeof(Startup).GetTypeInfo().Assembly); // 注册所有Hub var container = containerBuilder.Build(); return new AutofacServiceProvider(container); }
3. 确保SignalR端点配置正确
别忘了在Configure方法里映射你的Hub,否则SignalR根本找不到它的存在:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); app.UseSignalR(routes => { routes.MapHub<MyHub>("/myHub"); // 把MyHub映射到/myHub路径 }); }
为什么之前的配置无效?
IHub接口已移除:这个版本的SignalR重构了Hub模型,不再使用IHub接口,所以你的旧过滤条件完全找不到Hub类。- 生命周期配置错误:
ExternallyOwned()会告诉Autofac不管理该对象的生命周期,但SignalR需要Hub由容器瞬时创建,InstancePerDependency()才是正确的选择。 - 注册顺序问题:如果先注册Hub再
Populate原生服务,可能会和SignalR内置的Hub注册逻辑冲突,导致容器无法正确解析依赖。
这样调整后,当客户端连接到/myHub时,Autofac会自动注入IMyDependency到MyHub的构造函数里,调用MyMethod就能看到预期的控制台输出了。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

