OWIN + SignalR + Autofac

黑色

摘自:http : //docs.autofac.org/en/latest/integration/signalr.html

“ OWIN集成中的一个常见错误是使用GlobalHost。在OWIN中,您从头创建配置。使用OWIN集成时,您不应在任何地方引用GlobalHost。”

听起来很合理。但是,应该如何IHubContext像通常的(非OWIN)一样从ApiController解析

GlobalHost.ConnectionManager.GetHubContext<MyHub>()

我在任何地方都找不到此引用,而现在唯一的方法是HubConfiguration在同一容器中注册实例并执行以下操作:

public MyApiController : ApiController {
  public HubConfiguration HubConfig { get; set; } // Dependency injected by
                                                  // PropertiesAutowired()

  public IHubContext MyHubContext { 
    get { 
      return HubConfig
        .Resolver
        .Resolve<IConnectionManager>()
        .GetHubContext<MyHub>(); 
     } 
  }

  // ...

}

但是,这对我来说似乎很冗长。正确的做法是什么?更具体地说,有一种干净的注册方法IConnectionManager吗?

编辑:

我最终要做的是这样的:

var container = builder.Build();
hubConfig.Resolver = new AutofacDependencyResolver(container); 

app.MapSignalR("/signalr", hubConfig);

var builder2 = new ContainerBuilder();
builder2
  .Register(ctx => hubConfig.Resolver.Resolve<IConnectionManager>())
  .As<IConnectionManager>();

builder2.Update(container);

但我感觉必须有一种更简单的方法将其IConnectionManager注入到控制器中。

詹姆斯·伍德尔

这个答案有点迟了,但是到了。

  • 我建议使用强类型的集线器。
  • 您需要为强类型的集线器添加特定的注册。
  • 我不使用GlobalHost
    • 相反,我使用为OWIN注册创建的配置。

集线器宣言

public interface IMyHub
{
    // Any methods here for strongly-typed hubs
}

[HubName("myHub")]
public class MyHub : Hub<IMyHub>

集线器注册

通过您的Autofac注册

// SignalR Configuration
var signalRConfig = new HubConfiguration();

var builder = // Create your normal AutoFac container here

builder.RegisterType<MyHub>().ExternallyOwned(); // SignalR hub registration

// Register the Hub for DI (THIS IS THE MAGIC LINE)
builder.Register(i => signalRConfig.Resolver.Resolve<IConnectionManager>().GetHubContext<MyHub, IMyHub>()).ExternallyOwned();

// Build the container
var container = builder.Build();

// SignalR Dependency Resolver
signalRConfig.Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container);

app.UseAutofacMiddleware(container);
app.MapSignalR("/signalr", signalRConfig);

在后台代码中解决中心

然后,使用AutoFacs AutowiredProperties()扩展方法可以解析正确的上下文(如果需要,也可以位于构造函数中)。

public IHubContext<IMyHub> InstanceHubContext { get; [UsedImplicitly] set; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Autofac 与 Owin

使用Autofac的OWIN服务解析

SignalR.Owin与SignalR.SelfHost

SignalR-OWIN-多个端点

Autofac WebApi 2 OWIN无法正常工作

Ninject与Web Api,SignalR,MVC和OWIN

Owin自带主机上的SignalR Websocket

在Owin启动时在InstancePerLifetimeScope中解析Autofac服务

Autofac Web API 2和Owin在StartupConfig中解析

如何将Autofac与WepApi 2和Owin集成?

WebApi 2,OWIN和AutoFac-更改HttpContextBase依赖项

无法使用OWIN Self Host关闭并启动新的SignalR

SignalR Owin Host 2.0.3出现401错误

使用Autofac将SignalR IHubContext注入控制器

Autofac(+ MVC + EF + SignalR + Hangfire)生命周期范围

SignalR和Autofac-Redis背板横向扩展

了解ASP.NET Webforms,OWIN和ASP.NET Identity的Autofac中间件用法

依赖项注入不适用于Owin自托管Web Api 2和Autofac

SignalR 2.0错误:无法加载文件或程序集Microsoft.Owin.Security

ASP.NET MVC OWIN和SignalR-两个Startup.cs文件

在Owin Selfhost上使用SignalR和Nancyfx 客户端上的Angular2

Signalr 2 Autofac在请求中呼叫集线器2至3次

使用Autofac的ASP.NET Core v2.0的SignalR依赖项注入

autofac with signalr没有为此对象定义无参数构造函数

为什么 Autofac.Integration.WebApi.Owin 5.0.0 在 TargetFramework v4.7.1 上引用 System.Net.Http 4.2.0?

多个OWIN侦听器具有自己的一组控制器,带有Autofac for DI

在MVC 5中具有ASP.NET Identity的Autofac无法验证OWIN管道中的安全标记

Autofac错误:无法加载文件或程序集'System.Web.Http,Version = 5.2.0.0,...',我的项目是Owin WebApi2 SelfHost

如何为使用OWIN,SignalR和Selenium / Protractor的Web应用程序进行E2E测试-我只能通过第一个测试