Použití injektáže závislostí ve službě Azure Functions pro .NET

Azure Functions podporuje vzor návrhu pro vkládání závislostí (DI), což je technika pro dosažení inverze řízení (IOC) mezi třídami a jejich závislostmi.

  • Vkládání závislostí v Azure Functions je postavené na funkcích injektáže .NET Core Dependency vstřik. Doporučuje se používat vkládání závislostí .NET Core . Existují rozdíly v tom, jak potlačíte závislosti a jak jsou čteny konfigurační hodnoty pomocí Azure Functions v plánu spotřeby.

  • Podpora vkládání závislostí začíná Azure Functions 2. x.

  • Vzory vkládání závislostí se liší v závislosti na tom, zda jsou funkce jazyka C# spouštěny v procesu nebo mimo proces.

Důležité

Pokyny v tomto článku se vztahují pouze na funkce knihovny tříd C#, které se spouštějí v procesu s modulem runtime. Tento model injektáže vlastní závislosti neplatí pro izolované funkce .NET, které vám umožní spustit funkce .NET 5,0 mimo proces. model izolovaného procesu .net spoléhá na regulární vzory vkládání závislostí ASP.NET Core. Další informace najdete v tématu vkládání závislostí v průvodci izolovaným procesem .NET.

Požadavky

než budete moci použít vkládání závislostí, je nutné nainstalovat následující balíčky NuGet:

Registrovat služby

Chcete-li registrovat služby, vytvořte metodu pro konfiguraci a přidání součástí do IFunctionsHostBuilder instance. Hostitel Azure Functions vytvoří instanci IFunctionsHostBuilder a předá ji přímo do vaší metody.

Chcete-li zaregistrovat metodu, přidejte FunctionsStartup atribut Assembly, který určuje název typu použitý při spuštění.

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

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

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

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

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

V tomto příkladu se používá balíček Microsoft. Extensions. http vyžadovaný k registraci HttpClient při spuštění.

Upozornění

Série kroků registrace se spouští před a po zpracování spouštěcí třídy. Proto Pamatujte na následující položky:

  • Spouštěcí třída je určena pouze pro instalaci a registraci. Vyhněte se používání služeb zaregistrovaných při spuštění během procesu spuštění. Nesnažte se třeba protokolovat zprávu do protokolovacího nástroje, který se registruje při spuštění. Tento bod procesu registrace je příliš brzy, aby byly vaše služby k dispozici pro použití. Po Configure spuštění metody bude modul runtime funkcí nadále registrovat další závislosti, což může ovlivnit fungování služeb.

  • Kontejner pro vkládání závislostí obsahuje pouze explicitně registrované typy. Jediné služby, které jsou k dispozici jako vložené typy, jsou to, co je nastaveno v Configure metodě. V důsledku toho typy specifické pro funkce, jako BindingContext a ExecutionContext nejsou k dispozici během instalace nebo jako vložené typy.

Použít vložené závislosti

K dispozici jsou závislosti pomocí injektáže konstruktoru ve funkci. Použití injektáže konstruktoru vyžaduje, abyste pro vložené služby nebo třídy funkcí nepoužívali statické třídy.

Následující příklad ukazuje, jak IMyService jsou tyto HttpClient závislosti vloženy do funkce aktivované protokolem HTTP.

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

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

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

        [FunctionName("MyHttpTrigger")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var response = await _client.GetAsync("https://microsoft.com");
            var message = _service.GetMessage();

            return new OkObjectResult("Response from function with injected dependencies.");
        }
    }
}

V tomto příkladu se používá balíček Microsoft. Extensions. http vyžadovaný k registraci HttpClient při spuštění.

Životnost služeb

