.NET Azure İşlevleri'nde bağımlılık eklemeyi kullanma
Azure Işlevleri, sınıflar ve bunların bağımlılıkları arasında denetimin (IOC) bir Iç sürümünü elde etmek için bir tekniktir olan bağımlılık ekleme (dı) yazılım tasarım modelini destekler.
Azure Işlevlerine bağımlılık ekleme, .NET Core bağımlılığı ekleme özellikleri üzerine kurulmuştur. .NET Core bağımlılığı ekleme konusunda benzerlik yapmanız önerilir. Bağımlılıkları geçersiz kılma ve yapılandırma değerlerinin tüketim planında Azure Işlevleri ile nasıl okunduğu konusunda farklılıklar vardır.
Bağımlılık ekleme desteği, Azure Işlevleri 2. x ile başlar.
Bağımlılık ekleme desenleri, C# işlevlerinizin işlem içinde veya işlem dışıçalışmasına bağlı olarak farklılık gösterir.
Önemli
Bu makaledeki kılavuz yalnızca çalışma zamanında işlem içinde çalışan C# sınıf kitaplığı işlevleriiçin geçerlidir. Bu özel bağımlılık ekleme modeli, .NET 5,0 işlevlerini işlem dışı çalıştırmanıza olanak sağlayan .net yalıtılmış işlevleriiçin uygulanmaz. .net yalıtılmış işlem modeli, normal ASP.NET Core bağımlılığı ekleme desenlerine dayanır. Daha fazla bilgi edinmek için bkz. .NET yalıtılmış işlem kılavuzu 'nda bağımlılık ekleme .
Önkoşullar
bağımlılık ekleme 'yi kullanabilmeniz için aşağıdaki NuGet paketlerini yüklemelisiniz:
Microsoft. net. SDK. Functions paket sürümü 1.0.28 veya üzeri
Microsoft. Extensions. Dependencyınjection (Şu anda yalnızca sürüm 3. x ve daha önceki sürümleri desteklenir)
Hizmetleri Kaydet
Hizmetleri kaydetmek için bir örneğe bileşen yapılandırmak ve eklemek üzere bir yöntem oluşturun IFunctionsHostBuilder . Azure Işlevleri ana makinesi bir örneği oluşturur IFunctionsHostBuilder ve doğrudan kendi yönteğinize geçirir.
Yöntemi kaydetmek için FunctionsStartup Başlangıç sırasında kullanılan tür adını belirten derleme özniteliğini ekleyin.
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 örnek, bir başlangıç kaydı için gereken Microsoft. Extensions. http paketini kullanır HttpClient .
Uyarılar
Çalışma zamanı başlangıç sınıfını işleyerek önce ve sonra çalıştırılan bir dizi kayıt adımı. Bu nedenle, aşağıdaki öğeleri aklınızda bulundurun:
Başlangıç sınıfı yalnızca kurulum ve kayıt için tasarlanmıştır. Başlangıç 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 bir iletiyi günlüğe almaya çalışmayın. Kayıt sürecinin bu noktası, hizmetlerinizin kullanıma hazır olması için çok erken bir işlemdir. Yöntem çalıştırıldıktan sonra
Configureişlevler çalışma zamanı, hizmetlerinizin nasıl çalıştığını etkileyebilecek ek bağımlılıklar kaydetmeye devam eder.Bağımlılık ekleme kapsayıcısı yalnızca açık olarak kayıtlı türleri barındırır. Yalnızca Injectable türleri olarak kullanılabilen hizmetler, yönteminde kurulum olan şeydir
Configure. Sonuç olarak, gibi IŞLEVLERE özgü türlerBindingContextExecutionContextKurulum sırasında veya Injectable türleri olarak kullanılamaz.
Eklenen bağımlılıkları kullan
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 kullanmanıza gerek duyar.
Aşağıdaki örnek, IMyService ve HttpClient bağımlılıklarının http ile tetiklenen bir işleve nasıl eklendiğini gösterir.
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 örnek, bir başlangıç kaydı için gereken Microsoft. Extensions. http paketini kullanır HttpClient .
Hizmet yaşam süreleri
Azure işlevleri uygulamaları ASP.NET bağımlılığı eklemeile aynı hizmet yaşam sürelerini sağlar. Işlevler uygulaması için farklı hizmet yaşam süreleri aşağıdaki gibi davranır:
- Geçici: geçici hizmetler, hizmetin her çözümlenme sonrasında oluşturulur.
- Kapsam: kapsamlı hizmet ömrü bir işlev yürütme ömrü ile eşleşir. Kapsamlı hizmetler, işlev yürütmesi başına bir kez oluşturulur. Yürütme sırasında o hizmetin sonraki istekleri, var olan hizmet örneğini yeniden kullanır.
- Tekil : tek hizmet ömrü, ana bilgisayar ömrü ile eşleşir ve bu örnekteki işlev Yürütmelerinde yeniden kullanılır. Tek ömür Hizmetleri, bağlantılar ve istemciler için, örneğin
DocumentClientveya örnekler için önerilirHttpClient.
GitHub farklı hizmet yaşam sürelerinin 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, bir özel türü ILoggerProvider Microsoft. Extensions. logging. soyutlamalar NuGet paketi aracılığıyla kullanılabilen bir örneği olarak kaydedin.
Application Insights, Azure işlevleri tarafından otomatik olarak eklenir.
Uyarı
AddApplicationInsightsTelemetry()Ortam tarafından sunulan hizmetlerle çakışan Hizmetleri kaydeden hizmetler koleksiyonuna eklemeyin.- kendi kendinize kaydolmayın
TelemetryConfigurationveyaTelemetryClientyerleşik Application Insights işlevini kullanıyorsanız. Kendi örneğinizi yapılandırmanız gerekiyorsaTelemetryClient,TelemetryConfigurationC# işlevlerinde günlük özel telemetribölümünde gösterildiği gibi eklenen ile bir tane oluşturun.
ILogger <T> ve ıloggerfactory
Ana bilgisayar, ILogger<T> ILoggerFactory oluşturucular halinde ve hizmetlerdeki Hizmetleri barındırır. Bununla birlikte, varsayılan olarak bu yeni günlük filtreleri işlev günlüklerinden filtrelenerek yapılır. host.jsonEk filtreler ve kategoriler için kabul etmek üzere dosyayı değiştirmeniz gerekir.
Aşağıdaki örnek, konağa açık olan günlüklerin nasıl ekleneceğini gösterir ILogger<HttpTrigger> .
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 sunulan hizmetler
İşlev Konağı birçok hizmeti kaydeder. Aşağıdaki hizmetler uygulamanızda bir bağımlılık olarak ele alınır:
| Hizmet Türü | Ömür | Description |
|---|---|---|
Microsoft.Extensions.Configuration.IConfiguration |
Adet | Çalışma zamanı yapılandırması |
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider |
Adet | Konak örneğinin KIMLIĞINI sağlamaktan sorumlu |
Bağımlılığı almak istediğiniz başka hizmetler varsa, bir sorun oluşturun ve bunları GitHub önerin.
Konak hizmetlerini geçersiz kılma
Konak tarafından belirtilen geçersiz kılma Hizmetleri şu anda desteklenmiyor. Geçersiz kılmak istediğiniz hizmetler varsa, bir sorun oluşturun ve GitHub üzerinde önerin.
Seçeneklerle ve ayarlarla çalışma
Uygulama ayarlarında tanımlanan değerler IConfiguration , başlangıç sınıfındaki uygulama ayarları değerlerini okumanızı sağlayan bir örnekte kullanılabilir.
IConfigurationÖrnekten değerleri özel bir türe ayıklayabilirsiniz. Uygulama ayarları değerlerini özel bir türe kopyalamak, bu değerleri tablo haline getirerek, hizmetlerinizi test etmelerini kolaylaştırır. yapılandırma örneğine okunan Ayarlar basit anahtar/değer çiftleri olmalıdır.
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 local.settings.json özel ayarı aşağıdaki gibi yapılandırabilecek bir dosya:
{
"IsEncrypted": false,
"Values": {
"MyOptions:MyCustomSetting": "Foobar"
}
}
Startup.ConfigureYöntemi içinde, IConfiguration aşağıdaki kodu kullanarak örnekten değerleri özel türüne ayıklayabilirsiniz:
builder.Services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.GetSection("MyOptions").Bind(settings);
});
Çağırma Bind özelliği, eşleşen özellik adlarına sahip değerleri özel örneğe kopyalar. Options örneği artık bir işleve eklemek için IoC kapsayıcısında kullanılabilir.
Options nesnesi, genel arabirimin bir örneği olarak işlevine eklenir IOptions . ValueYapı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;
}
}
seçeneklerle çalışma hakkında daha fazla ayrıntı için ASP.NET Core içindeki seçenekler düzenine bakın.
ASP.NET Core kullanıcı gizli dizileri kullanma
yerel olarak geliştirilirken, ASP.NET Core gizli bilgileri proje kökü dışında depolamanızı sağlayan bir gizli dizi yöneticisi aracı sağlar. Parolaların yanlışlıkla kaynak denetimine kaydedilmesine daha az neden olur. Azure Functions Core Tools (sürüm 3.0.3233 veya üzeri), ASP.NET Core gizli yöneticisi tarafından oluşturulan gizli dizileri otomatik olarak okur.
Bir .NET Azure Iş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 gizli dizileri oluşturmak veya güncelleştirmek için komutunu kullanın.
dotnet user-secrets set MySecret "my secret value"
İşlev uygulaması kodunuzda Kullanıcı gizli dizileri değerlerine erişmek için IConfiguration veya kullanın IOptions .
Yapılandırma kaynaklarını özelleştirme
Not
Yapılandırma kaynağı özelleştirmesi, Azure Işlevleri ana bilgisayar sürümleri 2.0.14192.0 ve 3.0.14191.0 ' den başlayarak kullanılabilir.
Ek yapılandırma kaynakları belirtmek için, ConfigureAppConfiguration işlev uygulamanızın sınıfındaki yöntemi geçersiz kılın StartUp .
Aşağıdaki örnek, temel ve isteğe bağlı ortama özgü uygulama ayarları dosyalarından yapılandırma değerlerini 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();
}
}
}
Özelliğine yapılandırma sağlayıcıları ekleyin ConfigurationBuilder IFunctionsConfigurationBuilder . Yapılandırma sağlayıcılarını kullanma hakkında daha fazla bilgi için ASP.NET Core yapılandırmakonusuna bakın.
FunctionsHostBuilderContext, Öğesinden elde edilir IFunctionsConfigurationBuilder.GetContext() . Bu bağlamı, geçerli ortam adını almak ve işlev uygulama klasörünüzdeki yapılandırma dosyalarının konumunu çözümlemek için kullanın.
Varsayılan olarak, appSettings. JSON gibi yapılandırma dosyaları, işlev uygulamasının çıkış klasörüne otomatik olarak kopyalanmaz. Dosyaların kopyalandığından emin olmak için . csproj dosyanızı 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>
Önemli
tüketim veya Premium planlarında çalışan işlev uygulamaları için, tetiklerde 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 yapılan tüm değişiklikler, FunctionsStartup işlev uygulaması başlatma hatasıyla sonuçlanır.
Sonraki adımlar
Daha fazla bilgi için aşağıdaki kaynaklara bakın: