Централизация экземпляров CloudStorageAccount и TableServiceContext - PullRequest
3 голосов
/ 02 февраля 2012

В веб-роли ASP.NET MVC 3 я понял, что много пишу следующий код:

var account = 
    CloudStorageAccount.Parse(
        RoleEnvironment.GetConfigurationSettingValue("DataConnectionString")
    );

var ctx = 
    account.CreateCloudTableClient().GetDataServiceContext();

Итак, я решил централизовать это для всего приложения ASP.NET MVC и создал следующий класс со статическими свойствами:

internal class WindowsAzureStorageContext {

    public static CloudStorageAccount StorageAccount { 

        get {
            return
                CloudStorageAccount.Parse(
                    RoleEnvironment.GetConfigurationSettingValue("DataConnectionString")
                );
        }
    }

    public static TableServiceContext TableServiceCtx { 
        get {

            return
                StorageAccount.CreateCloudTableClient().GetDataServiceContext();
        } 
    }
}

И я использую это как показано ниже в моих контроллерах:

public class HomeController : Controller {

    private readonly TableServiceContext ctx = 
        WindowsAzureStorageContext.TableServiceCtx;

    public ViewResult Index() {

        var model = ctx.CreateQuery<TaskEntity>(Constants.TASKS_TABLE).
            Where(x => x.PartitionKey == string.Empty);

        return View(model);
    }

    public ViewResult Create() {
        return View();
    }

    [ActionName("Create")]
    [HttpPost, ValidateAntiForgeryToken]
    public ViewResult Create_post(TaskEntity taskEntity) {

        ctx.AddObject(Constants.TASKS_TABLE, new TaskEntity(taskEntity.Task));
        ctx.SaveChangesWithRetries();

        return RedirectToAction("Index");
    }
}

Я знаю, что это не подходит для модульных тестов, и мне следует обратиться к этому экземпляру TableServiceContext через интерфейс DI, но когда я это сделаю, я тоже подумаю об использовании этого класса WindowsAzureStorageContext, чтобы получить экземпляр TableServiceContext класс.

Это хорошая практика? Не повредит ли это мне в любой момент, потому что я использую один и тот же класс для всего жизненного цикла приложения?

Есть ли какой-нибудь шаблон для этого?

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Я думаю, вы можете использовать шаблон репозитория для общего контекста данных, с универсальным интерфейсом поверх него.Не уверен, что это поможет, но вы можете сослаться на мой блог http://blogs.shaunxu.me/archive/2010/03/15/azure-ndash-part-5-ndash-repository-pattern-for-table-service.aspx

1 голос
/ 02 февраля 2012

Я не вижу никаких проблем с этим. Похоже, хороший чистый способ сделать это. Я не знаю ни одного известного способа сделать это, но просто думал, что должно быть вчера.

0 голосов
/ 04 февраля 2012

Я не верю, что между экземплярами контекста существует какое-либо общее состояние. С учетом сказанного, время транзакции для выполнения контроллера нетривиально. Чем дольше вы держитесь за контекст, тем больше вероятность возникновения конфликтов. Я обнаружил, что один из способов минимизировать конфликты и перекрытия - это максимально сократить цикл загрузки / изменения / сохранения.

Erick

...