在ASP.NET MVC 3 Web角色中,我意识到我一直在编写以下代码:
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");
}
}
我知道这不是一个单元测试友好的我应该通过DI的接口来联系TableServiceContext
实例但是当我这样做时,我考虑使用这个WindowsAzureStorageContext
类来获取TableServiceContext
类的实例。
这是一个好习惯吗?它会在任何方面伤害我,因为我在整个应用程序生命周期中使用相同的类吗?
有没有知道模式可以做到这一点?
答案 0 :(得分:1)
我没有看到这样做有任何问题。看起来像一个很好的干净方式来做到这一点。我不知道这样做的已知模式,但只是认为应该是昨天。
答案 1 :(得分:1)
我认为您可以将存储库模式用于通用数据上下文,并在其上面使用通用接口。不确定它是否有帮助,但您可以参考我的博客http://blogs.shaunxu.me/archive/2010/03/15/azure-ndash-part-5-ndash-repository-pattern-for-table-service.aspx
答案 2 :(得分:0)
我不相信上下文的实例之间存在任何共享状态。话虽如此,控制器执行的事务时间并非易事。您持有上下文的时间越长,您就越有可能发生冲突。我发现将冲突和重叠保持在最低限度的一种方法是尽可能缩短加载/更改/保存周期。
埃里克