gpt4 book ai didi

.net - Autofac + SignalR

转载 作者:行者123 更新时间:2023-12-01 01:15:00 24 4
gpt4 key购买 nike

我对 autofac 和 singalR 库都是全新的,所以请放轻松!我在 Bootstrap 中有以下代码,它可以在没有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 依赖解析器从这个(https://github.com/pszmyd/SignalR.Autofac)绑定(bind)到 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 .

注入(inject) 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 });
}
}

关于.net - Autofac + SignalR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com