将SignalR的ITransportHeartbeat添加到Autofac。

问题描述 投票:1回答:1

我试图使用Autofac来实现一个实例的功能。ITTransportHeartbeat 接口来跟踪所有连接的用户。我使用了 ITransportHeartbeat 接口,以确定用户的连接是否仍然有效。要做到这一点,我需要通过使用Autofac为应用程序拥有一个SignalR集线器的实例。

挑战是:当我运行应用程序时,它从来没有击中被覆盖的 OnConnected(), OnReconnected()OnDisconnected() 在SignalR中心。然而,客户端的 hub.start() 被击中,我看到 Hub Started 的消息。

$.connection.hub.start().done(function () {
    console.log("Hub Started");
});

如果我在中心中添加一个无参数的构造函数,它确实能打到他们,但随后的 ITransportHeartbeat 接口是空的,这就失去了将接口注入集线器的意义。

我参考了以下内容,以寻求帮助。

这里是 Startup.cs:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);

        var builder = new ContainerBuilder();
        var config = GlobalConfiguration.Configuration;

        builder.RegisterControllers(typeof(MvcApplication).Assembly)
            .InstancePerRequest();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
            .InstancePerRequest();

        var signalRConfig = new HubConfiguration();
        builder.RegisterType<MonitoringHubBase>().ExternallyOwned();

        builder.RegisterType<Autofac.Integration.SignalR.AutofacDependencyResolver>()
            .As<Microsoft.AspNet.SignalR.IDependencyResolver>()
            .SingleInstance();
        builder.Register(context => 
            context.Resolve<Microsoft.AspNet.SignalR.IDependencyResolver>()
            .Resolve<IConnectionManager>()
            .GetHubContext<MonitoringHubBase, IMonitoringHubBase>())
            .ExternallyOwned();
        builder.RegisterType<Microsoft.AspNet.SignalR.Transports.TransportHeartbeat>()
            .As<Microsoft.AspNet.SignalR.Transports.ITransportHeartbeat>()
            .SingleInstance();

        var container = builder.Build();
        DependencyResolver.SetResolver(
            new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

        signalRConfig.Resolver = container
            .Resolve<Microsoft.AspNet.SignalR.IDependencyResolver>();

        app.UseAutofacMiddleware(container);
        app.MapSignalR("/signalr", signalRConfig);

        config.DependencyResolver = 
            new AutofacWebApiDependencyResolver((IContainer)container);

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

这是一个中心,其他的中心都是从这个中心衍生出来的。

public interface IMonitoringHubBase
{
    Task OnConnected();
    Task OnReconnected();
    Task OnDisconnected(bool stopCalled);
}

public abstract class MonitoringHubBase : Hub<IMonitoringHubBase>
{
    private ITransportHeartbeat Heartbeat { get; }

    public MonitoringHubBase(ITransportHeartbeat heartbeat)
    {
        Heartbeat = heartbeat;
    }

    public MonitoringHubBase()
    {
    }

    public override async Task OnConnected()
    {
        // Add connection to db...
    }

    public override async Task OnReconnected()
    {
        // Ensure connection is on db...
    }

    public override async Task OnDisconnected(bool stopCalled)
    {
        // Remove connection from db...
    }

    public async Task SomeMethod(int id)
    {
        // Heartbeat object used here...
    }
}

这里是继承自基本枢纽的枢纽之一。

[HubName("MyHub")]
public class MyHub : MonitoringHubBase
{
    public MyHub(ITransportHeartbeat heartbeat) : base(heartbeat)
    {
    }

    public MyHub()
    {   
    }
}
c# asp.net dependency-injection signalr autofac
1个回答
2
投票

找到一个解决方案 从枢纽中删除了无参数的c'tor,并修改了......。Startup.cs 到;希望能帮助到下一个为此而苦恼的人。

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);

        var builder = new ContainerBuilder();
        var config = new HttpConfiguration();

        builder.RegisterHubs(Assembly.GetExecutingAssembly());
        builder.RegisterControllers(typeof(MvcApplication).Assembly)
            .InstancePerRequest();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
            .InstancePerRequest();
        builder.RegisterType<Microsoft.AspNet.SignalR.Transports.TransportHeartbeat>()
            .As<Microsoft.AspNet.SignalR.Transports.ITransportHeartbeat>()
            .SingleInstance();
        builder.RegisterType<Autofac.Integration.SignalR.AutofacDependencyResolver>()
            .As<Microsoft.AspNet.SignalR.IDependencyResolver>()
            .SingleInstance();

        var container = builder.Build();

        var signalRConfig = new HubConfiguration();
        signalRConfig.Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container);

        app.UseAutofacMiddleware(container);

        DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

        app.Map("/signalr", map =>
        {
            map.UseAutofacMiddleware(container);

            var hubConfiguration = new HubConfiguration
            {
                Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container),
            };

            map.RunSignalR(hubConfiguration);
        });

        config.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container);

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

在本文的帮助下。https:/kwilson.ioblogget-your-web-api-playing-nicely-with-signalr-on-owin-with-autofac。

© www.soinside.com 2019 - 2024. All rights reserved.