.NET 5 다중 출력 바인딩의 Azure Functions

3914 단어 azureserverless
새로운 Azure Functions 격리 프로세스 모델은 익숙한 것과 약간 다릅니다. 새 모델에 익숙하지 않은 경우 먼저 다음 내용을 읽어야 합니다.



새로운 격리 모델에서 간단한 http 함수에 대한 출력 바인딩은 이전 클래스 라이브러리 모델과 유사하며 메서드의 반환 값은 http 응답입니다. 추가 출력 바인딩이 필요한 경우 상황이 많이 변경되었습니다! 더 이상 함수의 인수(예: IAsyncCollector)에 바인딩 특성을 지정할 수 없습니다. 새 모델에서 함수에 대해 여러 출력 바인딩을 사용하려는 경우 함수 메서드의 반환 값을 통해서도 수행됩니다.

모든 출력 바인딩 반환



그러나 이것은 어떻게 작동합니까? 아이디어는 매우 간단합니다. 모든 출력 값에 대한 속성이 있는 클래스를 만들고 출력 바인딩 특성으로 장식합니다. 다음은 공식Samples에서 빌린 예입니다.

    public static class MultiOutput
    {
        [Function("MultiOutput")]
        public static MyOutputType Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req,
            FunctionContext context)
        {
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.WriteString("Success!");

            string myQueueOutput = "some output";

            return new MyOutputType()
            {
                Name = myQueueOutput,
                HttpResponse = response
            };
        }
    }

    public class MyOutputType
    {
        [QueueOutput("myQueue")]
        public string Name { get; set; }

        public HttpResponseData HttpResponse { get; set; }
    }


source

시끄러운



보시다시피 MultiOutput 함수는 MyOutputType 유형을 반환하고 Name 속성은 QueueOutputAttribute로 데코레이트됩니다. 이것이 작동하고 나에게 분명했지만 이 설정이 약간 시끄럽다는 느낌을 지울 수 없었습니다. 그 때문에 더 깨끗한 솔루션을 만들 수 있는지 확인하기 위해 C#의 새로운 기능 중 일부를 가지고 놀기 시작했습니다. 첫 번째 생각은 튜플을 반환 값으로 사용하는 것이었지만 이것은 현재 실행 가능한 솔루션이 아니며 속성이 있는 결과 정의도 이상하게 만들 것입니다.

다음 생각은 RECORDS였습니다. 예, 불변성이라는 성배에 도달하는 데 도움이 되는 새로운 레코드 유형입니다. 기존의 좋은 클래스 대신 레코드를 만드는 것은 멋진 장점이 많지만 이 문제가 사라지지는 않습니다. 레코드 정의를 더 작게 만들기 위해 위치 레코드를 사용할 수 있습니다. 즉, 한 줄의 코드에서 속성, 지원 필드 및 모든 값을 예상하는 생성자로 변경 불가능한 클래스를 정의합니다. 대상 유형이 지정된 새 표현식과 함께 트릭을 수행할 것입니다. 맞습니까? 내 다음 문제가 나타납니다. 속성에 속성을 넣는 방법은 무엇입니까? 몇 가지 Bingle 마법을 사용한 후 답변이 있는 language spec에서 속성 이름 앞에 property:를 붙일 수 있으며 속성에 속성을 생성합니다.

최종 결과



내 개념 증명은 다음과 같습니다.

    public class MultiOutputFunction
    {
        public record MultiOutputResult(HttpResponseData Response, [property: BlobOutput("multioutput/example.txt")] string BlobContent);

        [Function(nameof(MultiOutput))]
        public async Task<MultiOutputResult> MultiOutput([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "MultiOutput")] HttpRequestData req)
        {
            var response = req.CreateResponse();
            response.WriteString("Hello world");

            return new(response, DateTime.UtcNow.ToString());
        }
    }


source

Please be aware this is just little old me playing around with some code, it could be that the Azure Functions Team is thinking about different directions and might not recommend this approach.



oscarvantol.nl

좋은 웹페이지 즐겨찾기