【问题标题】:How to get rid of warning "Calling 'BuildServiceProvider' from application code..."如何摆脱警告“从应用程序代码调用'BuildServiceProvider'......”
【发布时间】:2020-12-04 09:58:09
【问题描述】:

我有以下显示警告的代码...

从应用程序代码调用“BuildServiceProvider”会导致 正在创建的单例服务的附加副本。考虑 替代方案,例如依赖注入服务作为参数 '配置'。

这是来自ConfigureServices 的缩写 sn-p,它显示了它是如何使用的。基本上我需要解析 AdminDbContext 以将其传递给 Initialize 例程。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<AdminDbContext>(o => o.UseSqlServer("config settings here"));

        CustomerConnectionStrings.Instance.Initialize(services.BuildServiceProvider().GetService<AdminDbContext>());
    }

我需要做什么才能消除此警告?

我已经看到其他帖子展示了如何做到这一点,但我没有为我的特定用例建立连接。

【问题讨论】:

    标签: asp.net-core asp.net-core-3.1


    【解决方案1】:

    虽然我相信这可能是XY problem

    我会建议遵循警告中的建议

    考虑替代方案,例如依赖注入服务作为“配置”的参数。

    //...
    
    public void ConfigureServices(IServiceCollection services) {
    
        services.AddDbContext<AdminDbContext>(o => o.UseSqlServer("config settings here"));
    
        //...
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AdminDbContext adminDb) {
    
        CustomerConnectionStrings.Instance.Initialize(adminDb);
    
        //...
    }
    

    【讨论】:

    • 不知道为什么我没有连接到实际的 Configure 方法。感谢您指出这一点!
    【解决方案2】:

    @Nkosi 的答案是正确的,但如果有人正在寻找替代方案,您可以从应用程序获得任何服务:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AdminDbContext adminDb) {
    
        CustomerConnectionStrings.Instance.Initialize(App.ApplicationServices.GetService<IMyService>());
    
        //...
    }
    

    对于遇到此问题的任何人来说,还有另一个选择。有时使用单例而不是静态类更好: 当您初始化 CustomerConnectionStrings 时,您将请求 AdminDBContext 并将其传递给那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2010-10-17
      • 2013-11-10
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多