gpt4 book ai didi

c# - 在 Startup - Asp.Net Core 中调用 AddTransient 中的异步方法

转载 作者:行者123 更新时间:2023-11-30 16:38:49 25 4
gpt4 key购买 nike

我有一个用于获取一些信息的服务,该方法在链中有一堆异步调用。

public interface IFooService
{
Task<IFoo> GetFooAsync();
}

具体类,

public class FooService : IFooService
{
public async Task<IFoo> GetFooAsync()
{
// whole bunch of awaits on async calls and return IFoo at last
}
}

我在 StartUp 上注册了这个服务,

services.AddTransient<IFooService, FooService>();

此服务注入(inject)了其他几个服务。其中之一,

public class BarService : IBarService
{
private readonly IFooService _fooService;

public BarService(IFooService fooService)
{
_fooService = fooService;
}

public async Task<IBar> GetBarAsync()
{
var foo = await _fooService.GetFooAsync();

// additional calls & processing
var bar = SomeOtherMethod(foo);

return bar;
}
}

IFoo 是应用程序不可或缺的一部分,并在多个服务中使用。我的大部分代码都是 async 只是因为这个 IFooService 和它有一个返回 IFoo 的方法。

考虑到这个用例,我希望能够将 IFoo 注入(inject)所有其他服务,而不是使用 IFooService 注入(inject)它们。

我试了一下,

services.AddTransient<IFoo>(provider => 
{
var fooService = provider.GetService<IFooService>();
var foo = fooService.GetFooAsync().GetAwaiter().GetResult();
return foo;
});

但它向我发出了一个危险信号,因为我正在通过异步进行同步,我不确定这是否会导致任何问题,例如竞争条件。这样做会阻止启动吗?我正在寻找一种干净的方法来处理这个问题,当我们需要这样的东西时有什么建议吗?感谢您的帮助。

最佳答案

我猜你想要的是异步构造函数,不推荐。

here是关于它的更多信息并包含使用 Lazy<T> 的解决方案.

关于c# - 在 Startup - Asp.Net Core 中调用 AddTransient 中的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54339609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com