【发布时间】:2015-06-29 07:18:08
【问题描述】:
取自:http://docs.autofac.org/en/latest/integration/signalr.html:
“OWIN 集成中的一个常见错误是使用 GlobalHost。在 OWIN 中,您从头开始创建配置。使用 OWIN 集成时,不应在任何地方引用 GlobalHost。”
这听起来很合理。但是,应该如何从 ApiController 解析 IHubContext,就像通常的(非 OWIN)一样:
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 注入控制器。
【问题讨论】:
-
看来您也有 Web API。是这样吗?
-
请问您为什么不进行构造函数注入?在这里,您对容器有很大的依赖性。
-
@TravisIllig:是的,很抱歉,如果我没有明确说明这一点。当我说 ApiController 时,我指的是 WebAPI 控制器。
-
@Anders 我通常会这样做,Web API 控制器除外。我更喜欢让它们带有无参数的构造函数,以允许更清晰的子类化。
-
@itim 你最后采用了什么解决方案?