我正在使用ASP.NET Core 2.2和Azure表存储创建Web应用程序。由于Microsoft在Azure Storage SDK中为我们提供CloudTableClient
类,因此我将使用依赖项注入(DI)的类。但是,在标准DI方法中,有三种方法可以决定注册范围,例如AddScoped
,AddTransient
和AddSingleton
。我的问题是哪个注册范围是CloudTableClient
类最好的。我认为AddSingleton
是最好的,因为连接池饥饿没有发生,我会像附加的示例代码一样使用它。但是,如果在某些角度(即perf或可靠性)使用AddSingleton
是不好的,我想获得一些建议。
//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//do something
services.AddSingleton(provider =>
{
var settings = Configuration["AzureStorageConnectionString"];
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(settings);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
return tableClient;
});
//do something
}
//SampleController
public class SampleController : Controller
{
private CloudTable _table { get; };
public SampleController(CloudTableClient tableClient)
{
_table = tableClient;
}
public async Task<IActionResult> GetSample(string id)
{
//do something with _table
}
}
根据已发表的性能提示,使用单身人士是实现客户端的正确方法。
每个DocumentClient和Cosmosclient实例都是线程安全,并在直接模式下操作时执行有效的连接管理和地址缓存。为了允许SDK客户端的有效连接管理和更好的性能,建议在应用程序的寿命中使用每个AppDomain单个实例。
addscoped 然后,它将每次请求创建新客户端或 addtransient ,每次询问它时都会为您提供新的实例。如果您进行静态,那么所有线程都只能为所有实例提供一个实例,这可能是一个问题,因为实例不要保证它们是线程安全