Sélectionner une page


[2015/05/13] Le code de cet article a été mis à jour pour fonctionner avec le package NuGet Preview Windows Azure Storage 4.4.0

Appliquer le ModelCommand Pattern J’ai pu créer une commande qui nous permet de télécharger un objet sérialisable en tant que JSON et de le stocker dans un conteneur d’objets blob existant.

Travailler avec Json.NETqui peut être installé avec NuGetnous pouvons sérialiser des objets et les envoyer au stockage Blob Windows Azure. le UploadToBlogStorageAsJson ModelCommand a été spécialement créé pour simplifier ce processus.

Pour télécharger JSON dans un conteneur de stockage d’objets blob, nous devons d’abord utiliser le Référence Contrainer Utilisez le nom du conteneur fourni par les paramètres du constructeur. Ensuite, nous obtenons le Référence blob. On prépare ensuite ça Référence blob avec les métadonnées et les propriétés fournies avant de télécharger le JSON sur le stockage Blob Windows Azure.


public class UploadToBlobStorageAsJson : IModelCommand<CloudStorageAccount>
{
    private const string CONTENT_TYPE = "application/json";

    private readonly object obj;
    private readonly string containerPath;
    private readonly string blobAddressUri;
    private readonly Dictionary<string, string> metadata;

    public UploadToBlobStorageAsJson(object obj,
                                        string containerPath,
                                        string blobAddressUri,
                                        Dictionary<string, string> metadata)
    {
        this.obj = obj;
        this.containerPath = containerPath;
        this.blobAddressUri = blobAddressUri;
        this.metadata = metadata;
    }

    public void Apply(CloudStorageAccount model)
    {
        var client = model.CreateCloudBlobClient();

        var container = client.GetContainerReference(containerPath);

        if (!container.Exists())
            container.Create();

        var blobReference = container.GetBlockBlobReference(blobAddressUri);

        var blockBlob = blobReference;
        UploadToContainer(blockBlob);
    }

    private void UploadToContainer(CloudBlockBlob blockBlob)
    {
        SetBlobProperties(blockBlob);

        using (var ms = new MemoryStream())
        {
            LoadStreamWithJson(ms);
            blockBlob.UploadFromStream(ms);
        }
    }

    private void SetBlobProperties(CloudBlockBlob blobReference)
    {
        blobReference.Properties.ContentType = CONTENT_TYPE;
        foreach (var meta in metadata)
        {
            blobReference.Metadata.Add(meta.Key, meta.Value);
        }
    }

    private void LoadStreamWithJson(Stream ms)
    {
        var json = JsonConvert.SerializeObject(obj);
        StreamWriter writer = new StreamWriter(ms);
        writer.Write(json);
        writer.Flush();
        ms.Position = 0;
    }
}

Utilisation de la commande de modèle UploadToBlobStorageAsJson

Les tests suivants ont été rédigés pour démontrer un effet secondaire intéressant du ModelCommand. Le premier test montre comment instancier une commande et télécharger un objet sur le stockage Blob Windows Azure. Le deuxième test est intéressant car il applique la commande deux fois et réutilise efficacement l’instance de commande.

La commande contient une référence à l’objet qui est sérialisé et envoyé au stockage Blob Windows Azure. En conservant l’instance de commande, nous pouvons télécharger l’objet. Ensuite, nous pouvons changer et l’appeler localement Appliquer sur la commande pour télécharger à nouveau l’objet modifié dans le même objet blob dans le stockage d’objets blob Windows Azure.


[TestClass]
public class BlobStorageUnitTests
{
    [TestMethod]
    public void TestUploadToBlobStorage()
    {
        var obj = new
        {
            By = "Alexandre Brisebois",
            Message = "This is a test Message"
        };

        var uploadToBlobStorage = new UploadToBlobStorageAsJson(obj,
                                                "test",
                                                "testObject",
                                                new Dictionary<string, string>());

        var storageAccount = CloudStorageAccount.Parse(GetConnectionString());

        uploadToBlobStorage.Apply(storageAccount);
    }

    [TestMethod]
    public void TestUploadThenChangeThenUpload()
    {
        var obj = new
        {
            By = "Alexandre Brisebois",
            Message = "This is a test Message"
        };

        var uploadToBlobStorage = new UploadToBlobStorageAsJson(obj,
                                                "test",
                                                "testObject",
                                                new Dictionary<string, string>());

        var storageAccount = CloudStorageAccount.Parse(GetConnectionString());

        uploadToBlobStorage.Apply(storageAccount);

        obj = new
        {
            By = "Charles Brisebois",
            Message = "This is a test Message"
        };

        uploadToBlobStorage = new UploadToBlobStorageAsJson(obj,
                                                "test",
                                                "testObject",
                                                new Dictionary<string, string>());

        uploadToBlobStorage.Apply(storageAccount);
    }

    private static string GetConnectionString()
    {
        return CloudConfigurationManager.GetSetting("StorageConnectionString");
    }
}

Le CloudConfigurationManager recherche d’abord les configurations cloud. S’il ne le trouve pas, il recherche un paramètre d’application approprié. Dans cet exemple, le paramètre a été trouvé dans le fichier App.Config suivant.


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="StorageConnectionString"
         value="DefaultEndpointsProtocol=https;
                AccountName=*******;
                AccountKey=********" />
 </appSettings> 
</configuration> 



Source link

Recent Posts