2014-09-29 3 views
1

У меня есть класс обслуживания, которые включают в себя метод, называемый GetContainer,Можно ли сделать объект CloudBlobContainer переходным?

private CloudBlobContainer GetContainer(string blobConnectionString, string blobContainerName) 
    { 
     var storageAccount = CloudStorageAccount.Parse(blobConnectionString); 
     var blobClient = storageAccount.CreateCloudBlobClient(); 
     return blobClient.GetContainerReference(blobContainerName); 
    } 

теперь от службы метод вызывающей этого метода каждый раз, когда это необходимо для выполнения операции, как,

public Task CopyAsync(string blobConnectionString, string blobContainerName, string sourceFile, string destinationFile) 
    { 
     var container = GetContainer(blobConnectionString, blobContainerName); 
     return CopyInternalAsync(container, sourceFile, destinationFile); 
    } 

    private Task CopyInternalAsync(CloudBlobContainer container, string sourceFile, string destinationFile) 
    { 
     var sourceBlob = container.GetBlockBlobReference(sourceFile); 
     var destinationBlob = container.GetBlockBlobReference(destinationFile); 
     return destinationBlob.StartCopyFromBlobAsync(sourceBlob); 
    } 

я могу сделать CloudBlobContainer singleton, как образец web-api, делает это here. Но проблема в том, что моя строка blob-connection и имя-контейнера не исправлены. Должен ли я использовать ConcurrentDictionary или это прекрасно, чтобы сделать CloudBlobContainer переходным?

ответ

3

GetContainerReference и GetBlockBlobReference - оба очень легкие операции - ни переговоры с Azure, пока вы фактически не выполните операцию, такую ​​как StartCopyFromBlobAsync, которую вы делаете выше.

См https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Blob/CloudBlobClient.Common.cs#L288:

public CloudBlobContainer GetContainerReference(string containerName) 
{ 
    CommonUtility.AssertNotNullOrEmpty("containerName", containerName); 
    return new CloudBlobContainer(containerName, this); 
} 

и https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Blob/CloudBlobContainer.Common.cs#L82:

internal CloudBlobContainer(string containerName, CloudBlobClient serviceClient) : this(new BlobContainerProperties(), new Dictionary<string, string>(), containerName, serviceClient) 
{ 
} 

internal CloudBlobContainer(BlobContainerProperties properties, IDictionary<string, string> metadata, string containerName, CloudBlobClient serviceClient) 
{ 
    this.StorageUri = NavigationHelper.AppendPathToUri(serviceClient.StorageUri, containerName); 
    this.ServiceClient = serviceClient; 
    this.Name = containerName; 
    this.Metadata = metadata; 
    this.Properties = properties; 
} 

Это просто создать объект и вернуть его к вам - рассматривая его как переходный не должно быть проблемой.

Смежные вопросы