Aracılığıyla paylaş


.NET Azure İşlevleri'nde bağımlılık ekleme özelliğini kullanma

Azure İşlevleri, sınıflar ve bağımlılıkları arasında Denetimin TersIni (IoC) elde etmek için kullanılan bir teknik olan bağımlılık ekleme (DI) yazılım tasarımı desenini destekler.

  • Azure İşlevleri'nde bağımlılık enjeksiyonu, .NET Core Bağımlılık Enjeksiyonu özellikleri üzerine kuruludur. .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 kayıt ettirme

Hizmetleri kaydetmek için, bir IFunctionsHostBuilder örneğini yapılandırmak ve bileşenleri eklemek üzere bir 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. FunctionsStartup sınıfı tarafından bu özelliklerde yapılan tüm değişiklikler bir işlev uygulaması başlatma hatasıyla sonuçlanır.

IConfiguration’ün enjeksiyonu 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>();
    }
}

Başlangıçta bir kaydetmek için gereken HttpClient paketi bu örnekte 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. Enjeksiyon yapılabilir türler olarak kullanılabilen tek servisler, Configure yönteminde ayarlanan servislerdir. Sonuç olarak, BindingContext ve ExecutionContext gibi işlevlere özgü türler kurulum sırasında veya enjeksiyon yapılabilir 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 açısından 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, builder.Services.AddAuthentication() çağrısı, portal ve konak arasındaki kimlik doğrulamasının bozulmasına neden olarak Azure İşlevleri çalışma zamanı ulaşılamaz gibi mesajlara yol açabilir.

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 örnek, IMyService ve HttpClient bağımlılıklarının HTTP ile tetiklenen bir işleve nasıl enjekte edildiğini göstermektedir.

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

Başlangıçta bir kaydetmek için gereken HttpClient paketi bu örnekte 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. Bağlantılar ve istemciler için DocumentClient veya HttpClient örnekleri gibi tekil yaşam süresi hizmetleri önerilir.

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

Kayıt hizmetleri

Kendi günlük sağlayıcınıza ihtiyacınız varsa, ILoggerProvider NuGet paketi aracılığıyla kullanılabilen özel bir türü olarak bir örnek olarak kaydedin.

Application Insights, Azure İşlevleri tarafından otomatik olarak eklenir.

Uyarı

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

ILogger<T> ve ILoggerFactory

Barındırıcı, ILogger<T> ve ILoggerFactory hizmetlerini oluşturuculara enjekte eder. Ancak, varsayılan olarak bu yeni günlük filtreleri işlev günlüklerine dahil edilmez. Ek filtrelere ve kategorilere katılmayı kabul etmek için dosyayı değiştirmeniz host.json gerekir.

Aşağıdaki örnek, ana bilgisayara açılan 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 barındırıcısı 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 Singleton Çalışma zamanı yapılandırması
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider Singleton Ana bilgisayar örneğinin kimliğini sağlamakla sorumludur.

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

Sunucu 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 okunan 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"
  }
}

Startup.Configure yönteminin içinden, aşağıdaki kodu kullanarak IConfiguration örneğindeki değerleri özel türünüze ayıklayabilirsiniz.

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

Bind çağrıldığında, yapılandırmadan özel örneğe, eşleşen özellik adlarına sahip değerler kopyalanır. Seçenekler örneği artık bir işlev içine enjekte edilebilmesi için IoC kapsayıcısında kullanılabilir hale gelmiştir.

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ı sırlarını 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 bilgilerin yanlışlıkla kaynak denetimine kaydedilme olasılığını azaltır. Azure functions 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 dotnet user-secrets set komutunu kullanarak gizli dizileri yaratın veya güncelleyin.

dotnet user-secrets set MySecret "my secret value"

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

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)
    {
    }
}

ConfigurationBuilder yapılandırma sağlayıcılarını IFunctionsConfigurationBuilder özelliğine 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.

FunctionsHostBuilderContext, IFunctionsConfigurationBuilder.GetContext()'den 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 için aşağıdaki kaynaklara bakın: