Share via


Beroendeinmatning med Azure SDK för .NET

Den här artikeln visar hur du registrerar Azure-tjänstklienter från de senaste Azure-klientbiblioteken för .NET för beroendeinmatning i en .NET-app. Varje modern .NET-app startas med hjälp av anvisningarna i en Program.cs fil.

Installera paket

Så här registrerar och konfigurerar du tjänstklienter från ett Azure.-prefix-paket:

  1. Installera Microsoft.Extensions.Azure-paketet i projektet:

    dotnet add package Microsoft.Extensions.Azure
    
  2. Installera Azure.Identity-paketet för att konfigurera en TokenCredential typ som ska användas för att autentisera alla registrerade klienter som accepterar en sådan typ:

    dotnet add package Azure.Identity
    

I demonstrationssyfte använder exempelkoden i den här artikeln key vault-biblioteken Hemligheter, Blob Storage och Service Bus. Installera följande paket för att följa med:

dotnet add package Azure.Security.KeyVault.Secrets
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Messaging.ServiceBus

Registrera klienter och underklienter

En tjänstklient är startpunkten för API:et för en Azure-tjänst – från den kan biblioteksanvändare anropa alla åtgärder som tjänsten tillhandahåller och enkelt implementera de vanligaste scenarierna. Om det förenklar utformningen av ett API kan grupper av tjänstanrop ordnas runt mindre underklienttyper. Du kan till exempel ServiceBusClient registrera ytterligare ServiceBusSender underklienter för att publicera meddelanden eller ServiceBusReceiver underklienter för att använda meddelanden.

I filen Program.cs anropar AddAzureClients du tilläggsmetoden för att registrera en klient för varje tjänst. Följande kodexempel ger vägledning om programbyggare från namnrymderna Microsoft.AspNetCore.Builder och Microsoft.Extensions.Hosting .

using Azure.Identity;
using Azure.Messaging.ServiceBus;
using Azure.Messaging.ServiceBus.Administration;
using Microsoft.Extensions.Azure;

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

List<string> queueNames = await GetQueueNames();

builder.Services.AddAzureClients(clientBuilder =>
{
    // Register clients for each service
    clientBuilder.AddSecretClient(new Uri("<key_vault_url>"));
    clientBuilder.AddBlobServiceClient(new Uri("<storage_url>"));
    clientBuilder.AddServiceBusClientWithNamespace(
        "<your_namespace>.servicebus.windows.net");
    clientBuilder.UseCredential(new DefaultAzureCredential());

    // Register a subclient for each Service Bus Queue
    foreach (string queue in queueNames)
    {
        clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>(
            (_, _, provider) => provider.GetService<ServiceBusClient>()
                    .CreateSender(queue)).WithName(queue);
    }
});

WebApplication app = builder.Build();

async Task<List<string>> GetQueueNames()
{
    // Query the available queues for the Service Bus namespace.
    var adminClient = new ServiceBusAdministrationClient
        ("<your_namespace>.servicebus.windows.net", new DefaultAzureCredential());
    var queueNames = new List<string>();

    // Because the result is async, the queue names need to be captured
    // to a standard list to avoid async calls when registering. Failure to
    // do so results in an error with the services collection.
    await foreach (QueueProperties queue in adminClient.GetQueuesAsync())
    {
        queueNames.Add(queue.Name);
    }

    return queueNames;
}

I koden ovan:

  • Key Vault-hemligheter, Blob Storage- och Service Bus-klienter registreras med hjälp av AddSecretClientAddBlobServiceClientAddServiceBusClientWithNamespace, respektive . Argumenten Uri- och string-typ skickas. Information om hur du undviker att uttryckligen ange dessa URL:er finns i avsnittet Lagra konfiguration separat från kod .
  • DefaultAzureCredential används för att uppfylla argumentkravet TokenCredential för varje registrerad klient. När en av klienterna skapas DefaultAzureCredential används den för att autentisera.
  • Service Bus-underklienter registreras för varje kö i tjänsten med hjälp av de underordnade och motsvarande alternativtyperna. Könamnen för underklienterna hämtas med en separat metod utanför tjänstregistreringen GetQueuesAsync eftersom metoden måste köras asynkront.

Använda de registrerade klienterna

Med de registrerade klienterna, enligt beskrivningen i avsnittet Registrera klienter och underklienter , kan du nu använda dem. I följande exempel används konstruktorinmatning för att hämta Blob Storage-klienten i en ASP.NET Core API-kontrollant:

[ApiController]
[Route("[controller]")]
public class MyApiController : ControllerBase
{
    private readonly BlobServiceClient _blobServiceClient;
  
    public MyApiController(BlobServiceClient blobServiceClient)
    {
        _blobServiceClient = blobServiceClient;
    }
  
    [HttpGet]
    public async Task<IEnumerable<string>> Get()
    {
        BlobContainerClient containerClient = 
            _blobServiceClient.GetBlobContainerClient("demo");
        var results = new List<string>();

        await foreach (BlobItem blob in containerClient.GetBlobsAsync())
        {
            results.Add(blob.Name);
        }

        return results.ToArray();
    }
}

Lagra konfiguration separat från kod

