我有这两个对象用于Azure Blob存储访问,并希望在ASP.NET MVC应用程序中使用它们。
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("Deesd");
我的问题是:我可以在所有应用程序请求中重用相同的对象实例,还是应该在每个方法中实例化一个新对象?
答案 0 :(得分:9)
您可以重用实例,只是不要同时从多个线程访问同一个实例,因为它不是线程安全的。
更新2019年4月(7年后)
注意:您应该始终查阅最新的SDK文档。
是的,现在(至少在此更新时)可以安全地在较新版本的SDK中以线程安全的方式使用CloudBlobClient
和其他对象。实际上,您发现的一些文档鼓励它,但技术上仍然无法保证在设计上保持这种方式(例如,SDK的未来主要版本可能会重新考虑这一点)。
像往常一样,您应该为应用程序级逻辑提供抽象,以尽可能地隐藏客户端及其生命周期。然后你让抽象担心终身管理。也许今天使用的是一个简单的静态实例,明天可能会使用池化,但至少如果出现问题,大部分应用程序逻辑都会从中抽象出来。
答案 1 :(得分:4)
您可以重复使用它。据我所知,除了初始化之外,它不包含任何状态。
答案 2 :(得分:1)
This link明确指出,您应在请求中重用相同的客户端,因为这些客户端管理连接,因此能够优化基础调用以与服务建立连接。
This is the direct link to Microsoft Documentation说同样的话
Cosmos Db advice的相似之处在于,在应用程序的生命周期中建议使用单例模式
答案 3 :(得分:0)
取决于客户端版本,我在这里从 Microsoft 的某个人那里找到了答案: https://github.com/Azure/azure-storage-net/issues/732#issuecomment-745749919
<块引用>至于使 CloudBlobClient 成为单例。可以尝试这样做并取得一些成功。但是,请注意 V11 和之前的类型(如 CloudBlobClient 和 CloudBlob)是有状态的。它们可能具有可变属性,并且某些 API 可能会改变状态。因此,我建议在尝试此操作时要谨慎。 我强烈建议改用 V12,其中所有客户端都设计为无状态,可以在任何生命周期内安全使用。