GrainService是一种特殊的grain;它没有身份标识,并且在每个silo中运行,从silo的启动到关闭。
步骤1.创建接口。构建GrainService接口的原则,与构建任何其他的grain接口完全相同。
public interface IDataService : IGrainService {
Task MyMethod();
}
步骤2.创建DataService grain本身。如果可能,使GrainService可重入,以获得更好的性能。注意必要的基类构造函数调用。您也可以注入一个IGrainFactory
,这样您就可以从GrainService中进行grain调用。
关于流的一个注意事项:GrainService无法写入Orleans流,因为它不能在grain任务调度程序中工作。如果您需要GrainService为您写入流,那么您必须将对象发送给一种类型的Grain,以便写入流。
[Reentrant]
public class LightstreamerDataService : GrainService, IDataService {
readonly IGrainFactory GrainFactory;
public LightstreamerDataService(IServiceProvider services, IGrainIdentity id, Silo silo, ILoggerFactory loggerFactory, IGrainFactory grainFactory) : base(id, silo, loggerFactory) {
GrainFactory = grainFactory;
}
public override Task Init(IServiceProvider serviceProvider) {
return base.Init(serviceProvider);
}
public override async Task Start() {
await base.Start();
}
public override Task Stop() {
return base.Stop();
}
public Task MyMethod() {
}
}
步骤3.为GrainServiceClient创建一个接口,供其他的grain用来连接到GrainService。
public interface IDataServiceClient : IGrainServiceClient<IDataService>, IDataService {
}
步骤4.创建实际的grain服务客户端。它几乎只是作为数据服务的代理。不幸的是,您必须手动输入的所有方法映射,这些方法映射是多个简单的单行映射。
public class DataServiceClient : GrainServiceClient<IDataService>, IDataServiceClient {
public DataServiceClient(IServiceProvider serviceProvider) : base(serviceProvider) {
}
public Task MyMethod() => GrainService.MyMethod();
}
步骤5.将grain服务客户端注入到那些需要它的其他grain中。请注意,GrainServiceClient并不保证访问本地silo上的GrainService。您的命令可能会被发送给群集中的任何silo上的GrainService。
public class MyNormalGrain: Grain<NormalGrainState>, INormalGrain {
readonly IDataServiceClient DataServiceClient;
public MyNormalGrain(IGrainActivationContext grainActivationContext, IDataServiceClient dataServiceClient) {
DataServiceClient = dataServiceClient;
}
}
步骤6.将grain服务注入到silo本身。需要这样做,才能使silo启动GrainService。
(ISiloHostBuilder builder) => builder .ConfigureServices(services => { services.AddSingleton(); });
有一个扩展方法ISiloHostBuilder: AddGrainService
。其类型约束是:where T : GrainService
。最后调用这个点:orleans/src/Orleans.Runtime/Services/GrainServicesSiloBuilderExtensions.cs
return services.AddSingleton
基本上,在启动:orleans/src/Orleans.Runtime/Silo/Silo.cs var grainServices = this.Services.GetServices
时,silo从服务提供程序获取IGrainService
类型。
Grainservice项目应该要引用此NuGet包Microsoft.Orleans.OrleansRuntime
。
为了使其工作,您必须注册服务及其客户端。代码看起来像这样:
var builder = new SiloHostBuilder()
.AddGrainService() // Register GrainService
.ConfigureServices(s =>
{
// Register Client of GrainService
s.AddSingleton();
})