首页 > 解决方案 > 在 .Net 核心 API 应用程序中连接到 azure 数据工厂的有效方法

问题描述

网络核心应用程序。我正在尝试从我的 .net 核心应用程序调用 azure 数据工厂。为了建立连接并调用 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;
        }
    }

上面的接口和类是我在存储库层中添加的。每当我想调用我的 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。有什么方法可以更有效地编写上面的代码吗?谁能建议我更好的方法。任何帮助,将不胜感激。谢谢

标签: c#asp.net.netazurerepository-pattern

解决方案


这是您可以使用的模型:

  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 Core 项目之间的依赖注入

您可以使用它来注入您的设置并使它们在整个解决方案中可见。微软强烈推荐它。

如果您想了解更多信息: https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1


推荐阅读