如何在.NET Core Console应用程序中处理Scoped服务实例?

Pro*_*ofK 17 .net c# dependency-injection console-application .net-core

ConfigureServices在我正在构建的Web应用程序中复制了这个,我试图远离Web,只使用控制台应用程序或服务:

serviceCollection.AddScoped<IDbConnection, SqlConnection>(c => new SqlConnection(App.Configuration.GetConnectionString("DefaultConnection")));
Run Code Online (Sandbox Code Playgroud)

控制台应用程序工作正常,但我想知道如何处理连接的生命周期.连接是否以及何时关闭或处置?或者这与瞬态实例的行为相同,我应该自己处理它?

Krz*_*cki 21

当您IServiceProviderIServiceCollection(BuildServiceProvider方法)构建并使用此实例IServiceProvider来解决时,IDbConnection您将获得IDbConnection每次相同的实例.范围是连接到IServiceProvider.要创建新的作用域,您需要从容器中解析IServiceScopeFactory并使用它来创建IServiceProvider作用域:

using (var scope = scopeFactory.CreateScope())
{
   var scopedConnection = scope.ServiceProvider.GetRequiredService<IDbConnection>();      
}
Run Code Online (Sandbox Code Playgroud)

处理范围时将处理连接.

在ASP Core作用域由中间件管理,中间件创建新作用域,然后使用IServiceProvider附加到此作用域来解析Controller和此Web请求中的所有内容.在控制台应用程序中,您需要自己管理范围.

  • 创建范围是否昂贵?我的代码(GraphQL 解析器)需要存在于单例外部作用域中,但我需要获取某个对象的作用域实例来引用 HTTP 请求。我认为这样做的唯一方法是创建我自己的范围并在其中解决,希望这不是一个昂贵的操作。 (2认同)
  • 这是否意味着控制台应用程序的“AddScoped”依赖项会默默地变成单例,这就是为什么它们“自动”工作而无需创建显式作用域的原因? (2认同)