Исходная проблема:
У меня есть документ POCO, который я хотел бы использовать с расширением привязки CosmosDbOutput (последняя версия, v4).
Я предпочитаю использовать имена свойств POCO в PascaLCase, а документы Cosmos/Json — в CamelCase соответственно. Однако я не могу найти правильный способ изменить параметры сериализации, чтобы это заработало.
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;
namespace FunctionCrudSample;
// Function
[Function(nameof(CreatePascalCase))]
public async Task CreatePascalCase(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req,
[FromBody] MyDocumentPascalCase myDocument,
FunctionContext executionContext
)
{
var logger = executionContext.GetLogger(nameof(Api));
logger.LogInformation("C# HTTP trigger function processed a request.");
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(myDocument);
return new() { Response = response, Document = myDocument };
}
// Multi-Return type
public class CreateResponsePascalCase
{
[HttpResult]
public required HttpResponseData Response { get; set; }
[CosmosDBOutput(cosmosDbName, cosmosContainerName, Connection = connectionString, CreateIfNotExists = true, PartitionKey = "/id")]
public MyDocumentPascalCase? Document { get; set; }
}
// POCO
public class MyDocumentPascalCase
{
public string? Id { get; set; }
public string? Message { get; set; }
}
Что я пробовал
1. Измените POCO, чтобы использовать имена свойств в верблюжьем регистре
Это работает, но опять же. Я бы предпочел использовать PascalCase. Не говоря уже о том, что использование имен свойств в нижнем регистре нарушает стиль кода IDE1006.
public class MyDocumentCamelCase
{
public string? id { get; set; }
public string? message { get; set; }
}
2. Настройка IOptions и ConfigureCosmosDBExtensionOptions()
Я не обнаружил успеха ни с одним, ни с обоими этими параметрами конфигурации в Program.cs
Не говоря уже о том, что они недокументированы. Я провел несколько часов в репозитории рабочей среды dotnet.
Исходная проблема: У меня есть документ POCO, который я хотел бы использовать с расширением привязки CosmosDbOutput (последняя версия, v4). Я предпочитаю использовать имена свойств POCO в PascaLCase, а документы Cosmos/Json — в CamelCase соответственно. Однако я не могу найти правильный способ изменить параметры сериализации, чтобы это заработало. [code]using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; using System.Net; using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;
namespace FunctionCrudSample;
// Function [Function(nameof(CreatePascalCase))] public async Task CreatePascalCase( [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, [FromBody] MyDocumentPascalCase myDocument, FunctionContext executionContext ) { var logger = executionContext.GetLogger(nameof(Api)); logger.LogInformation("C# HTTP trigger function processed a request."); var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync(myDocument); return new() { Response = response, Document = myDocument }; }
// Multi-Return type public class CreateResponsePascalCase { [HttpResult] public required HttpResponseData Response { get; set; }
// POCO public class MyDocumentPascalCase { public string? Id { get; set; } public string? Message { get; set; } } [/code] Что я пробовал 1. Измените POCO, чтобы использовать имена свойств в верблюжьем регистре Это работает, но опять же. Я бы предпочел использовать PascalCase. Не говоря уже о том, что использование имен свойств в нижнем регистре нарушает стиль кода IDE1006. [code]public class MyDocumentCamelCase { public string? id { get; set; } public string? message { get; set; } } [/code] 2. Настройка IOptions и ConfigureCosmosDBExtensionOptions() Я не обнаружил успеха ни с одним, ни с обоими этими параметрами конфигурации в Program.cs Не говоря уже о том, что они недокументированы. Я провел несколько часов в репозитории рабочей среды dotnet. [code]using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options;
var host = new HostBuilder().ConfigureFunctionsWorkerDefaults(options => { options.Services.AddOptions().Configure((cosmos, worker) => { cosmos.ClientOptions.SerializerOptions.PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase; });