SignalR с Орлеаном, как передать SignalR из запуска в зерно - PullRequest
0 голосов
/ 22 февраля 2019

Я очень новичок в Орлеане и пытаюсь понять все с помощью зерен и т. Д.

Что я получил, так это то, что в своем файле 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 голосов
/ 25 февраля 2019

Зависит от того, как вы собираетесь использовать SignalR Server, если вы собираетесь разместить свой сервер SignalR в Microsoft Orleans, чтобы быть уверенным, что вам нужна объединительная плата для обработки связи в кластере Орлеана.

Вы можете использовать SignalR Orleans , в котором все готово для вас:)

Также, если вам нужна реактивная библиотека SignalR для внешнего интерфейса, вы можете использовать Sketch7 SignalR Client

Надеюсь, это поможет.

PS Я один из авторов обеих библиотек.

0 голосов
/ 23 февраля 2019

Orleans поддерживает инжекцию конструктора, поэтому вы можете вставить 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);
    }
}
...