Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用
使用Dapr 客戶端 處理服務調用,需要遵循的他的模式,通常代碼是這個樣子的:
var client = DaprClient.CreateInvokeHttpClient(appId: "routing"); var response = await client.GetAsJsonAsync($"/accounts/{17}", cancellationToken); var account = await response.Content.ReadFromJsonAsync<Account>(cancellationToken: cancellationToken);我更希望是這樣子調用:public interface IBank
{
??????????? [HttpGet("/accounts/{accountId}")]
??????????? Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);
?????????? [HttpPost("/deposit")]
??????????? Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
?????????? [HttpPost("/withdraw")]
??????????? [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
??????????? Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}
public interface IBank
{
????????? [HttpGet("/accounts/{accountId}")]
????????? Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);
????????? [HttpPost("/deposit")]
????????? Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
????????? [HttpPost("/withdraw")]
????????? [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
????????? Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}
? public class WebapiClientExample : Example
?? {
?????? public override string DisplayName => "WebapiClient";
????? private IBank bankClient;
????? public WebapiClientExample(IBank bank)
?????? {
?????????? bankClient = bank;
?????? }
????? public override async Task RunAsync(CancellationToken cancellationToken)
?????? {
?????????? var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);
?????????? // Scenario 1: Check if the account already exists.
?????????? Account? account = null;
?????????? try
?????????? {
?????????????? account = await bankClient.GetUser("17", cancellationToken);
?????????? }
?????????? catch (ApiException ex)
?????????? {
?????????????? // Account does not exist.
?????????? }
????????? Console.WriteLine($"Scenario 1: account '17' {(account is null ? "does not exist" : "already exists")}");
????????? // Scenario 2: Deposit some money
?????????? var transaction = new Transaction()
?????????? {
?????????????? Amount = 100m,
?????????????? Id = "17",
?????????? };
????????? // read updated balance
?????????? account = await bankClient.Deposit(transaction, cancellationToken);
?????????? Console.WriteLine($"Scenario 2: account '17' has '{account?.Balance}' money");
????????? // Scenario 3: Handle a validation error without exceptions
?????????? transaction = new Transaction()
?????????? {
?????????????? Amount = 1_000_000m,
?????????????? Id = "17",
?????????? };
?????????? HttpResponseMessage response = null;
????????? response = await bankClient.Withdraw(transaction, cancellationToken);
?????????? if (response.StatusCode != HttpStatusCode.BadRequest)
?????????? {
?????????????? // We don't actually expect this example to succeed - we expect a 400
?????????????? Console.WriteLine("Something went wrong :(");
?????????????? return;
?????????? }
?????????? var problem = await response.Content.ReadFromJsonAsync<ProblemDetails>(cancellationToken: cancellationToken);
?????????? Console.WriteLine($"Scenario 3: got the following errors:");
?????????? foreach (var kvp in problem!.Errors)
?????????? {
?????????????? Console.WriteLine($"{kvp.Key}: {string.Join(", ", kvp.Value)}");
?????????? }
?????? }
?? }
var services = new ServiceCollection();
???????????? services.AddTransient<Example, WebapiClientExample>();
???????????? services.AddLogging();
??????????? services
???????????????? .AddScoped<InvocationHandler>()
???????????????? .AddHttpApi<WebapiClientExample.IBank>(o => o.HttpHost = new Uri("http://bank"))
?????????????????.AddHttpMessageHandler<InvocationHandler>();
??????????? var serviceprovider = services.BuildServiceProvider();
代碼的核心部分就在于上面紅色的部分,我們把InvocationHandler 加入到AddHttpApi ,就可以和 dapr 一起玩耍了。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式之责任链
- 下一篇: 理论修炼之ETCD,高一致性Key-Va