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