Взято из: http://docs.autofac.org/en/latest/integration/signalr.html:Owin + SignalR + Autofac
«Распространенная ошибка в интеграции Owin является использование GlobalHost В Owin создать конфигурацию с нуля Вы не должны ссылаться на GlobalHost в любом месте при использовании интеграции Owin.. «.
Звучит разумно. Однако как следует разрешать IHubContext
от ApiController, как и обычный (не 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
?
EDIT:
То, что я в конечном итоге делает что-то вроде:
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
вводят в контроллер.
Похоже, у вас также есть API Web в миксе. Это так? –
Могу ли я спросить, почему вы не выполняете инъекцию конструктора? Здесь у вас огромная зависимость от вашего контейнера. – Anders
@TravisIllig: Да, извините, если я не был откровенен в этом вопросе. Когда я сказал ApiController, я имел в виду контроллер WebAPI. – itim