SignalR与orleans如何将SignalR从启动传递到谷物

时间:2019-02-22 09:07:53

标签: dependency-injection signalr orleans

我对奥尔良很陌生,试图用谷物等来掌握一切。

我得到的是,在我的startup.cs文件中,我像这样添加了SignalR

public IServiceProvider ConfigureServices(IServiceCollection services)
    {

        Program.WriteConsole("Adding singletons");
        services
            .AddSingleton(achievementManager)
            .AddMvc();
        services.AddSingleton(SignalRClient);

        return services.BuildServiceProvider();
    }

到目前为止,一切都很好,我可以启动我的主机/应用程序,它可以按需连接到SignalR。但是我无法解决的问题是如何解决这个问题?如果我有一个控制器,我只会在启动时将其发送到构造函数中,但是我该如何使用谷物呢?或者我什至可以这样做。任何指导表示赞赏。

然后我要做这样的事情

[StatelessWorker]
[Reentrant]
public class NotifierGrain : Grain, INotifierGrain
{
    private HubConnection SignalRClient { get; }

    public NotifierGrain(HubConnection signalRClient)
    {
        SignalRClient = signalRClient;
        SignalRClient.SendAsync(Methods.RegisterService, Constants.ServiceName);
    }

    public Task NotifyClients(object message, MessageType type)
    {

            var registerUserNotification = (RegisterUserNotificationModel)message;
                SignalRClient.SendAsync(Methods.RegisterUserToMultipleGroups, registerUserNotification.UserId, registerUserNotification.InfoIds);
        }

        return Task.CompletedTask;
    }

然后我尝试从另一个像这样的谷物中调用Notify方法

var notifier = GrainFactory.GetGrain<INotifierGrain>(Constants.NotifierGrain);
        await notifier.NotifyClients(notification, MessageType.RegisterUser);

但是尝试执行此操作会导致类似这样的错误

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.SignalR.Client.HubConnection' while attempting to activate 'User.Implementation.Grains.NotifierGrain'.

2 个答案:

答案 0 :(得分:2)

奥尔良支持构造函数注入,因此您可以将SignalRClient注入到您的谷物构造函数中。在您的代码中,您已经在使用services.AddSingleton(SignalRClient)正确地注册了客户端,因此我将重点介绍如何将类型注入您的粮食中。

我不知道SignalR客户端对象的类型是什么,但是在此示例中,我假定类型为“ SignalRClient”:

[StatelessWorker]
[Reentrant]
public class NotifierGrain : Grain, INotifierGrain
{
    private readonly SignalRClient signalRClient;

    public NotifierGrain(SignalRClient signalRClient)
    {
        this.signalRClient = signalRClient;
    }

    public async Task NotifyClients(object message, MessageType type)
    {
        var registerUserNotification = (RegisterUserNotificationModel)message;
        await this.signalRClient.SendAsync(
            MessageMethods.RegisterUserToMultipleGroups,
            registerUserNotification.UserId,
            registerUserNotification.infoIds);
    }
}

答案 1 :(得分:2)

如果要使用Microsoft Orleans托管SignalR服务器,请确保您需要使用背板来处理Orleans群集通信。

您可以使用SignalR Orleans,它为您提供了开箱即用的所有功能:)

此外,如果您需要前端的反应性SignalR库,则可以使用Sketch7 SignalR Client

希望这会有所帮助。

PS是这两个库的作者之一。