Azure Functions에 대한 CosmosDB 바인딩의 직렬화 제어

콘텐츠를 준비하는 동안 CosmosDB의 데이터가 처리되는 방식에 문제가 발생했습니다. 내가 사용하고 있던 샘플 데이터 세트는 correctAnswerincorrectAnswer 와 같은 필드 이름에 대해 낙타 대소문자를 사용하는 반면 F# 레코드 유형의 대소문자는 파스칼 대소문자( CorrectAnswerIncorrectAnswer )였습니다. 이것은 데이터의 직렬화/역직렬화에 문제를 일으켰습니다.

input and output bindings for CosmosDB을 사용하고 있었기 때문에 데이터의 직렬화/역직렬화를 제어하지 않습니다. 그렇다면 이 문제를 해결하려면 어떻게 해야 합니까?

내부적으로 바인딩은 Newtonsoft.Json을 사용하고 여기에는 전역 구성을 설정할 수 있는 싱글톤이 있지만 문제가 있습니다. Functions 프로젝트에서 이를 어디에서 수행합니까? 우리는 함수의 시작을 제어하지 않습니다. 그렇다면 구성을 어떻게 설정합니까?

파기 후에 Microsoft.Azure.Functions.Extensions 클래스를 제공하는 FunctionsStartup NuGet package ( source )을 발견했습니다. 이제 이것은 유망해 보입니다.

이 클래스는 함수를 초기화할 때 실행될 메서드public abstract void Configure(IFunctionsHostBuilder builder)를 제공합니다. 이 클래스의 용도 중 하나는 IFunctionsHostBuilder 에 서비스를 추가하여 종속성 주입을 수행하는 것입니다. 그러나 우리의 경우에는 그렇게 할 필요가 없습니다. 대신 메서드를 사용하여 JSON 직렬화를 위한 자체 구성을 설정할 수 있습니다./역직렬화.

다음은 F# 구현입니다.

module Startup

open Microsoft.Azure.Functions.Extensions.DependencyInjection
open Newtonsoft.Json
open Newtonsoft.Json.Serialization
open Newtonsoft.Json.Converters

type Startup() =
    inherit FunctionsStartup()

    override _.Configure(_: IFunctionsHostBuilder) : unit =
        let settings = JsonSerializerSettings()
        settings.ContractResolver <- CamelCasePropertyNamesContractResolver()

        DiscriminatedUnionConverter() |> settings.Converters.Add
        StringEnumConverter() |> settings.Converters.Add

        JsonConvert.DefaultSettings <- (fun _ -> settings)

[<assembly: FunctionsStartup(typeof<Startup>)>]
do ()

Configure 메서드에서 JsonSerializerSessions 의 새 인스턴스를 만들고 기본 계약 확인자를 CamelCasePropertyNamesContractResolver로 설정한 다음 이것을 다음으로 설정하기 전에 몇 가지 추가 변환기를 추가합니다(F# 유형을 더 잘 사용하기 위해). 기본 설정.

함수 호스트가 이 클래스를 인식하도록 하려면 어셈블리 수준 특성FunctionsStartup(typeof 참조 포함)을 추가해야 하며 이제 CosmosDB에 대한 입력 및 출력 바인딩이 작동하는 방식을 제어합니다.

다음에 Azure Functions에 전역 구성을 적용하려고 할 때 이 정보가 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기