配置服务时如何通过依赖注入在 Azure Function V3 中注入或使用 IConfiguration

2024-01-10

通常在 .NET Core 项目中,我会创建一个“引导”类来配置我的服务以及 DI 注册命令。这通常是一个扩展方法IServiceCollection我可以在哪里调用类似的方法.AddCosmosDbService并且所有必要的东西都是包含该方法的静态类中的“独立”。但关键是该方法得到一个IConfiguration来自Startup class.

我过去曾在 Azure Functions 中使用过 DI,但尚未遇到此特定要求。

我正在使用IConfiguration绑定到一个具体类,其属性与我的两个设置相匹配local.settings.json以及在 Azure 中部署该函数时的开发/生产应用程序设置。

CosmosDbClientSettings.cs

/// <summary>
/// Holds configuration settings from local.settings.json or application configuration
/// </summary>    
public class CosmosDbClientSettings
{
    public string CosmosDbDatabaseName { get; set; }
    public string CosmosDbCollectionName { get; set; }
    public string CosmosDbAccount { get; set; }
    public string CosmosDbKey { get; set; }
}

BootstrapCosmosDbClient.cs

public static class BootstrapCosmosDbClient
{
    /// <summary>
    /// Adds a singleton reference for the CosmosDbService with settings obtained by injecting IConfiguration
    /// </summary>
    /// <param name="services"></param>
    /// <param name="configuration"></param>
    /// <returns></returns>
    public static async Task<CosmosDbService> AddCosmosDbServiceAsync(
        this IServiceCollection services,
        IConfiguration configuration)
    {
        CosmosDbClientSettings cosmosDbClientSettings = new CosmosDbClientSettings();
        configuration.Bind(nameof(CosmosDbClientSettings), cosmosDbClientSettings);

        CosmosClientBuilder clientBuilder = new CosmosClientBuilder(cosmosDbClientSettings.CosmosDbAccount, cosmosDbClientSettings.CosmosDbKey);
        CosmosClient client = clientBuilder.WithConnectionModeDirect().Build();
        CosmosDbService cosmosDbService = new CosmosDbService(client, cosmosDbClientSettings.CosmosDbDatabaseName, cosmosDbClientSettings.CosmosDbCollectionName);
        DatabaseResponse database = await client.CreateDatabaseIfNotExistsAsync(cosmosDbClientSettings.CosmosDbDatabaseName);
        await database.Database.CreateContainerIfNotExistsAsync(cosmosDbClientSettings.CosmosDbCollectionName, "/id");

        services.AddSingleton<ICosmosDbService>(cosmosDbService);

        return cosmosDbService;
    }
}

启动.cs

public class Startup : FunctionsStartup
{

    public override async void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddHttpClient();
        await builder.Services.AddCosmosDbServiceAsync(**need IConfiguration reference**); <--where do I get IConfiguration?
    }
}

显然添加了一个私有字段IConfiguration in Startup.cs不会工作,因为它需要填充一些东西,我也读过使用 DI 用于IConfiguration这不是一个好主意 https://github.com/Azure/azure-functions-host/issues/4464.

我也尝试过使用所描述的选项模式here https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#function-app-provided-services并按如下方式实施:

builder.Services.AddOptions<CosmosDbClientSettings>()
    .Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));

虽然这将有助于注入IOptions<CosmosDbClientSettings>对于非静态类,我使用静态类来保存我的配置工作。

关于如何使这项工作或可能的解决方法有什么建议吗?我更愿意将所有配置保留在一处(引导文件)。


As of 版本1.1.0 of Microsoft.Azure.Functions.Extensions https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions/您可以执行以下操作:

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        var configuration = builder.GetContext().Configuration;
        builder.Services.AddCosmosDbService(configuration);
    }
}

不幸的是,它仍然不支持异步配置,因此您仍然必须阻止等待任务完成或使用 @Nkosi 的答案描述的技巧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配置服务时如何通过依赖注入在 Azure Function V3 中注入或使用 IConfiguration 的相关文章

