Dependency injection 奥尔良的信号员如何将信号员从启动传送到谷物

Dependency injection 奥尔良的信号员如何将信号员从启动传送到谷物,dependency-injection,signalr,orleans,Dependency Injection,Signalr,Orleans,我对奥尔良很陌生,试图用谷物等来把握一切 我得到的是,在我的startup.cs文件中,我添加了如下信号器 public IServiceProvider ConfigureServices(IServiceCollection services) { Program.WriteConsole("Adding singletons"); services .AddSingleton(achievementManager)

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

我得到的是,在我的startup.cs文件中,我添加了如下信号器

public IServiceProvider ConfigureServices(IServiceCollection services)
    {

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

        return services.BuildServiceProvider();
    }
[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;
    }
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'.
到目前为止,一切都很好,我可以启动我的主机/应用程序,它可以连接到信号器。但我不能把我的头绕过去的是,我怎么才能把它记下来呢?如果我有一个控制器,我会在启动时简单地将它发送到构造函数中,但是我如何使用一个颗粒来实现这一点呢?或者我甚至可以这样做。感谢您的指导

在谷物中,我想做这样的事情

public IServiceProvider ConfigureServices(IServiceCollection services)
    {

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

        return services.BuildServiceProvider();
    }
[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;
    }
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'.
然后我尝试从另一个粒度调用Notify方法,如下所示

public IServiceProvider ConfigureServices(IServiceCollection services)
    {

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

        return services.BuildServiceProvider();
    }
[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;
    }
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'.

Orleans支持构造函数注入,因此您可以将SignalClient注入到grain构造函数中。在代码中,您已经使用services.addSingletonSignalClient正确注册了客户机,因此我将重点介绍如何将类型注入到您的粒度中

我不知道SignalR客户端对象是什么类型,但在本例中,我假设该类型是SignalClient:


Orleans支持构造函数注入,因此您可以将SignalClient注入到grain构造函数中。在代码中,您已经使用services.addSingletonSignalClient正确注册了客户机,因此我将重点介绍如何将类型注入到您的粒度中

我不知道SignalR客户端对象是什么类型,但在本例中,我假设该类型是SignalClient:


取决于您考虑如何使用SignalR Server,如果您要使用Microsoft Orleans托管您的SignalR Server,请确保您需要背板来处理Orleans群集通信

您可以使用现成的工具:

此外,如果您需要前端的反应式信号器库,您可以使用


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

取决于您如何使用SignalR Server,如果您要用Microsoft Orleans托管您的SignalR Server,请确保您需要背板来处理Orleans群集通信

您可以使用现成的工具:

此外,如果您需要前端的反应式信号器库,您可以使用


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

像这样的东西正是我想要的!如果你看我的编辑,这就是我现在试图实现的方式,SignalClient是一个HubConnection。但是,当另一个颗粒试图在编辑中这样调用时,我也遇到了一个错误。你知道为什么吗?你没有用DI容器注册HubConnection,所以你不能注入它。您必须使用要注入的相同类型注册客户端。调用AddSingletonT值时,可以显式指定它注册为T的类型,因此需要将其注册为HubConnection。AddSingletonSignalClient类似的东西就是我要找的!如果你看我的编辑,这就是我现在试图实现的方式,SignalClient是一个HubConnection。但是,当另一个颗粒试图在编辑中这样调用时,我也遇到了一个错误。你知道为什么吗?你没有用DI容器注册HubConnection,所以你不能注入它。您必须使用要注入的相同类型注册客户端。调用AddSingletonT值时,可以显式指定它注册为T的类型,因此需要将其注册为HubConnection。AddSingletonSignalClient