Azure functions Azure函数预编译F#CosmosDBTrigger环境配置

Azure functions Azure函数预编译F#CosmosDBTrigger环境配置,azure-functions,Azure Functions,我使用Azure函数和F#开发了一个事件存储。在不同的功能应用程序部署中,要让所有功能都按预期工作,还存在一些挑战(我在链的不同部分通过HTTP和Cosmos DB触发器与不同的功能进行工作和通信) 我已经做了相当多的重构,以及将逻辑与配置值分离,但是我似乎找不到一种方法来完全依赖配置来获得一些我不希望硬编码的值 尤其是这里的数据库名和集合名。即使我从配置中设置了值,它仍然需要我硬编码这些值 [<FunctionName("streamEventDataTrigger"

我使用Azure函数和F#开发了一个事件存储。在不同的功能应用程序部署中,要让所有功能都按预期工作,还存在一些挑战(我在链的不同部分通过HTTP和Cosmos DB触发器与不同的功能进行工作和通信)

我已经做了相当多的重构,以及将逻辑与配置值分离,但是我似乎找不到一种方法来完全依赖配置来获得一些我不希望硬编码的值

尤其是这里的数据库名集合名。即使我从配置中设置了值,它仍然需要我硬编码这些值

[<FunctionName("streamEventDataTrigger")>]
let CosmosStreamEventDataTrigger
    ([< CosmosDBTrigger ("store", "events", //Figure out how to pull this from Configuration *RIGHT NOW IT IS HARD-CODE
        DatabaseName = "FC_EventStoreDatabaseName",
        CollectionName =  "FC_EventCollectionName",
        ConnectionStringSetting = "FC_CosmosDBConnectionString",
        CreateLeaseCollectionIfNotExists = true )>] 
        documents: IReadOnlyList<Document>)
    (log : ILogger) = async {
            documents
            |> Cosmos.processDocumentFeed
            |> EventProjector.projectEntries            
            |> Async.RunSynchronously
            |> StreamInterface.writer
            |> Async.RunSynchronously
            |> ignore } |> Async.StartAsTask
[]
让宇宙流触发数据
([]
文件:IReadOnlyList)
(日志:ILogger)=异步{
文件
|>Cosmos.processDocumentFeed
|>EventProjector.projectEntries
|>异步运行
|>StreamInterface.writer
|>异步运行
|>忽略}|>Async.startask
我没有使用任何其他类型的绑定json文件或任何东西。这些都是通过zip文件编译和发布的


这不是紧急的或关键的,但如果没有解决,对我来说仍然是一个恼人的方面,我想其他人可能已经遇到了这一点,并且对如何解决这个问题有了答案。

这是源代码,您可以在这里看到设计师的意图:

using System;
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs.Description;
using Microsoft.Azure.WebJobs.Extensions.CosmosDB;

namespace Microsoft.Azure.WebJobs
{
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.ReturnValue)]
    [Binding]
    public sealed class CosmosDBAttribute : Attribute
    {
        public CosmosDBAttribute()
        {
        }

        public CosmosDBAttribute(string databaseName, string collectionName)
        {
            DatabaseName = databaseName;
            CollectionName = collectionName;
        }

        [AutoResolve]
        public string DatabaseName { get; private set; }

        [AutoResolve]
        public string CollectionName { get; private set; }

        public bool CreateIfNotExists { get; set; }

        [ConnectionString]
        public string ConnectionStringSetting { get; set; }

        [AutoResolve]
        public string Id { get; set; }

        [AutoResolve]
        public string PartitionKey { get; set; }

        public int CollectionThroughput { get; set; }

        [AutoResolve(ResolutionPolicyType = typeof(CosmosDBSqlResolutionPolicy))]
        public string SqlQuery { get; set; }

        public bool UseMultipleWriteLocations { get; set; }

        public bool UseDefaultJsonSerialization { get; set; }

        [AutoResolve]
        public string PreferredLocations { get; set; }

        internal SqlParameterCollection SqlQueryParameters { get; set; }
    }
}

从这段代码中可以看出,WebJobs.Extensions.CosmosDB不想在源代码中对这两个值进行任何处理,它甚至不能使用set方法。其他值设置为相应环境变量的值。set accessor已设置为不可访问,这是由设计的。

首先,确保正确设置配置。考虑到您的函数是通过zip文件编译和发布的,您可以尝试将
SCM\u DO\u BUILD\u DURING\u DEPLOYMENT=true
设置为配置,请参阅您可以上载错误消息,以便人们可以更好地帮助您。DatabaseName和CollectionName的设置访问器已被设计器设置为不可访问。源代码没有做任何事情,这就是为什么您无法从配置中获取设置。这是由DorisLv设计的,这有助于突出显示,它在另一个上下文中出现;然而,要明确的是,除了这两个字段之外,其他所有字段对我来说都正常工作。所以这不是这里的特别问题。另一个答案/评论似乎强调,我试图做的是设计不可能做到的。我不确定为什么设计会将其设置为不可访问,因为它确实迫使我保留一些硬编码的东西,感觉我应该能够在代码之外配置它,因为我可能希望保留不同的数据库和集合不同部署上下文中的名称。然而,这有助于了解和清楚地看到,由于这些是无法访问的,似乎没有任何合理的方式来实现我的目标,这将是值得追求的。。。我现在能想到的。