随机推荐

  • React Native FlatList - 可变列

    我正在开发一个无限滚动的产品列表 其中包含不同类型的产品 产品可以是特色产品 也可以是非特色产品 当产品展示时 我们的产品卡设计会占据手机的整个宽度 否则设计需要 2 列行 数据看起来像这样 type featured product na
  • 图像的鼠标按下、鼠标移动和鼠标松开事件?

    如何用鼠标移动图像 onmousedown and onmousemove处理的事件是否正确
  • 立方到等距柱状投影算法

    我有一个定义周围环境的立方体贴图纹理 但是我需要将其传递给仅适用于纬度 经度贴图的程序 我真的不知道如何进行翻译 这里有什么帮助吗 换句话说 我需要从这里出发 对此 我认为该图像在 x 轴上有一个额外的 90 旋转 update 我得到了投
  • Yii2 创建一个没有模型的表单

    我想知道如何在 Yii2 框架中创建一个没有模型的表单 因为我正在创建一个 mailchimp 注册表单 因此不需要模型 下面的代码会生成一个表单 但是正如您所看到的 它使用了一个模型 我是否仍然使用 activeform 如何删除 mod
  • 视频静音/取消静音按钮 javaScript

    JavaScript 初学者看这里 我正在尝试用 javaScript 为学校项目制作一个视频播放器 但我的静音按钮遇到了问题 我希望该按钮在单击时使视频静音 并在再次按下该按钮时取消静音 到目前为止 我只能将视频静音并保持静音 这是我当前
  • 用于提取括号之间的 3 位数字的正则表达式

    我的字符串是 Frequency FA ID VerifiedFA0 FAID5 125 FA1 FAID7 175 FA2 FAID1 476 我尝试创建的正则表达式应该提取这些数字 125 175 476 我通过查看做到了这个例子 ht
  • 垂直对齐 div 元素中的图像?

    我有一个 div 元素 其高度设置为em 其宽度我设置为百分比 里面有一张图片 它的宽度以百分比表示 83 但是 如果我的分辨率使 div 元素开始变得有点窄 则图像也会变窄 但图像不会占据整个 div 应有的 而是会变小并出现在div 的
  • 如何使用 VB6 获取硬件信息,例如 CPU 名称、总 RAM 等?

    标题几乎说明了一切 我需要使用 VB6 获取一些硬件信息 例如 CPU 信息和总 RAM 理想情况下 它会为 CPU 返回类似以下内容 英特尔酷睿 2 四核 Q8500 2 66 GHz 对于 RAM 来说 有些简单的东西 比如计算机总共拥
  • Laravel 使用请求获取 POSTed 数据

    在 Laravel 中如何获取请求正文 我正在尝试 request gt get data 但得到空结果 我正在向控制器中的存储功能发出 POST 请求 但无法获取 POST 数据 public function store Request
  • Golang:即使数据库关闭,第二次 Ping 也会成功

    我遇到了一个有趣的问题 即 db Ping 不会返回错误 即使数据库自第一次尝试以来已被终止 源代码如下 import database sql fmt log time github com go sql driver mysql typ
  • Assembly.ReflectionOnlyLoadFrom 不起作用

    我有一个集会Library1 dll其中包含一些接口 这些接口被序列化为字节数组到数据库中 由于某些原因 我们必须更改接口属性和定义 所以现在我正在编写一个迁移实用程序 所以我有两个版本Library1 dll 在我的实用程序中 我创建了一
  • 使用多核使用 g++ 进行编译

    快速问题 允许 g 生成自身的多个实例以便更快地编译大型项目 例如 多核 CPU 一次 4 个源文件 的编译器标志是什么 您可以使用 make 来完成此操作 使用 gnu make 时 它 是 j 标志 这对单处理器机器也有帮助 例如 如果
  • 程序终止后动态分配内存

    当包含动态分配内存 使用 malloc new 而没有 free delete 调用的 C C 程序终止时 动态分配的内存会发生什么 操作系统是否收回内存 或者其他程序是否无法访问该内存 我不认为语言标准有任何保证 但是支持稀疏虚拟内存和内
  • 对 SliverList 中的变化进行动画处理

    我目前有一个SliverList其项目是动态加载的 问题是一旦这些项目被加载 SliverList更新而不动画更改 在加载和加载之间进行转换very刺耳的 我看到AnimatedList存在 但它不是条子 所以我不能将它直接放入Custom
  • python 迭代文本文件直到满足条件

    我想继续迭代文本文件 直到满足循环内的当前条件 这是示例文本 10 01 N A 10 02 N A 10 03 N A 10 04 N A 10 05 N A 10 06 N A 10 07 N A 10 08 N A 10 09 N A
  • 用R计算多个多边形之间的最小距离

    我对 R 和 sf 包还是有点陌生 我有两组多边形数据正在尝试分析 我的第一组多边形 火灾 包含数百个野火周界 第二组 城镇 包含数百个城市区域边界 对于每次火灾 我想计算到最近城镇的距离 火灾多边形边缘到最近城镇多边形边缘 并将其作为字段
  • Meteor 的 Iron Router - 将多个路径路由到一个模板,但仍然是 DRY

    我想将多个路径路由到同一个模板 例如 abc home and home都会显示home模板 路径也可以有子路径 所以abc parent child and parent child也应该路由到相同的路径 I can 简单地重复 Rout
  • 使用 PHP 对从 CSV 数据构建的多维数组进行排序

    尝试对 PHP 中从 CSV 填充的数组进行排序 理想情况下 我也希望能够通过单击来控制排序此处表格中的选项卡 http wakeuptv com shows 不过 现在我手头的第一个任务就是整理该死的东西 已经为此工作了 3 天多了 非常
  • ASP.net 中的免费 PDF 查看器

    我有许多二进制格式的 PDF 文档 位于 SQL Server 2008 数据库中 我的 ASP net 页面中有一个 gridview 当用户单击记录的任何 ID 列时 我需要在浏览器中打开 pdf 有没有免费的 PDF 查看器控件 如何
  • 配置服务时如何通过依赖注入在 Azure Function V3 中注入或使用 IConfiguration

    通常在 NET Core 项目中 我会创建一个 引导 类来配置我的服务以及 DI 注册命令 这通常是一个扩展方法IServiceCollection我可以在哪里调用类似的方法 AddCosmosDbService并且所有必要的东西都是包含该