【问题标题】:Autofac + SignalRAutofac + SignalR
【发布时间】:2012-09-25 13:15:33
【问题描述】:

我对 autofac 和 singalR 库都是全新的,所以请放轻松!我在引导程序中有以下代码,它可以在没有 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));

上面的代码可以正常工作,但是在使用下面的代码注册我的 Hub 后,它就不起作用了。

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 依赖解析器从这个 (https://github.com/pszmyd/SignalR.Autofac) 绑定到 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”匹配的标记的范围。”

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

非常感谢 狮子座

【问题讨论】:

  • 顺便说一句 - 您正在运行哪个版本的 SignalR?明天我会详细研究你的代码,但我很确定这里有问题。请更正粘贴的代码 - 第一个框中的最后一行似乎是孤立的:)
  • 感谢您的回复。我使用的是 SignalR 0.5.3 版,如果我将 InstancePerHttpRequest 更改为 InstancePerLifetimeScope,不幸的是它工作正常,我不能再向数据库添加新记录(使用 EF 作为数据层)。任何帮助将不胜感激,谢谢!

标签: .net asp.net-mvc dependency-injection autofac signalr


【解决方案1】:

对于托管在 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 });
    }
}

【讨论】:

    【解决方案2】:

    设置 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

    【讨论】:

    • 感谢您的快速回复。不幸的是,我仍然遇到同样的错误消息。
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2015-12-14
    • 2020-04-18
    相关资源
    最近更新 更多