【问题标题】:Consume Scoped Service From Singleton从 Singleton 使用 Scoped 服务
【发布时间】:2022-01-07 19:17:41
【问题描述】:

在使用来自单例的作用域时,我没有收到任何错误

根据下面的文章,我应该在启动服务后立即收到错误消息: https://dotnetcoretutorials.com/2018/03/20/cannot-consume-scoped-service-from-singleton-a-lesson-in-asp-net-core-di-scopes/

依赖注册:

builder.Services.AddScoped<ILogger, AppLogs>();
            builder.Services.AddSingleton<ICacheFactory>(x =>
            {
                string cacheConnectionString = "xyz";
                return new CacheFactory(cacheConnectionString, x.GetService<ILogger>());
            });

消耗:

    public class Function1
    {
        private readonly ICacheFactory cacheProvider;
        public Function1(ICacheFactory cacheProvider) {
            this.cacheProvider = cacheProvider;
        }


        [FunctionName("Function1")]
        public  async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {


            var result = await this.cacheProvider.GetResultsAsync<IEnumerable<string>>("abc").ConfigureAwait(false);}
}

单例中的作用域注入何时会产生问题?

【问题讨论】:

标签: asp.net-core dependency-injection singleton


【解决方案1】:

要在单例实例中使用作用域服务时出现错误,您必须在构建服务提供者时将 ValidateScopes 选项设置为 true,例如

var provider = services.BuildServiceProvider(validateScopes: true);

验证有点昂贵,因此您可以将其更改为仅在您这样开发时进行验证:

var provider = services.BuildServiceProvider(validateScopes: Debugger.IsAttached);

Documentation on BuildServiceProvider

【讨论】:

  • @Rosco..我试过了,但仍然没有问题...函数应用程序与 .net 核心 Web API 的依赖关系解析有什么区别吗?
  • 您正在使用工厂方法创建 ICacheFactory,因此 DI 系统可能无法理解您在单例中使用范围服务。文档说它在启动时运行检查,这听起来像是在查看已注册的服务,并且可能不运行工厂方法来查看请求了哪些服务。你可以创建一个带有作用域依赖的测试单例,看看它是否会引发验证错误。
猜你喜欢
  • 2019-08-02
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多