这是ASP.NET Core上CloudTableClient类的最佳DI注册范围



我正在使用ASP.NET Core 2.2和Azure表存储创建Web应用程序。由于Microsoft在Azure Storage SDK中为我们提供CloudTableClient类,因此我将使用依赖项注入(DI)的类。但是,在标准DI方法中,有三种方法可以决定注册范围,例如AddScopedAddTransientAddSingleton。我的问题是哪个注册范围是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 ,每次询问它时都会为您提供新的实例。如果您进行静态,那么所有线程都只能为所有实例提供一个实例,这可能是一个问题,因为实例不要保证它们是线程安全

最新更新