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

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 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示