如何在.NET Core 6 WPF应用中通过Autofac注入SignalR IHubContext
在Autofac+Caliburn.Micro的WPF应用中注入SignalR IHubContext的方案
核心逻辑说明
你不需要手动在Autofac容器中注册IHubContext<RemoteControlHub>——因为services.AddSignalR()已经将该服务注册到ASP.NET Core原生DI中,而你使用的AutofacServiceProviderFactory会自动把ASP.NET Core服务集合中的所有服务同步到Autofac容器里。关键是要确保Caliburn.Micro的ViewModel实例由Autofac管理,这样才能自动解析依赖。
完整实现步骤及代码
1. 改造Bootstrapper,整合Autofac与Caliburn.Micro
重写Caliburn.Micro的BootstrapperBase,让它使用Autofac作为DI容器,同时启动SignalR自托管服务:
public class AppBootstrapper : BootstrapperBase { private IHost _host; private IContainer _container; public AppBootstrapper() { Initialize(); } protected override async void OnStartup(object sender, StartupEventArgs e) { // 启动ASP.NET Core自托管主机,整合Autofac _host = Host.CreateDefaultBuilder() .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => webBuilder .UseUrls("http://localhost:5100") .ConfigureServices(services => services.AddSignalR()) .Configure(app => { app.UseRouting(); app.UseEndpoints(endpoints => endpoints.MapHub<RemoteControlHub>("/remote")); })) .ConfigureContainer<ContainerBuilder>(builder => { // 注册Caliburn.Micro核心组件 builder.RegisterType<WindowManager>().As<IWindowManager>().SingleInstance(); builder.RegisterType<EventAggregator>().As<IEventAggregator>().SingleInstance(); // 注册你的ViewModel及其他应用服务 builder.RegisterType<MyViewModel>().InstancePerDependency(); builder.Register(c => LoggerFactory.Create(b => b.AddConsole()) .CreateLogger<MyViewModel>()).As<ILogger>().InstancePerDependency(); }) .Build(); await _host.StartAsync(); // 获取Autofac容器实例,供Caliburn.Micro使用 _container = _host.Services.GetRequiredService<IContainer>(); // 启动主ViewModel DisplayRootViewFor<MyViewModel>(); } // 让Caliburn.Micro使用Autofac解析实例 protected override object GetInstance(Type serviceType, string key) { if (string.IsNullOrEmpty(key)) { return _container.TryResolve(serviceType, out var instance) ? instance : null; } return _container.TryResolveNamed(key, serviceType, out var instance) ? instance : null; } protected override IEnumerable<object> GetAllInstances(Type serviceType) { return _container.Resolve<IEnumerable<object>>(new TypedParameter(typeof(Type), serviceType)); } protected override void BuildUp(object instance) { _container.InjectProperties(instance); } // 应用退出时停止自托管主机 protected override async void OnExit(object sender, EventArgs e) { await _host.StopAsync(); _host.Dispose(); base.OnExit(sender, e); } }
2. ViewModel直接接收依赖注入
你的MyViewModel构造函数无需修改,Autofac会自动解析IHubContext<RemoteControlHub>:
public class MyViewModel { private readonly ILogger _logger; private readonly IHubContext<RemoteControlHub> _hubContext; public MyViewModel(ILogger logger, IHubContext<RemoteControlHub> hubContext) { _logger = logger; _hubContext = hubContext; // 这里可以直接使用_hubContext进行SignalR消息推送等操作 } }
关键注意点
- 必须确保Caliburn.Micro的ViewModel实例由Autofac创建,所以要重写
GetInstance等方法指向Autofac容器。 AutofacServiceProviderFactory会自动同步ASP.NET Core服务到Autofac,因此无需手动注册IHubContext相关类型。
内容的提问来源于stack exchange,提问作者Krazykraut
相关产品推荐
相关产品推荐

