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

Joh*_*ohn 5 dependency-injection autofac signalr signalr-hub asp.net-mvc-5

我正在尝试配置 MVC 5 应用程序以使用 SignalR 2.2.x 并将服务注入到我的NotificationsHub. 我们正在使用 Autofac 进行 MVC,但我不确定如何正确配置它。NuGetAutofac.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));
Run Code Online (Sandbox Code Playgroud)

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

编辑

我可以使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我配置 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>());
    }
}
Run Code Online (Sandbox Code Playgroud)

如何正确地做到这一点?

rad*_*tei 3

AutofacDependencyResolver您应该在映射时明确告诉 SignalR 使用。我假设你知道在你的Startup课堂上你必须打电话app.MapSignalR();

当您映射它时,您应该告诉它使用自定义依赖项解析器( )AutofacDependencyResolver

我是这样做的:

var resolver = new AutofacDependencyResolver(container);

app.MapSignalR(new HubConfiguration
{
    Resolver = resolver
});
Run Code Online (Sandbox Code Playgroud)

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

我有一个用于 SignalR 依赖注入 的 GitHub 存储库,但它未配置为使用 MVC。尽管如此,我认为它会给您如何创建配置的提示。

注意:如果您使用 OWIN 中间件,请务必不要使用GlobalHost静态属性,因为它会出现大量不一致的情况。

OWIN 集成中的一个常见错误是使用 GlobalHost。在 OWIN 中,您从头开始创建配置。使用 OWIN 集成时,您不应在任何地方引用 GlobalHost。

再次检查我给您的存储库以了解如何执行此操作。

希望这会有所帮助:)祝你好运!