.NET Azure Functions에서 종속성 주입 사용Use dependency injection in .NET Azure Functions

Azure Functions는 클래스와 해당 종속성 간의 IoC (제어 반전) 를 구현 하는 기술인 DI (종속성 주입) 소프트웨어 디자인 패턴을 지원 합니다.Azure Functions supports the dependency injection (DI) software design pattern, which is a technique to achieve Inversion of Control (IoC) between classes and their dependencies.

  • Azure Functions의 종속성 주입은 .NET Core 종속성 주입 기능을 기반으로 합니다.Dependency injection in Azure Functions is built on the .NET Core Dependency Injection features. .Net Core 종속성 주입 에 대해 잘 알고 있는 것이 좋습니다.Familiarity with the .NET Core dependency injection is recommended. 그러나 소비 계획의 Azure Functions에서 종속성을 재정의 하는 방법과 구성 값을 읽는 방법에는 차이가 있습니다.There are differences, however, in how you override dependencies and how configuration values are read with Azure Functions on the Consumption plan.

  • 종속성 주입에 대 한 지원은 Azure Functions 2.x로 시작 합니다.Support for dependency injection begins with Azure Functions 2.x.

사전 요구 사항Prerequisites

종속성 주입을 사용 하려면 먼저 다음 NuGet 패키지를 설치 해야 합니다.Before you can use dependency injection, you must install the following NuGet packages:

서비스 등록Register services

서비스를 등록 하려면 IFunctionsHostBuilder 인스턴스에 구성 요소를 구성 하 고 추가 하는 메서드를 만듭니다.To register services, create a method to configure and add components to an IFunctionsHostBuilder instance. Azure Functions 호스트는 IFunctionsHostBuilder의 인스턴스를 만들고 메서드에 직접 전달 합니다.The Azure Functions host creates an instance of IFunctionsHostBuilder and passes it directly into your method.

메서드를 등록 하려면 시작 하는 동안 사용 되는 형식 이름을 지정 하는 FunctionsStartup assembly 특성을 추가 합니다.To register the method, add the FunctionsStartup assembly attribute that specifies the type name used during startup.

using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Logging;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();

            builder.Services.AddSingleton((s) => {
                return new MyService();
            });

            builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
        }
    }
}

주의 사항Caveats

런타임이 시작 클래스를 처리 하기 전후에 일련의 등록 단계가 실행 됩니다.A series of registration steps run before and after the runtime processes the startup class. 따라서는 다음 항목을 염두에 두어야 합니다.Therefore, the keep in mind the following items:

  • Startup 클래스는 설치 및 등록을 위해서만 사용할 수 있습니다.The startup class is meant for only setup and registration. 시작 시 등록 된 서비스를 시작 프로세스 중에 사용 하지 마십시오.Avoid using services registered at startup during the startup process. 예를 들어 시작 하는 동안 등록 되는로 거에 메시지를 기록 하지 않습니다.For instance, don't try to log a message in a logger that is being registered during startup. 등록 프로세스의이 시점에서 서비스를 사용할 수 있는 것은 너무 이릅니다.This point of the registration process is too early for your services to be available for use. @No__t-0 메서드를 실행 한 후에는 함수 런타임이 추가 종속성을 계속 등록 하 여 서비스가 작동 하는 방식에 영향을 줄 수 있습니다.After the Configure method is run, the Functions runtime continues to register additional dependencies, which can affect how your services operate.

  • 종속성 주입 컨테이너는 명시적으로 등록 된 유형만 보유합니다.The dependency injection container only holds explicitly registered types. Injectable 형식으로 사용할 수 있는 유일한 서비스는 Configure 메서드에서 설정 하는 것입니다.The only services available as injectable types are what are setup in the Configure method. 따라서 BindingContextExecutionContext과 같은 함수 관련 형식은 설치 중 또는 injectable 형식으로 사용할 수 없습니다.As a result, Functions-specific types like BindingContext and ExecutionContext aren't available during setup or as injectable types.

삽입 된 종속성 사용Use injected dependencies