Azure Functions aplikace poskytují stejné životnosti služby jako ASP.NET vkládání závislostí. U aplikace Functions se chovají různé životnosti služby následujícím způsobem:

  • Přechodný: přechodné služby se vytvářejí při každém vyřešení služby.
  • Vymezené: rozsah platnosti služby odpovídá době trvání spuštění funkce. Vymezené služby se vytvoří jednou za spuštění funkce. Pozdější požadavky na tuto službu během opakovaného použití existující instance služby.
  • Singleton: životnost služby typu Singleton odpovídá době životnosti hostitele a je znovu používána napříč prováděním funkce v dané instanci. Pro připojení a klienty jsou doporučovány služby životnosti singleton, DocumentClient například HttpClient instance.

Zobrazit nebo stáhnout ukázku různých životností služby na GitHub.

Služby protokolování

pokud potřebujete vlastního poskytovatele protokolování, zaregistrujte vlastní typ jako instanci ILoggerProvider , která je k dispozici prostřednictvím balíčku Microsoft. extensions. logging. abstractions NuGet package.

Application Insights automaticky přidá Azure Functions.

Upozornění

  • Nepřidávat AddApplicationInsightsTelemetry() do kolekce služeb, které registrují služby, které jsou v konfliktu se službami poskytovanými prostředím.
  • neregistrujte svoji vlastní TelemetryConfiguration nebo TelemetryClient pokud používáte integrovanou funkci Application Insights. Pokud potřebujete nakonfigurovat vlastní TelemetryClient instanci, vytvořte ji pomocí vloženého kódu, jak je TelemetryConfiguration znázorněno v části vlastní telemetrie protokolu ve funkcích jazyka C#.

ILogger <T> a ILoggerFactory

Hostitel vloží ILogger<T> a ILoggerFactory služby do konstruktorů. Ve výchozím nastavení se ale tyto nové filtry protokolování odfiltrují z protokolů funkcí. Abyste se mohli host.json přihlásit k dalším filtrům a kategoriím, musíte upravit soubor.

Následující příklad ukazuje, jak přidat ILogger<HttpTrigger> s protokoly, které jsou vystaveny hostiteli.

namespace MyNamespace
{
    public class HttpTrigger
    {
        private readonly ILogger<HttpTrigger> _log;

        public HttpTrigger(ILogger<HttpTrigger> log)
        {
            _log = log;
        }

        [FunctionName("HttpTrigger")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req)
        {
            _log.LogInformation("C# HTTP trigger function processed a request.");

            // ...
    }
}

Následující příklad host.json souboru Přidá filtr protokolu.

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            }
        },
        "logLevel": {
            "MyNamespace.HttpTrigger": "Information"
        }
    }
}

Další informace o úrovních protokolu najdete v tématu Configure log úrovně.

Poskytnuté služby Function App

Hostitel funkce registruje mnoho služeb. V rámci vaší aplikace je možné v aplikaci provést zabezpečení těchto služeb:

Typ služby Doba platnosti Popis
Microsoft.Extensions.Configuration.IConfiguration Singleton Konfigurace modulu runtime
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider Singleton Zodpovídá za poskytnutí ID instance hostitele.

Pokud existují další služby, na kterých chcete převzít závislost, vytvořte problém a navrhněte je na GitHub.

Přepsání hostitelských služeb

Přepsání služeb poskytovaných hostitelem není aktuálně podporováno. Pokud existují služby, které chcete přepsat, vytvořte problém a navrhněte je na GitHub.

Práce s možnostmi a nastaveními

Hodnoty definované v nastavení aplikace jsou k dispozici v IConfiguration instanci, která umožňuje číst hodnoty nastavení aplikace ve třídě Startup.

Hodnoty z instance můžete extrahovat IConfiguration do vlastního typu. Kopírování hodnot nastavení aplikace do vlastního typu usnadňuje testování služeb tím, že se tyto hodnoty vloží. Nastavení čtení do instance konfigurace musí být jednoduché páry klíč-hodnota.

Vezměte v úvahu následující třídu, která obsahuje vlastnost s názvem konzistentní s nastavením aplikace:

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

