我想在核心中创建作用域容器 asp.net 并在单例方法的 2 种方法中使用它。
我已经尝试在每种方法中创建它。 它有效,但我认为这是开销。
var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>();
var scope = scopeFactory.CreateScope();
var scopedContainer = scope.ServiceProvider;
当我需要它时,我会在每个方法中编写它。我认为这是逻辑错误。请解释一下如何正确操作?谢谢
从技术上讲,您这样做的方式并不正确。如果在单一实例服务中,并且需要访问作用域内的服务,则应创建新的服务作用域,并从该作用域的服务提供程序检索服务。完成后,您还应该处理范围。
在实践中,您可以稍微简化一下。应避免将IServiceProvider
直接注入服务。相反,您可以直接注入IServiceScopeFactory
。然后,您还应该使用 using
语句创建范围,以确保在使用后正确处置它。
因此,示例单例服务可能如下所示:
public class ExampleSingletonService
{
private readonly IServiceScopeFactory _serviceScopeFactory;
public ExampleSingletonService(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}
public async Task DoSomethingAsync()
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var db = scope.ServiceProvider.GetService<MyDbContext>();
db.Add(new Foo());
await db.SaveChangesAsync();
}
}
}
如您所见,这并没有那么多开销。但是,当然,这会使您在是否要在单一实例中使用作用域服务时三思而后行。