c# - 在 .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。有什么方法可以更有效地编写上面的代码吗?谁能建议我更好的方法。任何帮助,将不胜感激。谢谢
解决方案
这是您可以使用的模型:
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;
}
//...
}
这里有另一个选项模式的例子:
您可以使用它来注入您的设置并使它们在整个解决方案中可见。微软强烈推荐它。
如果您想了解更多信息: https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1
推荐阅读
- java - 我手机中的这个应用商店笔记在它第一次运行时运行它,然后我单击添加按钮并且应用程序崩溃。从手机加载应用程序数据的问题
- json - 如何读取包含许多下级的 pandas 数据帧复杂 JSON 文件
- python - Python请求接收状态码400中的问题
- node.js - 如何将整数值作为 JSON 后值发送并在 express JS 文件中处理?
- javascript - 有没有办法使用 Javascript 显示此幻灯片上的最后一张图片?
- javascript - 努力兑现承诺
- vim - FZF之类的快速切换到目录的方式?在 Vim FZF 中包含隐藏文件?
- android - 关闭所有用户会话 Android Firebase
- java - 在绘画面板上添加消息框
- javascript - Add image files into react state using 'useState'