A local.settings.json soubor, který může strukturovat vlastní nastavení, je následující:

{
  "IsEncrypted": false,
  "Values": {
    "MyOptions:MyCustomSetting": "Foobar"
  }
}

V rámci Startup.Configure metody můžete extrahovat hodnoty z IConfiguration instance do vlastního typu pomocí následujícího kódu:

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

Volání Bind kopíruje hodnoty, které mají odpovídající názvy vlastností z konfigurace do vlastní instance. Instance Options je teď k dispozici v kontejneru IoC pro vkládání do funkce.

Objekt Options je vložen do funkce jako instance obecného IOptions rozhraní. ValuePro přístup k hodnotám nalezeným ve vaší konfiguraci použijte vlastnost.

using System;
using Microsoft.Extensions.Options;

public class HttpTrigger
{
    private readonly MyOptions _settings;

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

další podrobnosti týkající se práce s možnostmi najdete v tématu vzor možností v ASP.NET Core .

používání ASP.NET Core uživatelských tajných klíčů

při vývoji místně ASP.NET Core poskytuje nástroj správce tajných klíčů , který umožňuje ukládat tajné informace mimo kořenový adresář projektu. Díky tomu je méně pravděpodobný, že tajné klíče jsou omylem svěřeny správě zdrojového kódu. Azure Functions Core Tools (verze 3.0.3233 nebo novější) automaticky přečtou tajné klíče vytvořené správcem ASP.NET Core tajných klíčů.

Chcete-li nakonfigurovat projekt Azure Functions .NET pro použití uživatelských tajných kódů, spusťte následující příkaz v kořenovém adresáři projektu.

dotnet user-secrets init

Pak použijte dotnet user-secrets set příkaz k vytvoření nebo aktualizaci tajných kódů.

dotnet user-secrets set MySecret "my secret value"

Chcete-li získat přístup k hodnotám tajných kódů uživatele v kódu aplikace Function App, použijte IConfiguration nebo IOptions .

Přizpůsobení zdrojů konfigurace

Poznámka

Přizpůsobení zdroje konfigurace je k dispozici počínaje verzí Azure Functions hostitele 2.0.14192.0 a 3.0.14191.0.

Chcete-li určit další zdroje konfigurace, přepište ConfigureAppConfiguration metodu ve třídě aplikace Function App StartUp .

Následující ukázka přidá konfigurační hodnoty ze základní a volitelné soubory nastavení aplikace specifické pro konkrétní prostředí.

using System.IO;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

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

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            FunctionsHostBuilderContext context = builder.GetContext();

            builder.ConfigurationBuilder
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false)
                .AddEnvironmentVariables();
        }
    }
}

Přidejte zprostředkovatele konfigurace ConfigurationBuilder do vlastnosti IFunctionsConfigurationBuilder . Další informace o používání zprostředkovatelů konfigurace najdete v tématu Konfigurace v ASP.NET Core.

Je FunctionsHostBuilderContext získán z IFunctionsConfigurationBuilder.GetContext() . Pomocí tohoto kontextu můžete načíst aktuální název prostředí a přeložit umístění konfiguračních souborů ve složce aplikace funkcí.

Ve výchozím nastavení se konfigurační soubory, jako je appsettings.json, automaticky nekopírují do výstupní složky aplikace funkcí. Aktualizujte soubor .csproj tak, aby odpovídal následující ukázce, aby se zajistilo, že se soubory zkopírují.

<None Update="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>      
</None>
<None Update="appsettings.Development.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>

Důležité

U aplikací funkcí spuštěných v plánech Consumption nebo Premium kapacity úpravy hodnot konfigurace používaných v aktivačních událostech mohou způsobit chyby škálování. Jakékoli změny těchto vlastností FunctionsStartup třídou mají za výsledek chybu při spuštění aplikace funkcí.

Další kroky

Další informace naleznete v následujících zdrojích: