.NET Azure İşlevleri'nde bağımlılık eklemeyi kullanma

Azure İşlevleri, başarmak için kullanılan bir teknik olan bağımlılık ekleme (DI) yazılım tasarım desenini desteklerSınıflar ve bağımlılıkları arasında Denetimin Ters Çevrilmesi (IoC).

  • Azure İşlevleri'da bağımlılık ekleme. .NET Core Bağımlılık Ekleme özellikleri temel alır. .NET Core bağımlılık ekleme hakkında bilgi sahibi olunmanızı öneririz. Bağımlılıkları geçersiz kılma ve Tüketim planındaki Azure İşlevleri ile yapılandırma değerlerinin nasıl okunduğu konusunda farklılıklar vardır.

  • Bağımlılık ekleme desteği Azure İşlevleri 2.x ile başlar.

  • Bağımlılık ekleme desenleri, C# işlevlerinizin işlem içinde mi yoksa işlem dışı mı çalıştığına bağlı olarak farklılık gösterir.

Önemli

Bu makaledeki yönergeler yalnızca çalışma zamanıyla birlikte işlem halinde çalışan C# sınıf kitaplığı işlevleri için geçerlidir. Bu özel bağımlılık ekleme modeli, .NET işlevlerini işlem dışı çalıştırmanızı sağlayan .NET yalıtılmış işlevleri için geçerli değildir. .NET yalıtılmış çalışan işlem modeli, normal ASP.NET Core bağımlılık ekleme desenlerine dayanır. Daha fazla bilgi edinmek için .NET yalıtılmış çalışan işlemi kılavuzunda bağımlılık ekleme bölümüne bakın.

Önkoşullar

Bağımlılık eklemeyi kullanabilmeniz için önce aşağıdaki NuGet paketlerini yüklemeniz gerekir:

Hizmetleri kaydetme

Hizmetleri kaydetmek için, bir örneği yapılandırmak ve bir örneğe bileşen eklemek için bir IFunctionsHostBuilder yöntem oluşturun. Azure İşlevleri konağı örneği IFunctionsHostBuilder oluşturur ve doğrudan yönteminize geçirir.

Uyarı

Tüketim veya Premium planlarında çalışan işlev uygulamaları için, tetikleyicilerde kullanılan yapılandırma değerlerinde yapılan değişiklikler ölçeklendirme hatalarına neden olabilir. Sınıfı tarafından bu özelliklerde FunctionsStartup yapılan tüm değişiklikler bir işlev uygulaması başlatma hatasıyla sonuçlanır.

eklenmesi IConfiguration beklenmeyen davranışlara yol açabilir. Yapılandırma kaynakları ekleme hakkında daha fazla bilgi edinmek için bkz . Yapılandırma kaynaklarını özelleştirme.

yöntemini kaydetmek için, başlatma sırasında kullanılan tür adını belirten derleme özniteliğini ekleyin FunctionsStartup .

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>();
    }
}

Bu örnekte başlangıçta kaydetmek HttpClient için gereken Microsoft.Extensions.Http paketi kullanılır.

Uyarılar

Çalışma zamanı başlangıç sınıfını işlemeden önce ve sonra bir dizi kayıt adımı çalıştırılır. Bu nedenle, aşağıdaki öğeleri aklınızda bulundurun:

  • Başlangıç sınıfı yalnızca kurulum ve kayıt için kullanılır. Başlatma işlemi sırasında başlangıçta kayıtlı hizmetleri kullanmaktan kaçının. Örneğin, başlatma sırasında kaydedilen bir günlükçüde iletiyi günlüğe kaydetmeyi denemeyin. Kayıt işleminin bu noktası, hizmetlerinizin kullanılabilmesi için çok erken. Configure yöntemi çalıştırıldıktan sonra İşlevler çalışma zamanı, hizmetlerinizin çalışma şeklini etkileyebilecek diğer bağımlılıkları kaydetmeye devam eder.

  • Bağımlılık ekleme kapsayıcısı yalnızca açıkça kayıtlı türleri barındırır. Eklenebilir türler olarak kullanılabilen tek hizmetler, yönteminde Configure ayarlananlardır. Sonuç olarak, ve gibi BindingContextExecutionContext işlevlere özgü türler kurulum sırasında veya eklenebilir türler olarak kullanılamaz.

  • ASP.NET kimlik doğrulamasının yapılandırılması desteklenmez. İşlevler ana bilgisayarı, ASP.NET kimlik doğrulama hizmetlerini api'leri çekirdek yaşam döngüsü işlemleri için düzgün bir şekilde kullanıma sunacak şekilde yapılandırıyor. Özel Startup sınıftaki diğer yapılandırmalar bu yapılandırmayı geçersiz kılabilir ve istenmeyen sonuçlara neden olabilir. Örneğin, çağrı builder.Services.AddAuthentication() portal ve konak arasındaki kimlik doğrulamasını kesebilir ve Azure İşlevleri çalışma zamanı gibi iletilere ulaşılamaz.

Eklenen bağımlılıkları kullanma

Oluşturucu ekleme, bağımlılıklarınızı bir işlevde kullanılabilir hale getirmek için kullanılır. Oluşturucu ekleme kullanımı, eklenen hizmetler veya işlev sınıflarınız için statik sınıflar kullanmamanızı gerektirir.

Aşağıdaki örnekte ve HttpClient bağımlılıklarının HTTP ile tetiklenen bir işleve nasıl IMyService eklendiği gösterilmektedir.

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.");
    }
}

Bu örnekte başlangıçta kaydetmek HttpClient için gereken Microsoft.Extensions.Http paketi kullanılır.

Hizmet ömrü

Azure İşlevleri uygulamalar, ASP.NET Bağımlılık Ekleme ile aynı hizmet ömürlerini sağlar. İşlevler uygulaması için farklı hizmet ömrü aşağıdaki gibi davranır:

  • Geçici: Geçici hizmetler, hizmetin her çözümünde oluşturulur.
  • Kapsamlı: Kapsamı belirlenmiş hizmet ömrü, işlev yürütme ömrüyle eşleşir. Kapsamlı hizmetler, işlev yürütme başına bir kez oluşturulur. Yürütme sırasında bu hizmet için daha sonraki istekler mevcut hizmet örneğini yeniden kullanır.
  • Singleton: Tekil hizmet ömrü konak ömrüyle eşleşir ve bu örnekteki işlev yürütmeleri arasında yeniden kullanılır. Örneğin veya örnekler gibi DocumentClientHttpClient bağlantılar ve istemciler için tek kullanımlık hizmetler önerilir.

GitHub'da farklı hizmet ömürlerinin bir örneğini görüntüleyin veya indirin.

Günlük hizmetleri

Kendi günlük sağlayıcınıza ihtiyacınız varsa, özel bir türü Microsoft.Extensions.Logging.Abstractions NuGet paketi aracılığıyla kullanılabilen bir örneği ILoggerProviderolarak kaydedin.

Uygulama Analizler Azure İşlevleri tarafından otomatik olarak eklenir.

Uyarı

  • Ortam tarafından sağlanan hizmetlerle çakışan hizmetleri kaydeden hizmetler koleksiyonuna eklemeyin AddApplicationInsightsTelemetry() .
  • Kendi TelemetryConfiguration uygulamanızı kaydetmeyin veya TelemetryClient yerleşik Uygulama Analizler işlevselliğini kullanıyorsanız. Kendi TelemetryClient örneğinizi yapılandırmanız gerekiyorsa, C# işlevlerinde özel telemetriyi günlüğe kaydetme bölümünde gösterildiği gibi eklenen TelemetryConfiguration aracılığıyla bir tane oluşturun.

ILogger<T> ve ILoggerFactory

Konak oluşturuculara ILogger<T> ve ILoggerFactory hizmetleri ekler. Ancak, varsayılan olarak bu yeni günlük filtreleri işlev günlüklerinin dışında filtrelenir. Ek filtrelere ve kategorilere katılmayı kabul etmek için dosyayı değiştirmeniz host.json gerekir.

Aşağıdaki örnek, konağa sunulan günlükleri içeren bir ILogger<HttpTrigger> öğesinin nasıl ekleneceğini gösterir.

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.");

        // ...
}

Aşağıdaki örnek host.json dosya günlük filtresini ekler.

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

Günlük düzeyleri hakkında daha fazla bilgi için bkz . Günlük düzeylerini yapılandırma.

İşlev uygulaması tarafından sağlanan hizmetler

İşlev konağı birçok hizmeti kaydeder. Aşağıdaki hizmetlerin uygulamanızda bağımlılık olarak alınması güvenlidir:

Hizmet Türü Yaşam süresi Açıklama
Microsoft.Extensions.Configuration.IConfiguration Tekil Çalışma zamanı yapılandırması
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider Tekil Konak örneğinin kimliğini sağlamakla sorumlu

Bağımlılık almak istediğiniz başka hizmetler varsa bir sorun oluşturun ve Bunları GitHub'da önerin.

Konak hizmetlerini geçersiz kılma