생성자 삽입은 함수에서 종속성을 사용할 수 있도록 하는 데 사용 됩니다.Constructor injection is used to make your dependencies available in a function. 생성자 주입을 사용 하려면 정적 클래스를 사용 하지 않아야 합니다.The use of constructor injection requires that you do not use static classes.

다음 샘플에서는 IMyServiceHttpClient 종속성이 HTTP 트리거 함수에 삽입 되는 방법을 보여 줍니다.The following sample demonstrates how the IMyService and HttpClient dependencies are injected into an HTTP-triggered function. 이 예제에서는 시작 시 HttpClient을 등록 하는 데 필요한 Microsoft Extensions. Http 패키지를 사용 합니다.This example uses the Microsoft.Extensions.Http package required to register an HttpClient at startup.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace MyNamespace
{
    public class HttpTrigger
    {
        private readonly IMyService _service;
        private readonly HttpClient _client;

        public HttpTrigger(IMyService service, IHttpClientFactory httpClientFactory)
        {
            _service = service;
            _client = httpClientFactory.CreateClient();
        }

        [FunctionName("GetPosts")]
        public async Task<IActionResult> Get(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "posts")] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            var res = await _client.GetAsync("https://microsoft.com");
            await _service.AddResponse(res);

            return new OkResult();
        }
    }
}

서비스 수명Service lifetimes

Azure Functions 앱은 ASP.NET 종속성 주입과 동일한 서비스 수명을 제공 합니다.Azure Functions apps provide the same service lifetimes as ASP.NET Dependency Injection. 함수 앱의 경우 서로 다른 서비스 수명이 다음과 같이 동작 합니다.For a Functions app, the different service lifetimes behave as follows:

  • 임시: 임시 서비스는 서비스의 각 요청에 대해 만들어집니다.Transient: Transient services are created upon each request of the service.
  • 범위지정: 범위가 지정 된 서비스 수명은 함수 실행 수명과 일치 합니다.Scoped: The scoped service lifetime matches a function execution lifetime. 범위가 지정 된 서비스는 실행 당 한 번 생성 됩니다.Scoped services are created once per execution. 실행 중에 해당 서비스에 대 한 이후 요청은 기존 서비스 인스턴스를 다시 사용 합니다.Later requests for that service during the execution reuse the existing service instance.
  • Singleton: Singleton 서비스 수명은 호스트 수명과 일치 하며 해당 인스턴스에서 함수 실행을 통해 다시 사용 됩니다.Singleton: The singleton service lifetime matches the host lifetime and is reused across function executions on that instance. 연결 및 클라이언트에는 단일 수명 수명 서비스 (예: SqlConnection 또는 HttpClient 인스턴스)를 권장 합니다.Singleton lifetime services are recommended for connections and clients, for example SqlConnection or HttpClient instances.

GitHub의 다른 서비스 수명 샘플 을 보거나 다운로드 합니다.View or download a sample of different service lifetimes on GitHub.

로깅 서비스Logging services

사용자 고유의 로깅 공급자가 필요한 경우 사용자 지정 형식을 ILoggerProvider 인스턴스로 등록 합니다.If you need your own logging provider, register a custom type as an ILoggerProvider instance. Application Insights는 Azure Functions 자동으로 추가 됩니다.Application Insights is added by Azure Functions automatically.

경고

  • 환경에서 제공 하는 서비스와 충돌 하는 서비스를 등록 하므로 서비스 컬렉션에 AddApplicationInsightsTelemetry()을 추가 하지 마세요.Do not add AddApplicationInsightsTelemetry() to the services collection as it registers services that conflict with services provided by the environment.
  • 기본 제공 Application Insights 기능을 사용 하는 경우 고유한 TelemetryConfiguration 또는 TelemetryClient을 등록 하지 마십시오.Do not register your own TelemetryConfiguration or TelemetryClient if you are using the built-in Application Insights functionality.

함수 앱 제공 서비스Function app provided services

함수 호스트는 많은 서비스를 등록 합니다.The function host registers many services. 다음 서비스는 응용 프로그램에서 종속성으로 사용 하기에 안전 합니다.The following services are safe to take as a dependency in your application:

