2012-09-25 61 views
4

我对autofac和singalR库都是全新的,所以请对我轻松点!我在bootstrapper中有下面的代码,它在没有signalR的情况下自行工作。Autofac + SignalR

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces(); 

builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest(); 
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest(); 

builder.RegisterAssemblyTypes(typeof(adminRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest(); 

builder.RegisterAssemblyTypes(typeof(adminService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest(); 

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

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

上面的代码工作得很好,但注册我的集线器后,下面的代码,它只是不起作用。

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); 

我使用SignalR依赖解析器从这个结合Autofac(https://github.com/pszmyd/SignalR.Autofac)。

我有一个简单的枢纽这样,

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

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

这是当我试图用DI到轮毂上,我得到了错误。

“没有范围与标签匹配的'httpRequest'从请求实例的范围中可见。”

不管我做什么,我似乎都无法使它工作,如果有人能告诉我上面的代码有什么问题,我将不胜感激。

非常感谢 利奥

+0

Btw - 您正在运行哪个版本的SignalR?明天我会详细研究你的代码,但我很确定这里有些事情不对。请更正粘贴的代码 - 第一个框中的最后一行似乎成为孤儿:) –

+0

感谢您的回复。我正在使用SignalR版本0.5.3,如果我将InstancePerHttpRequest更改为InstancePerLifetimeScope,那么很不幸,我不能再向数据库添加新记录(使用EF作为数据层)。任何帮助将不胜感激,谢谢! – Leo

回答

1

设置DependencyResolver之后你还需要将它传递给MapHubs,那就是试试这个来代替:

GlobalHost.DependencyResolver = resolver; 

RouteTable.Routes.MapHubs(); 

我知道SignalR但从未使用Autofac但它可能是值得看的这些问题的答案对可能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

感谢您的快速回复。不幸的是,我仍然遇到了同样的错误信息。 – Leo

3

对于托管在IIS的ASP.NET应用程序中添加这的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 }); 

您可能会发现SignalRAutofacDependencyResolver here

例毂注入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);   
    } 
} 

这也适用于SignalR self host release。只需使用像这样的启动类:

// 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 }); 
    } 
}