加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – Autofac SignalR

发布时间:2020-12-16 06:22:32 所属栏目:asp.Net 来源:网络整理
导读:我对autofac和singalR库都是新手,所以请对我这么简单!我在bootstrapper中有以下代码,它在没有signalR的情况下自行运行. var builder = new ContainerBuilder();builder.RegisterControllers(Assembly.GetExecutingAssembly());builder.RegisterAssemblyType
我对autofac和singalR库都是新手,所以请对我这么简单!我在bootstrapper中有以下代码,它在没有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依赖解析器绑定到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’的标记的范围.”

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

非常感谢
狮子座

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读