How to configure Autofac and SignalR in a MVC 5 application

后端 未结 3 1664
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-21 05:17

I am trying to configure an MVC 5 application to use SignalR 2.2.x and inject a service into my NotificationsHub. We are using Autofac for MVC but I am not sure

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-21 05:51

    I ended up with this (pay attention to comments):

    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
    
            IContainer container = AutofacConfig(app);
            app.UseAutofacMiddleware(container);
            app.UseAutofacMvc();
            DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));
            GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
            app.UseAutofacWebApi(GlobalConfiguration.Configuration);
    
            var hubConfiguration = new Microsoft.AspNet.SignalR.HubConfiguration()
            {
                // Resolve presolver from container
                Resolver = container.Resolve(),
            };
            app.MapSignalR(hubConfiguration);
    
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
    
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
    

    _

    private static IContainer AutofacConfig(IAppBuilder app)
    {
        var builder = new ContainerBuilder();
    
        RegisterSignalR(builder);
    
        return builder.Build();
    }
    

    _

    private static void RegisterSignalR(ContainerBuilder builder)
    {
        // Register Autofac resolver into container to be set into HubConfiguration later
        builder.RegisterType()
               .As()
               .SingleInstance();
    
        // Register ConnectionManager as IConnectionManager so that you can get
        // hub context via IConnectionManager injected to your service
        builder.RegisterType()
               .As()
               .SingleInstance();
    
        // Register hubs one by one
        builder.RegisterType().ExternallyOwned();
        builder.RegisterType().ExternallyOwned();
    }
    

    Thanks to @Nathan and his answer (originally found here) and logical thinking to figure out to register ConnectionManager as IConnectionManager

提交回复
热议问题