程爱动漫 2023-04-18 11:18 采纳率: 83.3%
浏览 29
已结题

asp.netcore中怎么在program中拿到DbContext实例


    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
                builder.Services.AddDbContextPool<MyDbContext>(option => { option.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }, poolSize: 200);
               var serviceProvider = builder.Services.BuildServiceProvider();
                var dbContext = serviceProvider.GetService<MyDbContext>()
            // Add services to the container.
            builder.Services.AddControllersWithViews();
            var app = builder.Build();

上面的代码,在vs2022 net7 asp.net core的progra.cs main方法中
builder.Services.BuildServiceProvider();这个地方提示警告
ASP0000 Calling 'BuildServiceProvider' from application code results in an additional copy of singleton services being created. Consider alternatives such as dependency injecting services as parameters to 'Configure'.
问题:
1、在这里获取dbcontext实例是不是这样获取,
2、该警告提示是否会影响程序,
3、在拿到dbcontex实例的情况下怎么消除该警告.

  • 写回答

2条回答 默认 最新

  • Nothing some time 2023-04-18 11:57
    关注
    1. 在程序中获取 DbContext 实例的方式是正确的,可以通过 IServiceProvider.GetService<T>() 方法来获取 MyDbContext 的实例,即以下代码所示:
    var dbContext = serviceProvider.GetService<MyDbContext>();
    
    1. ASP0000 警告提示 BuildServiceProvider 方法的调用会导致多个单例服务实例的创建,建议考虑使用依赖注入等其他方式。

    警告是为了提醒程序员可能会出现的问题,但并不会影响程序的正常运行。如果确保在程序只使用了单一的服务提供程序实例的情况下使用 BuildServiceProvider 方法,那么这个警告可以被忽略。

    1. 解决 ASP0000 警告可以采用如下几种方式:
    • 在 Configure 方法中使用依赖注入方式获取 DbContext 实例:
    public void Configure(IApplicationBuilder app, MyDbContext dbContext)
    {
        // 使用 dbContext
    }
    
    • 在 ConfigureService 方法中注册 DbContext,然后在 Configure 方法中通过参数注入的方式获取:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContextPool<MyDbContext>(option => { option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")); }, poolSize: 200);
        services.AddControllersWithViews();
    }
    
    public void Configure(IApplicationBuilder app, MyDbContext dbContext)
    {
        // 使用 dbContext
    }
    
    • 在配置 DbContext 注册时传递容器作用域以确保服务程序工厂不会创建使用单例实例时的新实例。
    services.AddDbContextPool<MyDbContext>(option => {
        option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
        option.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
        option.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
    }, poolSize: 200, providerName: "Microsoft.EntityFrameworkCore.SqlServer")
       .AddScoped<IServiceScopeFactory>(provider => provider.GetRequiredService<IServiceProvider>().GetService<IServiceScopeFactory>());
    

    以上方式中的任意一种能够解决警告问题,建议采用最佳实践,这样可以减少因为 BuildServiceProvider 方法调用多次导致的不必要开销,提高程序的效率。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月20日
  • 已采纳回答 4月20日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?