Skip to content

Commit 632d183

Browse files
New AddClient example (#43205)
* New AddClient examples Co-authored-by: Scott Addie <[email protected]> --------- Co-authored-by: Scott Addie <[email protected]>
1 parent ddf598a commit 632d183

File tree

8 files changed

+55
-23
lines changed

8 files changed

+55
-23
lines changed

docs/azure/sdk/dependency-injection.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ To register and configure service clients from an [`Azure.`-prefixed package](pa
2626
dotnet add package Azure.Identity
2727
```
2828
29-
For demonstration purposes, the sample code in this article uses the Key Vault Secrets, Blob Storage, and Service Bus libraries. Install the following packages to follow along:
29+
For demonstration purposes, the sample code in this article uses the Key Vault Secrets, Blob Storage, Service Bus, and Azure OpenAI libraries. Install the following packages to follow along:
3030
3131
```dotnetcli
3232
dotnet add package Azure.Security.KeyVault.Secrets
3333
dotnet add package Azure.Storage.Blobs
3434
dotnet add package Azure.Messaging.ServiceBus
35+
dotnet add package Azure.AI.OpenAI
3536
```
3637

3738
## Register clients and subclients
@@ -42,15 +43,15 @@ In the *Program.cs* file, invoke the <xref:Microsoft.Extensions.Azure.AzureClien
4243

4344
### [WebApplicationBuilder](#tab/web-app-builder)
4445

45-
:::code language="csharp" source="snippets/dependency-injection/WebApplicationBuilder/Program.cs" id="snippet_WebApplicationBuilder" highlight="10-26":::
46+
:::code language="csharp" source="snippets/dependency-injection/WebApplicationBuilder/Program.cs" id="snippet_WebApplicationBuilder" highlight="9-34":::
4647

4748
### [HostApplicationBuilder](#tab/host-app-builder)
4849

49-
:::code language="csharp" source="snippets/dependency-injection/HostApplicationBuilder/Program.cs" highlight="12-30":::
50+
:::code language="csharp" source="snippets/dependency-injection/HostApplicationBuilder/Program.cs" highlight="12-39":::
5051

5152
### [HostBuilder](#tab/host-builder)
5253

53-
:::code language="csharp" source="snippets/dependency-injection/HostBuilder/Program.cs" id="snippet_HostBuilder" highlight="11-26":::
54+
:::code language="csharp" source="snippets/dependency-injection/HostBuilder/Program.cs" id="snippet_HostBuilder" highlight="10-34":::
5455

5556
---
5657

@@ -59,6 +60,9 @@ In the preceding code:
5960
* Key Vault Secrets, Blob Storage, and Service Bus clients are registered using the <xref:Microsoft.Extensions.Azure.SecretClientBuilderExtensions.AddSecretClient%2A>, <xref:Microsoft.Extensions.Azure.BlobClientBuilderExtensions.AddBlobServiceClient%2A> and <xref:Microsoft.Extensions.Azure.ServiceBusClientBuilderExtensions.AddServiceBusClientWithNamespace%2A>, respectively. The `Uri`- and `string`-typed arguments are passed. To avoid specifying these URLs explicitly, see the [Store configuration separately from code](#store-configuration-separately-from-code) section.
6061
* <xref:Azure.Identity.DefaultAzureCredential> is used to satisfy the `TokenCredential` argument requirement for each registered client. When one of the clients is created, `DefaultAzureCredential` is used to authenticate.
6162
* Service Bus subclients are registered for each queue on the service using the subclient and corresponding options types. The queue names for the subclients are retrieved using a separate method outside of the service registration because the `GetQueuesAsync` method must be run asynchronously.
63+
* An Azure OpenAI client is registered using a custom client factory via the <xref:Microsoft.Extensions.Azure.AzureClientFactoryBuilder.AddClient%2A> method, which provides control over how a client instance is created. Custom client factories are useful in the following cases:
64+
* You need to use other dependencies during the client construction.
65+
* A registration extension method doesn't exist for the service client you want to register.
6266

6367
## Use the registered clients
6468

docs/azure/sdk/snippets/dependency-injection/Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@
1111
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="8.0.5" />
1212
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
1313
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.6.1" />
14+
<PackageVersion Include="Azure.AI.OpenAI" Version="2.0.0" />
1415
</ItemGroup>
1516
</Project>

docs/azure/sdk/snippets/dependency-injection/HostApplicationBuilder/HostApplicationBuilder.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
<PackageReference Include="Azure.Storage.Blobs" />
1515
<PackageReference Include="Microsoft.Extensions.Azure" />
1616
<PackageReference Include="Microsoft.Extensions.Hosting" />
17+
<PackageReference Include="Azure.AI.OpenAI" />
1718
</ItemGroup>
1819
</Project>

docs/azure/sdk/snippets/dependency-injection/HostApplicationBuilder/Program.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,24 @@
33
using Azure.Messaging.ServiceBus.Administration;
44
using Microsoft.Extensions.Azure;
55
using Microsoft.Extensions.Hosting;
6-
7-
List<string> queueNames = await GetQueueNames();
6+
using Azure.AI.OpenAI;
87

98
IHost host = Host.CreateDefaultBuilder(args)
109
.ConfigureServices(services =>
1110
{
12-
services.AddAzureClients(clientBuilder =>
11+
services.AddAzureClients(async clientBuilder =>
1312
{
1413
// Register clients for each service
1514
clientBuilder.AddSecretClient(new Uri("<key_vault_url>"));
1615
clientBuilder.AddBlobServiceClient(new Uri("<storage_url>"));
1716
clientBuilder.AddServiceBusClientWithNamespace("<your_namespace>.servicebus.windows.net");
18-
clientBuilder.UseCredential(new DefaultAzureCredential());
17+
18+
// Set a credential for all clients to use by default
19+
DefaultAzureCredential credential = new();
20+
clientBuilder.UseCredential(credential);
1921

2022
// Register subclients for Service Bus
23+
List<string> queueNames = await GetQueueNames(credential);
2124
foreach (string queueName in queueNames)
2225
{
2326
clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>((_, _, provider) =>
@@ -27,16 +30,21 @@
2730
_ => throw new InvalidOperationException("Unable to create ServiceBusClient")
2831
}).WithName(queueName);
2932
}
33+
34+
// Register a custom client factory
35+
clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>(
36+
(options, _, _) => new AzureOpenAIClient(
37+
new Uri("<url_here>"), credential, options));
3038
});
3139
}).Build();
3240

3341
await host.RunAsync();
3442

35-
async Task<List<string>> GetQueueNames()
43+
async Task<List<string>> GetQueueNames(DefaultAzureCredential credential)
3644
{
3745
// Query the available queues for the Service Bus namespace.
3846
var adminClient = new ServiceBusAdministrationClient
39-
("<your_namespace>.servicebus.windows.net", new DefaultAzureCredential());
47+
("<your_namespace>.servicebus.windows.net", credential);
4048
var queueNames = new List<string>();
4149

4250
// Because the result is async, the queue names need to be captured

docs/azure/sdk/snippets/dependency-injection/HostBuilder/HostBuilder.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
<PackageReference Include="Azure.Storage.Blobs" />
1515
<PackageReference Include="Microsoft.Extensions.Azure" />
1616
<PackageReference Include="Microsoft.Extensions.Hosting" />
17+
<PackageReference Include="Azure.AI.OpenAI" />
1718
</ItemGroup>
1819
</Project>

docs/azure/sdk/snippets/dependency-injection/HostBuilder/Program.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,45 @@
33
using Azure.Messaging.ServiceBus;
44
using Azure.Messaging.ServiceBus.Administration;
55
using Microsoft.Extensions.Azure;
6-
7-
List<string> queueNames = await GetQueueNames();
6+
using Azure.AI.OpenAI;
87

98
IHost host = Host.CreateDefaultBuilder(args)
109
.ConfigureServices(services =>
1110
{
12-
services.AddAzureClients(clientBuilder =>
11+
services.AddAzureClients(async clientBuilder =>
1312
{
1413
// Register clients for each service
1514
clientBuilder.AddSecretClient(new Uri("<key_vault_url>"));
1615
clientBuilder.AddBlobServiceClient(new Uri("<storage_url>"));
1716
clientBuilder.AddServiceBusClientWithNamespace("<your_namespace>.servicebus.windows.net");
18-
clientBuilder.UseCredential(new DefaultAzureCredential());
17+
18+
// Set a credential for all clients to use by default
19+
DefaultAzureCredential credential = new();
20+
clientBuilder.UseCredential(credential);
1921

2022
// Register a subclient for each Service Bus Queue
23+
List<string> queueNames = await GetQueueNames(credential);
2124
foreach (string queue in queueNames)
2225
{
2326
clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>((_, _, provider) =>
2427
provider.GetService<ServiceBusClient>().CreateSender(queue)
2528
).WithName(queue);
2629
}
30+
31+
// Register a custom client factory
32+
clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>(
33+
(options, _, _) => new AzureOpenAIClient(
34+
new Uri("<url_here>"), credential, options));
2735
});
2836
}).Build();
2937

3038
await host.RunAsync();
3139

32-
async Task<List<string>> GetQueueNames()
40+
async Task<List<string>> GetQueueNames(DefaultAzureCredential credential)
3341
{
3442
// Query the available queues for the Service Bus namespace.
3543
var adminClient = new ServiceBusAdministrationClient
36-
("<your_namespace>.servicebus.windows.net", new DefaultAzureCredential());
44+
("<your_namespace>.servicebus.windows.net", credential);
3745
var queueNames = new List<string>();
3846

3947
// Because the result is async, the queue names need to be captured

docs/azure/sdk/snippets/dependency-injection/WebApplicationBuilder/Program.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,44 @@
33
using Azure.Messaging.ServiceBus;
44
using Azure.Messaging.ServiceBus.Administration;
55
using Microsoft.Extensions.Azure;
6+
using Azure.AI.OpenAI;
67

78
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
89

9-
List<string> queueNames = await GetQueueNames();
10-
11-
builder.Services.AddAzureClients(clientBuilder =>
10+
builder.Services.AddAzureClients(async clientBuilder =>
1211
{
1312
// Register clients for each service
1413
clientBuilder.AddSecretClient(new Uri("<key_vault_url>"));
1514
clientBuilder.AddBlobServiceClient(new Uri("<storage_url>"));
1615
clientBuilder.AddServiceBusClientWithNamespace(
1716
"<your_namespace>.servicebus.windows.net");
18-
clientBuilder.UseCredential(new DefaultAzureCredential());
17+
18+
// Set a credential for all clients to use by default
19+
DefaultAzureCredential credential = new();
20+
clientBuilder.UseCredential(credential);
1921

2022
// Register a subclient for each Service Bus Queue
23+
List<string> queueNames = await GetQueueNames(credential);
2124
foreach (string queue in queueNames)
2225
{
2326
clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>(
2427
(_, _, provider) => provider.GetService<ServiceBusClient>()
25-
.CreateSender(queue)).WithName(queue);
28+
.CreateSender(queue)).WithName(queue);
2629
}
30+
31+
// Register a custom client factory
32+
clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>(
33+
(options, _, _) => new AzureOpenAIClient(
34+
new Uri("<url_here>"), credential, options));
2735
});
2836

2937
WebApplication app = builder.Build();
3038

31-
async Task<List<string>> GetQueueNames()
39+
async Task<List<string>> GetQueueNames(DefaultAzureCredential credential)
3240
{
3341
// Query the available queues for the Service Bus namespace.
3442
var adminClient = new ServiceBusAdministrationClient
35-
("<your_namespace>.servicebus.windows.net", new DefaultAzureCredential());
43+
("<your_namespace>.servicebus.windows.net", credential);
3644
var queueNames = new List<string>();
3745

3846
// Because the result is async, the queue names need to be captured

docs/azure/sdk/snippets/dependency-injection/WebApplicationBuilder/WebApplicationBuilder.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<PackageReference Include="Microsoft.Extensions.Azure" />
1515
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
1616
<PackageReference Include="Swashbuckle.AspNetCore" />
17+
<PackageReference Include="Azure.AI.OpenAI" />
1718
</ItemGroup>
1819

1920
</Project>

0 commit comments

Comments
 (0)