我在F#中使用Azure函数开发了一个类似于事件存储的商店。在不同功能的应用程序部署中,在按预期工作的过程中遇到了一些挑战(我的链的不同部分本质上是通过HTTP和Cosmos DB触发器与不同功能进行工作和通信的)。
我已经完成了相当多的重构,以及逻辑与配置值的分离,但我似乎无法找到一种方法来完全依赖于一些我不喜欢硬代码的值的配置。
特别是在这里,CollectionName.和DatabaseName即使当我从配置中设置值时,它仍然要求我对这些值进行硬编码。
[<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我不使用任何其他类型的绑定json文件或其他任何东西。所有这些都是通过zip文件编译和发布的。
这不是紧急的,也不是关键的,但是如果没有解决的话,这对我来说仍然是一个恼人的方面,我想其他人可能已经遇到了这个问题,并对如何解决这个问题有了答案。
发布于 2020-08-31 09:22:21
这是源代码,您可以在这里看到设计人员的意图:
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访问器被设置为不可访问,这是通过设计实现的。
https://stackoverflow.com/questions/63642821
复制相似问题