您可以先像平常一样将上下文注册:
services.AddDbContext<MainContext>(builder =>
builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")))
根据
文档,默认情况下将其注册为“Scoped”,因此连接将在每个请求上自动打开和关闭。
默认情况下,AddDbContext扩展方法将DbContext类型注册为作用域生命周期。
然后,检索已注册的上下文并按以下方式添加访问令牌:
services.AddScoped<MainContext>(serviceProvider => {
var dbContext = serviceProvider.GetRequiredService<MainContext>();
var connection = dbContext.Database.GetDbConnection() as SqlConnection;
if(connection == null) {
return dbContext;
}
connection.AccessToken = (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;
return dbContext;
});
现在,在每个请求中,连接将被自动创建并处理,然后访问令牌将被检索。
另一种方式(可能更加干净),是通过继承您的上下文并在构造函数中添加令牌:
public class ContextWithAccessToken : MainDbContext
{
public ContextWithAccessToken(DbContextOptions options) : base(options)
{
var connection = (SqlConnection)this.Database.GetDbConnection();
connection.AccessToken = (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;
}
}
然后只需注册此上下文即可:
services.AddDbContext<ContextWithAccessToken>(builder =>
builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")))
Using (SqlConnection connection = new SqlConnection()) { }
吗? - GuidoG