In my last post, I described how the configuration setting publisher worked. More specifically, I covered how to use the typical use-case of retrieving connection strings from Azure or local configuration and the typical errors you might produce when you use this incorrectly. I found myself writing the same code very often so I encapsulated this into a simple set of fluent-ish extensions (I say “ish” because by technical definition of fluent, these aren’t self-referencing… yet). That said, I thought I’d share this code as it helps me get my apps started pretty quickly.
// Author: Tobin Titus <tobin.titus@gmail.com> // Copyright (c) 2010 Tobin Titus // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using Microsoft.WindowsAzure.ServiceRuntime; using System.Configuration; namespace AzureNinja.Storage { public class Client { public const string DEFAULT_CONNECTION_STRING_NAME = "StorageConnectionString"; static Client() { CloudStorageAccount.SetConfigurationSettingPublisher( (configName, configSettingPublisher) => { var connectionString = RoleEnvironment.IsAvailable ? RoleEnvironment.GetConfigurationSettingValue(configName) : ConfigurationManager.AppSettings[configName]; configSettingPublisher(connectionString); }); } public static CloudStorageAccount FromConfig( string configSetting = DEFAULT_CONNECTION_STRING_NAME) { return CloudStorageAccount.FromConfigurationSetting(configSetting); } public static CloudStorageAccount FromString(string connectionString) { return CloudStorageAccount.Parse(connectionString); } } public static class CloudStorageClientHelpers { public static CloudBlobClient ForBlobs(this CloudStorageAccount account) { return account.CreateCloudBlobClient(); } public static CloudQueueClient ForQueues(this CloudStorageAccount account) { return account.CreateCloudQueueClient(); } public static CloudTableClient ForTables(this CloudStorageAccount account) { return account.CreateCloudTableClient(); } } }
You can then construct your requests for a CloudXxxClient as follows:
CloudBlobClient client1 = Client.FromConfig().ForBlobs(); CloudQueueClient client2 = Client.FromConfig().ForQueues(); CloudTableClient client3 = Client.FromConfig().ForTables();
This uses “StorageConnectionString” as the default configuration key. And you can specify configuration key as well:
Client.FromConfig(“myConfigKey”).ForBlobs();
Furthermore, this allows you to concentrate on your calls to an otherwise fluent Azure API:
Client.FromConfig().ForBlobs().GetContainerReference(“myContainer”).Delete();
or
Client.FromConfig().ForBlobs() .GetContainerReference("myContainer").CreateIfNotExist();
Let me know if you have any questions or input.