【发布时间】:2021-06-11 05:55:07
【问题描述】:
每当客户端向我的 ASP .NET Core 3.1 API 发出请求时,我想使用 HttpClient 在其他服务中执行一些操作。
我用依赖注入注册了HttpClient:
services.AddHttpClient<MyHttp>();
不幸的是,这个HttpClient 的BaseAddress 不是静态的。相反,客户端发送一个自定义标头,包括对数据库条目的引用。
因此,为了确定我的 HttpClient 的 BaseAddress,我需要对我的数据库进行异步调用。
目前我正在执行以下操作:
public class SomeController
{
public SomeController(MyHttp http, AddressRepository db)
{
_http = http;
_db = db;
}
public async Task<dynamic> SomeAction([FromRoute] string id)
{
var address = await _db.Get(id);
_http.BaseAddress = new Uri(address);
var res = await _http.GetAsync("some-path");
//Handle response and do some business-logic
return new { };
}
}
这可行,但每当我在任何服务中使用 MyHttp 时,我都需要确保该服务设置了 BaseAddress 属性。
我宁愿提供地址作为构造函数参数。
首先,我想到了工厂实现。但是services.AddScoped(serviceProvider => {}) 不支持异步操作(而且我知道对象初始化应该快速可靠)。
但我觉得我目前的解决方案也是一种不好的做法。有没有更好的方法呢?
【问题讨论】:
-
您也许可以添加一个委托处理程序并在异步的 Send 方法中添加您的逻辑。在 AddHttpClient 调用之上添加处理程序还有其他扩展方法。不确定如何使用基地址
标签: c# asp.net-core dependency-injection factory-pattern