В веб-роли 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
класс.
Это хорошая практика? Не повредит ли это мне в любой момент, потому что я использую один и тот же класс для всего жизненного цикла приложения?
Есть ли какой-нибудь шаблон для этого?