Ana bilgisayar tarafından sağlanan hizmetlerin geçersiz kılınması şu anda desteklenmiyor. Geçersiz kılmak istediğiniz hizmetler varsa bir sorun oluşturun ve Bunları GitHub'da önerin.

Seçenekler ve ayarlarla çalışma

Uygulama ayarlarında tanımlanan değerler, başlangıç sınıfındaki uygulama ayarları değerlerini okumanızı sağlayan bir IConfiguration örnekte kullanılabilir.

Örnekteki IConfiguration değerleri özel bir türe ayıklayabilirsiniz. Uygulama ayarları değerlerini özel bir türe kopyalamak, bu değerleri eklenebilir hale getirerek hizmetlerinizi test etmenizi kolaylaştırır. Yapılandırma örneğine okuma Ayarlar basit anahtar/değer çiftleri olmalıdır. Elastik Premium planında çalışan işlevler için uygulama ayarı adları yalnızca harf, sayı (), nokta (0-9.), iki nokta üst üste (:) ve alt çizgi (_) içerebilir. Daha fazla bilgi için bkz . Uygulama ayarında dikkat edilmesi gerekenler.

Uygulama ayarıyla tutarlı adlı bir özellik içeren aşağıdaki sınıfı göz önünde bulundurun:

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

Ve özel ayarı aşağıdaki gibi yapılandırabilecek bir local.settings.json dosya:

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

yönteminin Startup.Configure içinden aşağıdaki kodu kullanarak örnekteki IConfiguration değerleri özel türünüzde ayıklayabilirsiniz:

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

Çağrılması Bind , yapılandırmadan özel örneğe eşleşen özellik adlarına sahip değerleri kopyalar. Seçenekler örneği artık IoC kapsayıcısında bir işleve eklemek için kullanılabilir.

options nesnesi işlevine genel IOptions arabirimin bir örneği olarak eklenir. Value yapılandırmanızda bulunan değerlere erişmek için özelliğini kullanın.

using System;
using Microsoft.Extensions.Options;

public class HttpTrigger
{
    private readonly MyOptions _settings;

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

Daha fazla bilgi için bkz . ASP.NET Core'da seçenekler deseni.

ASP.NET Core kullanıcı gizli dizilerini kullanma

Uygulamanızı yerel olarak geliştirirken ASP.NET Core, gizli dizi bilgilerini proje kökü dışında depolamanıza olanak tanıyan bir Gizli Dizi Yöneticisi aracı sağlar. Gizli dizilerin yanlışlıkla kaynak denetimine işlenme olasılığını azaltır. Azure İşlevleri Core Tools (sürüm 3.0.3233 veya üzeri), ASP.NET Core Secret Manager tarafından oluşturulan gizli dizileri otomatik olarak okur.

Bir .NET Azure İşlevleri projesini kullanıcı gizli dizilerini kullanacak şekilde yapılandırmak için proje kökünde aşağıdaki komutu çalıştırın.

dotnet user-secrets init

Ardından gizli dizileri oluşturmak veya güncelleştirmek için komutunu kullanın dotnet user-secrets set .

dotnet user-secrets set MySecret "my secret value"

İşlev uygulama kodunuzda kullanıcı gizli dizileri değerlerine erişmek için veya IOptionskullanınIConfiguration.

Yapılandırma kaynaklarını özelleştirme

Diğer yapılandırma kaynaklarını belirtmek için işlev uygulamanızın ConfigureAppConfigurationStartUp sınıfında yöntemini geçersiz kılın.

Aşağıdaki örnek hem temel hem de isteğe bağlı ortama özgü uygulama ayarları dosyalarından yapılandırma değerleri ekler.

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();
    }
    
    public override void Configure(IFunctionsHostBuilder builder)
    {
    }
}

özelliğine ConfigurationBuilderIFunctionsConfigurationBuilderyapılandırma sağlayıcıları ekleyin. Yapılandırma sağlayıcılarını kullanma hakkında daha fazla bilgi için bkz . ASP.NET Core'da yapılandırma.

A FunctionsHostBuilderContext , ile IFunctionsConfigurationBuilder.GetContext()elde edilir. Geçerli ortam adını almak ve işlev uygulaması klasörünüzdeki yapılandırma dosyalarının konumunu çözümlemek için bu bağlamı kullanın.

Varsayılan olarak, gibi appsettings.json yapılandırma dosyaları otomatik olarak işlev uygulamasının çıkış klasörüne kopyalanmamıştır. Dosyaların kopyalandığından emin olmak için dosyanızı .csproj aşağıdaki örnekle eşleşecek şekilde güncelleştirin.

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

Sonraki adımlar

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın: