2016-08-09 71 views
1

Ich habe ein SignalR 2 Projekt, das auch WebApi verwendet und ich versuche, AutoFac in dieses zu integrieren.Signal, Webapi und Autofac

Zunächst sah meine Startup-Klasse wie folgt aus:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    {   
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

     app.MapSignalR(); 

     var httpConfig = new HttpConfiguration(); 

     httpConfig.MapHttpAttributeRoutes(); 

     app.UseWebApi(httpConfig); 
    } 
} 

, die nicht Autofac verwenden ist und alles funktioniert. Nun, ich versuche in Autofac hinzuzufügen, so dass ich meine Startklasse geändert wie folgt aussehen:

public void Configuration(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 

     var httpConfig = new HttpConfiguration(); 
     var hubConfig = new HubConfiguration(); 

     // Register your Web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterHubs(Assembly.GetExecutingAssembly()); 

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

     app.UseAutofacMiddleware(container); 
     app.MapSignalR("/signalr", hubConfig); 
     app.UseWebApi(httpConfig);    
    } 

jetzt, was passiert ist, ich bin nicht in der Lage Anrufe an meinen Controller zu machen, wie ich ein 404 bekomme jeden Mal rufe ich an, was vorher funktioniert hat. Was vermisse ich? Auf der Autofac-Schnellstartanleitung für web api gibt es einen Aufruf an app.UseAutofacWebApi (config), jedoch existiert diese Methode nicht, also, nicht sicher, ob das das Problem ist oder was.

+0

Also, pro Dokumente für WebAPI OWIN-Integration, haben Sie das Autofac.WebApi2.Owin-Paket hinzugefügt und die UseAutofacWebApi-Erweiterung ist nicht da? Du brauchst das. Können Sie das überprüfen? –

Antwort

0

Ich hatte das gleiche Problem. Für mich musste ich die Hubs einzeln hinzufügen und nutze Nuget Packages Autofac.SignalR Version 3.0.2 und SignalR.Extras.Autofac v1.2.0. Es gibt ein paar AutoFac SignalR-Pakete, stellen Sie sicher, dass es nur diese beiden sind.

Obwohl ich ein paar andere Dinge auch geändert habe. Hier ist, wie ich es gemacht habe. var builder = new ContainerBuilder();

Ein weiterer Fehler, den ich gemacht habe, war der Gedanke, dass der Hub selbst in einen Controller injiziert werden kann. Sie können das nicht tun, also wenn Sie das brauchen, müssen Sie über den Hub-Kontext tun, ich muss einen Weg finden, den Hub-Kontext zu injizieren. Das ist auf meinem Todo.

var updateHubContext = GlobalHost.ConnectionManager.GetHubContext<UpdateHub>(); 
updateHubContext.Clients.All.update(); 

Und wenn Sie ein Leben lang Umfang benötigen, müssen Sie Ihre Abhängigkeiten in Ihren Hub über das Interface ILifetimeScope lösen. Sie müssen den Lifetime-Umfang injizieren und sie dann daraus lösen.

private readonly ILifetimeScope _hubLifetimeScope; 
private readonly IEntityService<Update> _updateService; 

public UpdateHub(ILifetimeScope lifetimeScope) 
{ 
    //the AutofacWebRequest is important. It will not work without it 
    _hubLifetimeScope = lifetimeScope.BeginLifetimeScope("AutofacWebRequest"); 
    _updateService = _hubLifetimeScope.Resolve<IEntityService<Update>>(); 
} 

Hoffentlich hilft dies. Das Javascript ist das gleiche wie in den Tutorials auf der Website. Da ändert sich nichts.