Где хорошее место для избавления от объекта SqlConnection, созданного в AddDbContext?(.Net Core 2.2) - PullRequest
2 голосов
/ 13 июня 2019

Я пытаюсь настроить аутентификацию Azure Managed Identity для работы с моим приложением, которое я буду развертывать в службе приложений Azure для подключения к Azure SQL Server.

После просмотра некоторых примеров и примеров кода я пытаюсь выполнить следующую реализацию:

services.AddDbContext<MainContext>(optionsBuilder =>
{
    SqlConnection connection = new SqlConnection();
    connection.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
    connection.AccessToken = (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;

    optionsBuilder.UseSqlServer(connection);
});

Где было бы правильное место, чтобы избавиться от этого SqlConnection? Есть ли лучший способ реализовать эту настройку AccessToken?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вы можете попробовать сначала зарегистрировать свой контекст как обычно:

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")));
0 голосов
/ 13 июня 2019

Вам не нужно избавляться от соединения. Он подключен / настроен против DbContext и контекст управляет удалением. То, что у вас там, должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...