I avsnittet Registrera klienter och underklienter skickade du uttryckligen variablerna Uri-typ till klientkonstruktorerna. Den här metoden kan orsaka problem när du kör kod mot olika miljöer under utveckling och produktion. .NET-teamet föreslår att sådana konfigurationer lagras i miljöberoende JSON-filer. Du kan till exempel ha en appettings. Development.json fil som innehåller inställningar för utvecklingsmiljön. En annan appettings. Production.json fil skulle innehålla inställningar för produktionsmiljön och så vidare. Filformatet är:

{
  "AzureDefaults": {
    "Diagnostics": {
      "IsTelemetryDisabled": false,
      "IsLoggingContentEnabled": true
    },
    "Retry": {
      "MaxRetries": 3,
      "Mode": "Exponential"
    }
  },
  "KeyVault": {
    "VaultUri": "https://mykeyvault.vault.azure.net"
  },
  "ServiceBus": {
    "Namespace": "<your_namespace>.servicebus.windows.net"
  },
  "Storage": {
    "ServiceUri": "https://mydemoaccount.storage.windows.net"
  }
}

Du kan lägga till alla egenskaper från ClientOptions klassen i JSON-filen. Inställningarna i JSON-konfigurationsfilen kan hämtas med .IConfiguration

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddSecretClient(
        builder.Configuration.GetSection("KeyVault"));

    clientBuilder.AddBlobServiceClient(
        builder.Configuration.GetSection("Storage"));

    clientBuilder.AddServiceBusClientWithNamespace(
        builder.Configuration["ServiceBus:Namespace"]);

    clientBuilder.UseCredential(new DefaultAzureCredential());

    // Set up any default settings
    clientBuilder.ConfigureDefaults(
        builder.Configuration.GetSection("AzureDefaults"));
});

I föregående JSON-exempel:

Konfigurera flera tjänstklienter med olika namn

Anta att du har två lagringskonton: ett för privat information och ett annat för offentlig information. Din app överför data från allmänheten till det privata lagringskontot efter en viss åtgärd. Du måste ha två lagringstjänstklienter. Om du vill särskilja dessa två klienter använder du WithName tilläggsmetoden:

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        builder.Configuration.GetSection("PublicStorage"));

    clientBuilder.AddBlobServiceClient(
            builder.Configuration.GetSection("PrivateStorage"))
        .WithName("PrivateStorage");
});

Använd till exempel en ASP.NET Core-styrenhet och få åtkomst till den namngivna tjänstklienten med hjälp av IAzureClientFactory<TClient> gränssnittet:

public class HomeController : Controller
{
    private readonly BlobServiceClient _publicStorage;
    private readonly BlobServiceClient _privateStorage;

    public HomeController(
        BlobServiceClient defaultClient,
        IAzureClientFactory<BlobServiceClient> clientFactory)
    {
        _publicStorage = defaultClient;
        _privateStorage = clientFactory.CreateClient("PrivateStorage");
    }
}

Den namnlösa tjänstklienten är fortfarande tillgänglig på samma sätt som tidigare. Namngivna klienter är additiva.

Konfigurera en ny återförsöksprincip

Vid något tillfälle kanske du vill ändra standardinställningarna för en tjänstklient. Du kanske till exempel vill ha olika återförsöksinställningar eller använda en annan version av tjänst-API:et. Du kan ange återförsöksinställningarna globalt eller per tjänst. Anta att du har följande appsettings.json fil i ditt ASP.NET Core-projekt:

{
  "AzureDefaults": {
    "Retry": {
      "maxRetries": 3
    }
  },
  "KeyVault": {
    "VaultUri": "https://mykeyvault.vault.azure.net"
  },
  "ServiceBus": {
    "Namespace": "<your_namespace>.servicebus.windows.net"
  },
  "Storage": {
    "ServiceUri": "https://store1.storage.windows.net"
  },
  "CustomStorage": {
    "ServiceUri": "https://store2.storage.windows.net"
  }
}

Du kan ändra återförsöksprincipen så att den passar dina behov så här:

builder.Services.AddAzureClients(clientBuilder =>
{
    // Establish the global defaults
    clientBuilder.ConfigureDefaults(
        builder.Configuration.GetSection("AzureDefaults"));
    clientBuilder.UseCredential(new DefaultAzureCredential());

    // A Key Vault Secrets client using the global defaults
    clientBuilder.AddSecretClient(
        builder.Configuration.GetSection("KeyVault"));

    // A Blob Storage client with a custom retry policy
    clientBuilder.AddBlobServiceClient(
            builder.Configuration.GetSection("Storage"))
        .ConfigureOptions(options => options.Retry.MaxRetries = 10);

    clientBuilder.AddServiceBusClientWithNamespace(
            builder.Configuration["ServiceBus:Namespace"])
        .ConfigureOptions(options => options.RetryOptions.MaxRetries = 10);

    // A named storage client with a different custom retry policy
    clientBuilder.AddBlobServiceClient(
            builder.Configuration.GetSection("CustomStorage"))
        .WithName("CustomStorage")
        .ConfigureOptions(options =>
        {
            options.Retry.Mode = Azure.Core.RetryMode.Exponential;
            options.Retry.MaxRetries = 5;
            options.Retry.MaxDelay = TimeSpan.FromSeconds(120);
        });
});

Du kan också placera åsidosättningar av återförsöksprinciper i filen appsettings.json :

{
  "KeyVault": {
    "VaultUri": "https://mykeyvault.vault.azure.net",
    "Retry": {
      "maxRetries": 10
    }
  }
}

Se även