【发布时间】:2021-06-04 09:00:17
【问题描述】:
将 SearchIndexClient 注册到 DI 容器的推荐方法是什么? (假设我们只有一个索引) 将其注册为单例还是瞬态?
【问题讨论】:
标签: azure azure-cognitive-search azure-search-.net-sdk
将 SearchIndexClient 注册到 DI 容器的推荐方法是什么? (假设我们只有一个索引) 将其注册为单例还是瞬态?
【问题讨论】:
标签: azure azure-cognitive-search azure-search-.net-sdk
简短的回答是,您应该将其注册为单例,只要您确保避免使用非线程安全的属性和方法。它们中的大多数是线程安全的;只要避免从多个线程设置可变属性就可以了。
要更深入地讨论为什么这是推荐的做法以及如何将其扩展到更复杂的场景,请参阅related question。
【讨论】:
在 ASP.NET Core 应用中,您可以按如下方式注入客户端。
安装包:Microsoft.Extensions.Azure,Azure.Search.Documents(这是最新的)
在startup.cs的ConfigureServices方法中,注册客户端:
using Microsoft.Extensions.Azure;
public void ConfigureServices(IServiceCollection services)
{
services.AddAzureClients(builder =>
{
builder.AddSearchIndexClient(new
Uri("my resource url"), new
AzureKeyCredential("my resource key"));
});
services.AddControllers();
}
现在说你想在你的控制器中使用客户端,你可以像这样注入它:
public class MyApiController : ControllerBase
{
private readonly SearchIndexClient _searchIndexClient;
public MyApiController(SearchIndexClient searchIndexClient)
{
_searchIndexClient = searchIndexClient;
}
}
您可能不想将您的凭据直接放在ConfigureServices 中,在这种情况下,您可以将它们存储在appsettings.Development.json(或appsettings.Production.json)中:
"SearchDocument": {
"endpoint": "my resource url",
"credential": { "key": "my resource key" }
}
并在ConfigureServices 中执行此操作:
services.AddAzureClients(builder =>
{
builder.AddSearchIndexClient(
Configuration.GetSection("SearchDocument"));
});
【讨论】: