gpt4 book ai didi

dependency-injection - 如何在 MVC 5 应用程序中配置 Autofac 和 SignalR

转载 作者:行者123 更新时间:2023-12-03 23:23:45 25 4
gpt4 key购买 nike

我正在尝试将 MVC 5 应用程序配置为使用 SignalR 2.2.x 并将服务注入(inject)我的 NotificationsHub .
我们将 Autofac 用于 MVC,但我不确定如何正确配置它。
NuGet 存在 Autofac 文档 Autofac.Integration.SignalR (3.0.2)Autofac.Integration.Mvc (3.3.4) .

到目前为止,我正在做的是通过以下方式注册集线器:

ContainerBuilder builder = new ContainerBuilder();

// Register MVC controllers.
builder.RegisterControllers(typeof(MvcApplication).Assembly);

builder.RegisterType<ServiceForSignalRHub>().AsImplementedInterfaces();
builder.RegisterType<...>().AsImplementedInterfaces();

builder.RegisterHubs(Assembly.GetExecutingAssembly());

IContainer container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

但是调用 .SetResolver(...)是模棱两可的,因为它存在于 MVC 和 SignalR 集成包中。怎么办?我无法确认我的服务的构造函数注入(inject)是否适用于我正在使用的集线器。

编辑

我可以用 Autofac 配置 MVC5 就好了。我迷路的地方是如何使用 Autofac Signal 集成 NuGet 对 SignalR 做同样的事情。
请看下文。


这是我的启动课:

public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var defaultFactory = LogManager.Use<DefaultFactory>();
defaultFactory.Directory("@D:\\NServiceBus\\ );
defaultFactory.Level(LogLevel.Debug);

var container = ConfigureAutofac(app);

ConfigureServiceBus(container, app);

app.UseAutofacMiddleware(container); // REGISTER WITH OWIN
app.UseAutofacMvc();

ConfigureAuth(app);

GlobalConfiguration.Configuration.UseSqlServerStorage("hangfire");

ConfigureSignalR(app);
}
}

这是我配置 SignalR 的部分:

public partial class Startup
{
public void ConfigureSignalR(IAppBuilder app)
{
var builder = new ContainerBuilder();

builder.RegisterHubs(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterType<MaintenanceService>().As<IMaintenanceService>().PropertiesAutowired();

var container = builder.Build();
//var container = new AutofacContainer().Container;

var resolver = new AutofacDependencyResolver(container);

// Any connection or hub wire up and configuration should go here
app.MapSignalR(new HubConfiguration
{
Resolver = resolver,
EnableJSONP = true,
EnableDetailedErrors = true,
EnableJavaScriptProxies = true
});

builder.RegisterInstance(resolver.Resolve<IConnectionManager>());
}
}

如何正确地做到这一点?

最佳答案

您应该明确告诉 SignalR 使用 AutofacDependencyResolver当你映射它时。
我假设你知道在你的 Startup您必须调用的类(class)app.MapSignalR();
当你映射它时,你应该告诉它使用自定义依赖解析器(AutofacDependencyResolver)。

这是我的做法:

var resolver = new AutofacDependencyResolver(container);

app.MapSignalR(new HubConfiguration
{
Resolver = resolver
});

这样,您就可以直接告诉 SignalR 要使用哪个依赖解析器。

我有一个 GitHub repo for SignalR Dependency Injection ,但未配置为使用 MVC。不过,我认为它会为您提供有关如何创建配置的提示。

注意:如果您使用的是 OWIN 中间件,请务必不要使用 GlobalHost完全是静态属性,因为它将有大量的不一致。

A common error in OWIN integration is use of the GlobalHost. In OWIN you create the configuration from scratch. You should not reference GlobalHost anywhere when using the OWIN integration.



再次,检查我给你的 repo ,看看如何做到这一点。

希望这可以帮助:)
祝你好运!

关于dependency-injection - 如何在 MVC 5 应用程序中配置 Autofac 和 SignalR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511095/

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