首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP核心DI:向.NET客户端提供异步BaseAddress

ASP核心DI:向.NET客户端提供异步BaseAddress
EN

Stack Overflow用户
提问于 2021-03-13 19:39:32
回答 1查看 268关注 0票数 0

每当客户端向我的ASPASCore3.1API发出请求时,我希望使用HttpClient在其他服务中执行一些操作。

我用依赖注入注册了HttpClient:

代码语言:javascript
复制
services.AddHttpClient<MyHttp>();

不幸的是,这个HttpClientBaseAddress不是静态的。取而代之的是,客户端发送一个自定义标头,其中包括对数据库条目的引用。因此,为了确定我的HttpClient的BaseAddress,我需要对我的数据库进行异步调用。

目前,我所做的事情如下:

代码语言:javascript
复制
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 => {})不支持异步操作(我知道对象初始化应该是快速和可靠的)。

但我觉得我目前的解决方案也是一种糟糕的做法。有没有更好的方法来做这件事?

EN

回答 1

Stack Overflow用户

发布于 2021-03-13 20:18:13

没错,服务集合注册不支持异步工厂-因为服务解析应该总是快速的。

但是在客户端创建后初始化baseAddress没有任何问题。因此,如果您希望确保使用正确基址初始化httpClient,那么将逻辑提取到将构建您的http客户端配置的单独类中如何呢?

代码语言:javascript
复制
public YourHttpClientFactory {
    private IHttpClientFactory _factory;

    public YourHttpClientFactory(IHttpClientFactory factory)
    {
        _factory = factory;
    }

    public Task<HttpClient> Create(Guid id) {
        var client = factory.createClient();
        // do your async client initialization
        return client;        
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66613039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档