我使用带有F#的Azure函数来处理各种事件存储。要使所有功能在不同的功能应用程序部署中都能按预期工作时会遇到一些挑战(我拥有链的不同部分,它们实际上在工作,并通过HTTP和Cosmos DB触发器与不同的功能进行通信)。
我已经进行了大量的重构,以及将逻辑与配置值分离,但是我似乎无法找到一种方法来仅依靠配置获得一些我不想硬编码的值
尤其是 DatabaseName 和 CollectionName 。即使从“配置”中设置了值,仍然需要我对值进行硬编码。
[<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文件编译和发布的。
这不是紧急或紧急的情况,但是如果不解决,这对我来说仍然是一个令人烦恼的方面,而且我认为其他人可能会遇到此问题,并对如何解决这个问题有答案。
答案 0 :(得分:1)
这是源代码,您可以在此处查看设计者的意图:
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方法。其他值设置为相应环境变量的值。设置的访问器被设置为不可访问,这是设计使然。