通常,是推荐来创建一个实现IHttpClient或IHttpClientFactory的包装器。同时,一些新奥尔良样本表示,可以按需创建HttpClient实例,并直接从谷物中使用。
问题
IHttpClient的包装器,还是直接从谷物中调用HttpClient?GrainService和GrainServiceClient有什么区别?public interface IRemoteGrainService : IGrainService
{
Task<T> Get<T>(string source) where T : new();
}
public class RemoteGrainService : GrainService, IRemoteGrainService
{
private IGrainFactory _grainFactory;
private HttpClient _remoteService;
public RemoteGrainService(
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()
{
_remoteService = new HttpClient();
await base.Start();
}
public override Task Stop()
{
_remoteService.Dispose();
return base.Stop();
}
public Task<T> Get<T>(string source) where T : new()
{
return JsonConvert
.DeserializeObject<T>(
await _client.GetAsync(source))
.Content
.ReadAsStringAsync);
}
}发布于 2020-09-30 23:29:47
在新奥尔良使用HttpClient时,您应该遵循标准的最佳实践。该示例正在创建一个新的示例,以简化说明,而不是作为最佳实践的指示。将示例文档更改为使用IHttpClientFactory (例如)的PR可能会被接受。
您不需要GrainService从您的谷物调用HTTP :您可以注入所需的依赖项(IHttpClientFactory或类型化客户端),并直接从谷物代码调用HTTP。
关于GrainService和GrainServiceClient的目的问题,GrainService是一种特殊的服务,可以从谷物代码中访问。GrainServices在集群中的每个节点上实例化,每个节点都负责一组谷物。例如,在新奥尔良使用GrainService实现提醒(持久计时器),每个节点上的LocalReminderService负责一组谷物,并在提醒到期时唤醒这些谷物。GrainServiceClient被谷物用来访问负责调用谷物的GrainService实例。文档在这里解释了更多的内容:https://dotnet.github.io/orleans/Documentation/grains/grainservices.html
除非您找到一个非常适合的用例,否则我将避免使用GrainService。
https://stackoverflow.com/questions/64146335
复制相似问题