Вы можете попробовать сначала зарегистрировать свой контекст как обычно:
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")));