public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextPool(option => { option.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }, poolSize: 200);
var serviceProvider = builder.Services.BuildServiceProvider();
var dbContext = serviceProvider.GetService()
// 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实例的情况下怎么消除该警告.
DbContext
实例的方式是正确的,可以通过 IServiceProvider.GetService<T>()
方法来获取 MyDbContext
的实例,即以下代码所示:var dbContext = serviceProvider.GetService<MyDbContext>();
警告是为了提醒程序员可能会出现的问题,但并不会影响程序的正常运行。如果确保在程序只使用了单一的服务提供程序实例的情况下使用 BuildServiceProvider 方法,那么这个警告可以被忽略。
DbContext
实例:public void Configure(IApplicationBuilder app, MyDbContext dbContext)
{
// 使用 dbContext
}
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 方法调用多次导致的不必要开销,提高程序的效率。
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);
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
var dbContext= app.Services.GetRequiredService<IServiceScopeFactory>().CreateScope().ServiceProvider.GetService<MyDbContext>();
一楼的回答很全面详细也是正常的使用方法,但是在这里我想这么写,这才是我寻求的答案