You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:22:06