Эффективный способ подключения к azure фабрике данных в приложении Net core API - PullRequest
2 голосов
/ 06 августа 2020

net основное приложение. Я пытаюсь вызвать azure фабрику данных из моего основного приложения. net. Чтобы установить sh соединение и вызвать adf, я создал интерфейс ниже двумя методами.

 public interface IAzureDataFactoryRepository
 {
    public DataFactoryManagementClient InitiateConnection(AuthenticationConfig authenticationConfig);

    public Task<string> RunADFPipeline(DataFactoryManagementClient dataFactoryManagementClient, Dictionary<string, object> keyValuePairs, string resourceGroup, string dataFactoryName, string pieplineName);
 }

Затем я реализовал в классе, как показано ниже.

 public class AzureDataFactoryRepository : IAzureDataFactoryRepository
    {  

        private DataFactoryManagementClient _dataFactoryManagementClient;

        public DataFactoryManagementClient InitiateConnection(AuthenticationConfig authenticationConfig)
        {   
            var context = new AuthenticationContext("https://login.windows.net/" + authenticationConfig.TenantId);
            ClientCredential cc = new ClientCredential(authenticationConfig.ClientId, authenticationConfig.ClientSecret);
            AuthenticationResult result = context.AcquireTokenAsync(
                "https://management.azure.com/", cc).Result;
            ServiceClientCredentials cred = new TokenCredentials(result.AccessToken);
            _dataFactoryManagementClient = new DataFactoryManagementClient(cred)
            {
                SubscriptionId = authenticationConfig.SubscriptionId
            };
            return _dataFactoryManagementClient;
        }

        public async Task<string> RunADFPipeline(DataFactoryManagementClient dataFactoryManagementClient, Dictionary<string,object> keyValuePairs, string resourceGroup, string dataFactoryName, string pieplineName)
        {  
                CreateRunResponse runResponse = dataFactoryManagementClient.Pipelines.CreateRunWithHttpMessagesAsync(resourceGroup, dataFactoryName, pieplineName, parameters: keyValuePairs).Result.Body;
                return runResponse.RunId;
        }
    }

Интерфейс выше и класс I добавил на уровне репозитория. Всякий раз, когда я хочу вызвать свой конвейер ADF, я делаю, как показано ниже.

            var adfAuthSettings = Configuration.GetSection("AzureAdF").Get<ADFClient>();

            var azureAdAuthSettings = Configuration.GetSection("AzureAd").Get<AuthenticationConfig>();

            Dictionary<string, object> parameters = new Dictionary<string, object>
                {
                    {"parameter", parameters}
                };

            DataFactoryManagementClient dataFactoryManagementClient = azureDataFactoryRepository.InitiateConnection(azureAdAuthSettings);
            var result = await azureDataFactoryRepository.RunADFPipeline(dataFactoryManagementClient, parameters, adfAuthSettings.ResourceGroupName, adfAuthSettings.DataFactoryName, ApplicationConstants.SciHubPipeline);
            return result;

В приведенном выше коде всякий раз, когда я хочу сначала вызвать репозиторий ADF RunADFPipeline, я всегда должен вызывать InitiateConnection, передавая значения из моей конфигурации. Также каждый раз я должен звонить adfAuthSettings = Configuration.GetSection("AzureAdF").Get<ADFClient>();, чтобы загрузить значения в модель. Есть ли способ сделать это только один раз вместо того, чтобы делать это внутри всех методов? Тогда я смогу запустить метод RunADFPipeline. Каждый раз перед вызовом RunADFPipeline следует вызывать InitiateConnection. Есть ли способ более эффективно писать вышеуказанный код? Может ли кто-нибудь предложить мне лучший подход. Любая помощь будет оценена. Спасибо

1 Ответ

1 голос
/ 06 августа 2020

Это модель, которую вы можете использовать:

  public class AuthenticationConfig : IAuthenticationConfig 
  {
    public AuthenticationConfig ()
    {
    }
    public string Config{ get; set; }           
  }

  public interface IAuthenticationConfig 
  {
     public string Config{ get; set; }
  }

Это при запуске:

public Startup(IConfiguration configuration)
    {
       Configuration = configuration;
    }  
  
    public IConfiguration Configuration { get; }    

    public void ConfigureServices(IServiceCollection services)
    { 
            services.Configure<AzureSettings>(options =>
            {
               options.Config= 
               Configuration.GetSection("AuthenticationConfig : Config").Value;
          });
            //*inject your repositories 
            services.AddSingleton<IAzureDataFactoryRepository, AzureDataFactoryRepository >();

      }

Настроив это в своем стартовом апгрейде, вы сделаете возможным использовать его в своей системе:

 public class AzureDataFactoryRepository : IAzureDataFactoryRepository
 {  
    private readonly  AuthenticationConfig _authenticationConfig;
    public AzureDataFactoryRepository(IOptions<AzureSettings> authenticationConfig)
    {            
      _authenticationConfig= _authenticationConfig.Value.Config;           
    }
 //...
 }

Вот еще один пример Параметры шаблон:

Внедрение зависимости между двумя ASP. NET Основные проекты

Вы можете использовать его, чтобы ввести свои настройки и сделать их видимыми для всего решения. Его настоятельно рекомендует Microsoft.

Если вы хотите узнать больше: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1

...