Tratto da: http://docs.autofac.org/en/latest/integration/signalr.html:OWIN + SignalR + Autofac
"Un errore comune in materia di integrazione OWIN è l'uso del GlobalHost In OWIN si crea la configurazione da zero Non si dovrebbe fare riferimento GlobalHost ovunque quando si utilizza l'integrazione OWIN.. ".
Sembra ragionevole. Tuttavia, come si dovrebbe risolvere IHubContext
da un ApiController, come il solito (non OWIN):
GlobalHost.ConnectionManager.GetHubContext<MyHub>()
?
non riesco a trovare un punto di riferimento su questo da nessuna parte, e l'unico metodo che ho per ora è quello di registrare l'istanza HubConfiguration
all'interno dello stesso contenitore e fare questo:
public MyApiController : ApiController {
public HubConfiguration HubConfig { get; set; } // Dependency injected by
// PropertiesAutowired()
public IHubContext MyHubContext {
get {
return HubConfig
.Resolver
.Resolve<IConnectionManager>()
.GetHubContext<MyHub>();
}
}
// ...
}
Tuttavia, questo sembra abbastanza verboso per me. Qual è il modo corretto per farlo? Per essere più specifici, c'è un modo pulito per registrare IConnectionManager
?
EDIT:
Quello che ho finito per fare è qualcosa di simile:
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);
ma ho la sensazione che ci deve essere un modo più semplice per ottenere che IConnectionManager
iniettato nel controller.
Sembra che nel mix sia presente anche l'API Web. È questo il caso? –
Posso chiederti perché non stai facendo un'iniezione di costruttore? Qui hai un'enorme dipendenza dal tuo contenitore. – Anders
@TravisIllig: Sì, scusa se non ero esplicito su quello. Quando ho detto ApiController intendevo il controller WebAPI. – itim