Azure Functions 및 .NET 5: 종속성 주입

Azure Functions에 대한 .NET 5 지원이 this blog article에서 GA로 발표되었습니다!

Guide for running functions on .NET 5.0 in AzureDevelop and publish .NET 5 functions using Azure Functions에서 개발자 가이드를 찾을 수 있습니다.

오늘은 .NET 5를 사용할 때 이 "격리된 프로세스"에서 DI(Dependency Injection)를 사용하는 방법을 공유하고자 합니다.

Reference: Start-up and configuration

프로젝트 만들기



먼저 먼저! 새 템플릿을 사용하여 함수 프로젝트를 만들어야 합니다.

1. Azure Function Core 도구 v3의 최신 버전을 설치합니다. 자세한 내용은 here을 참조하십시오.

2. 도구를 설치한 후 버전을 확인하십시오. 3.0.3381보다 높아야 합니다.

func --version


3. 새 폴더를 생성하고 기능을 초기화합니다.

mkdir dotnet5func
cd dotnet5func
func init


4. 이제 새로운 옵션을 사용할 수 있습니다. "dotnet(격리된 프로세스)"을 선택합니다.



5. 그런 다음 새 기능 프로젝트를 만듭니다. 원하는 대로 트리거를 선택합니다. 이번에는 HttpTrigger를 선택했습니다.

func new




6. 완료할 함수 이름을 입력한 다음 함수를 실행하고 예상대로 작동하는지 확인합니다.

func start


7. 함수를 중지하고 Visual Studio Code 또는 Visual Studio를 사용하여 프로젝트를 엽니다.

code .


종속성 주입 구성



DI를 사용할 때 알아야 할 가장 중요한 것은 Startup.cs가 필요 없다는 것입니다!! 이제 Program.cs에서 코드를 직접 변경하여 DI를 구성할 수 있습니다.

1.\Program.cs는 프로젝트를 스캐폴드할 때 아래와 같아야 합니다.

using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Azure.Functions.Worker.Configuration;

namespace dotnet5func
{
    public class Program
    {
        public static void Main()
        {
            var host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .Build();

            host.Run();
        }
    }
}


2.\DI를 사용하려면 HostBuilder를 수정하기만 하면 됩니다. HttpClient 팩터리를 추가해 보겠습니다. ConfigureServices 메서드를 사용하고 ASP.NET 프로젝트와 정확히 동일한 AddHttpClient()를 사용할 수 있습니다.

using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace dotnet5func
{
    public class Program
    {
        public static void Main()
        {
            var host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .ConfigureServices(s => {
                    s.AddHttpClient();
                })
                .Build();

            host.Run();
        }
    }
}


3. 함수 코드를 열고 DI를 통해 IHttpClientFactory를 수락합니다. 여러 곳을 변경해야 합니다.
  • 클래스를 인스턴스화할 수 있도록 정적 키워드를 제거합니다
  • .
  • 개인 IHttpClientFactory를 추가하고 생성자를 통해 수신합니다
  • .
  • Run 메서드의 서명을 변경하여 비동기식 호출이 되도록 함

  • 이번에는 swapi.dev를 사용합니다. swapi는 스타워즈를 좋아한다면 멋진 API입니다. 자세한 내용은 swapi.dev을 확인하십시오.

    using System.Collections.Generic;
    using System.Net;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Http;
    using Microsoft.Extensions.Logging;
    
    namespace dotnet5func
    {
        public class dotnet5func
        {
            private readonly IHttpClientFactory clientFactory;
    
            public dotnet5func(IHttpClientFactory clientFactory)
            {
                this.clientFactory = clientFactory;
            }
    
            [Function("dotnet5func")]
            public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req,
                FunctionContext executionContext)
            {
                var logger = executionContext.GetLogger("dotnet5func");
                logger.LogInformation("C# HTTP trigger function processed a request.");
    
                var client = clientFactory.CreateClient();
                var swapires = await client.GetStringAsync("https://swapi.dev/api/people/1/");
                var response = req.CreateResponse(HttpStatusCode.OK);
                response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    
                response.WriteString(swapires);
    
                return response;
            }
        }
    }
    


    4. 함수를 다시 실행하고 엔드포인트를 호출합니다.

    func start
    




    요약



    코드를 작성할 때 Azure Functions와 웹 API 사이에 여전히 약간의 차이가 있지만, 간극을 메우면 지식을 쉽고 효과적으로 재사용할 수 있습니다!

    내년 LTS인 .NET 6 릴리스를 기다릴 수 없습니다!

    좋은 웹페이지 즐겨찾기