2012-09-25 4 views
4

Je suis complètement nouveau dans les bibliothèques autofac et singalR, alors soyez gentil avec moi! J'ai le code suivant dans bootstrapper qui fonctionne seul sans signalR. Le code ci-dessus fonctionne très bien, mais après l'enregistrement de mon Hub avec ce code ci-dessous, cela ne fonctionne tout simplement pas.Autofac + SignalR

builder.RegisterType<Chat>().InstancePerLifetimeScope(); 

builder.RegisterFilterProvider(); 
IContainer container = builder.Build(); 

DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container)); 

SignalR.IDependencyResolver resolver = new SignalR.Autofac.AutofacDependencyResolver(container); 
GlobalHost.DependencyResolver = resolver; 
RouteTable.Routes.MapHubs(resolver); 

J'utilise résolveur de dépendance SignalR se liant à Autofac de ce (https://github.com/pszmyd/SignalR.Autofac).

J'ai un simple hub comme celui-ci,

public class Chat : Hub 
{ 
    private readonly IadminService adminService; 
    public Chat(IadminService adminService) 
    { 
     this.adminService = adminService; 
    } 

    public void Send(string message) 
    { 
     Clients.addMessage(message); 
    } 
} 

C'est l'erreur que j'ai quand j'ai essayé d'utiliser DI au hub.

"Aucune étendue avec une balise correspondant" httpRequest "n'est visible à partir de la portée dans laquelle l'instance a été demandée."

Peu importe ce que je fais, je n'arrive pas à le faire fonctionner et je serais reconnaissant si quelqu'un pouvait me dire ce qui ne va pas avec le code ci-dessus.

Merci beaucoup Leo

+0

Btw - quelle version de SignalR utilisez-vous? Je vais regarder votre code dans les détails demain, mais je suis presque sûr que quelque chose ne va pas ici. S'il vous plaît corriger le code collé - dernière ligne dans la première case semble orphelin :) –

+0

Merci pour la réponse. J'utilise SignalR version 0.5.3 et si je change InstancePerHttpRequest en InstancePerLifetimeScope, cela fonctionne correctement, je ne peux plus ajouter un nouvel enregistrement à la base de données (en utilisant EF comme couche de données). Toute aide serait grandement appréciée, merci! – Leo

Répondre

1

Après avoir réglé le DependencyResolver vous avez encore besoin de passer à MapHubs, qui est d'essayer ceci:

GlobalHost.DependencyResolver = resolver; 

RouteTable.Routes.MapHubs(); 

Je sais SignalR mais jamais utilisé Autofac mais il peut être la peine de regarder ces réponses pour plus de détails sur le problème possible Autofac:

How to resolve Autofac InstancePerHttpRequest

Autofac, ASP.NET MVC 3 httpRequest scope and AutoMapper: No scope with a Tag matching 'httpRequest' is visible

+0

Merci pour la réponse rapide. Malheureusement, je suis toujours dans le même message d'erreur. – Leo

3

Pour une application ASP.NET hébergée dans IIS ajouter ceci à Application_Start:

var container = AutofacConfig.BuildContainer(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
var signalRDependencyResolver = new SignalRAutofacDependencyResolver(container); 
// old SignalR 1.0 way - routes.MapHubs(signalRDependencyResolver); 
RouteTable.Routes.MapHubs(new HubConfiguration { Resolver = signalRDependencyResolver }); 

Vous pouvez trouver les SignalRAutofacDependencyResolver here.

plaque tournante Exemple injection d'un service ISecurity:

public class ExampleHub : Hub 
{ 
    private static int _count = 0; 

    private readonly ISecurity _security; 
    public ExampleHub(ISecurity security) 
    { 
     _security = security; 
    } 

    public void GetCount() 
    { 
     _count++; 
     Clients.All.SetCount(_count);   
    } 
} 

Cela fonctionne aussi avec SignalR self host release. Utilisez simplement une classe de démarrage comme celle-ci:

// These are static variables in Program.cs - Probably a better way to do this 
_container = AutofacConfig.BuildContainer(); 
_webServer = WebApp.Start<WebServerStartup>("http://localhost:8080"); 

public class WebServerStartup 
{ 
    private readonly SignalRAutofacDependencyResolver _signalRDependencyResolver; 

    public WebServerStartup() 
    { 
     _signalRDependencyResolver = new SignalRAutofacDependencyResolver(_container); 
    } 

    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(new HubConfiguration { Resolver = _signalRDependencyResolver }); 
    } 
}