서비스 종류Service Type 수명Lifetime 설명Description
Microsoft.Extensions.Configuration.IConfiguration 단일Singleton 런타임 구성Runtime configuration
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider 단일Singleton 호스트 인스턴스의 ID를 제공 해야 합니다.Responsible for providing the ID of the host instance

종속성을 적용 하려는 다른 서비스가 있는 경우 문제를 만들어 GitHub에서 제안합니다.If there are other services you want to take a dependency on, create an issue and propose them on GitHub.

호스트 서비스 재정의Overriding host services

호스트에서 제공 하는 서비스 재정의는 현재 지원 되지 않습니다.Overriding services provided by the host is currently not supported. 재정의 하려는 서비스가 있는 경우 문제를 만들어 GitHub에서 제안합니다.If there are services you want to override, create an issue and propose them on GitHub.

옵션 및 설정 작업Working with options and settings

앱 설정 에 정의 된 값은 @no__t 1 인스턴스에서 사용할 수 있으며,이 경우 시작 클래스에서 앱 설정 값을 읽을 수 있습니다.Values defined in app settings are available in an IConfiguration instance, which allows you to read app settings values in the startup class.

@No__t-0 인스턴스에서 사용자 지정 형식으로 값을 추출할 수 있습니다.You can extract values from the IConfiguration instance into a custom type. 앱 설정 값을 사용자 지정 형식으로 복사 하면 이러한 값을 injectable 하 여 서비스를 쉽게 테스트할 수 있습니다.Copying the app settings values to a custom type makes it easy test your services by making these values injectable. 구성 인스턴스로 읽은 설정은 단순 키/값 쌍 이어야 합니다.Settings read into the configuration instance must be simple key/value pairs.

앱 설정과 일치 하는 라는 속성을 포함 하는 다음 클래스를 살펴보겠습니다.Consider the following class that includes a property named consistent with an app setting.

public class MyOptions
{
    public string MyCustomSetting { get; set; }
}

@No__t-0 메서드 내에서 다음 코드를 사용 하 여 @no__t 1 인스턴스에서 사용자 지정 형식으로 값을 추출할 수 있습니다.From inside the Startup.Configure method, you can extract values from the IConfiguration instance into your custom type using the following code:

builder.Services.AddOptions<MyOptions>()
                .Configure<IConfiguration>((settings, configuration) =>
                                           {
                                                configuration.Bind(settings);
                                           });

@No__t-0을 호출 하면 구성에서 속성 이름이 일치 하는 값이 사용자 지정 인스턴스로 복사 됩니다.Calling Bind copies values that have matching property names from the configuration into the custom instance. 이제 옵션 인스턴스를 IoC 컨테이너에서 함수에 삽입할 수 있습니다.The options instance is now available in the IoC container to inject into a function.

Options 개체는 제네릭 IOptions 인터페이스의 인스턴스로 함수에 삽입 됩니다.The options object is injected into the function as an instance of the generic IOptions interface. @No__t-0 속성을 사용 하 여 구성에 있는 값에 액세스할 수 있습니다.Use the Value property to access the values found in your configuration.

using System;
using Microsoft.Extensions.Options;

public class HttpTrigger
{
    private readonly MyOptions _settings;

    public HttpTrigger(IOptions<MyOptions> options)
    {
        _service = service;
        _settings = options.Value;
    }
}

옵션 사용에 대 한 자세한 내용은 ASP.NET Core의 옵션 패턴 을 참조 하세요.Refer to Options pattern in ASP.NET Core for more details regarding working with options.

경고

로컬. settings 또는 appsettings와 같은 파일에서 값을 읽으려고 시도 하지 마십시오 . { 환경}.Avoid attempting to read values from files like local.settings.json or appsettings.{environment}.json on the Consumption plan. 트리거 연결과 관련 된 이러한 파일에서 읽은 값은 호스팅 인프라가 구성 정보에 액세스할 수 없기 때문에 앱이 확장 될 때 사용할 수 없습니다.Values read from these files related to trigger connections aren't available as the app scales because the hosting infrastructure has no access to the configuration information.

다음 단계Next steps

자세한 내용은 다음 리소스를 참조하십시오.For more information, see the following resources: