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