Gia*_*omo 1 c# dependency-injection asp.net-core
我想在asp.net核心中创建作用域容器,并在我的singleton方法的2种方法中使用它。
我试过在sigleton的每种方法中创建此方法。它有效,但是我认为这是开销。
var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>();
var scope = scopeFactory.CreateScope();
var scopedContainer = scope.ServiceProvider;
Run Code Online (Sandbox Code Playgroud)
在需要时,我会在每种方法中编写它。我认为这是逻辑错误。请给我解释一下如何正确执行?谢谢
从技术上讲,您的操作方式并不正确。如果您位于单例服务中,并且需要访问作用域服务,则应创建一个新的服务作用域,并从该作用域的服务提供者中检索服务。完成后,还应该处置范围。
在实践中,您可以稍微简化一下。您应该避免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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,是不是真的说了这么多的开销。但这当然会让您三思而后行,是否要在单个实例中使用作用域服务。
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |