摘自: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
注入到控制器中。
这个答案有点迟了,但是到了。
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] 删除。
我来说两句