集中CloudStorageAccount和TableServiceContext实例

时间:2012-02-02 12:47:08

标签: c# asp.net-mvc azure azure-storage azure-table-storage

在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类的实例。

这是一个好习惯吗?它会在任何方面伤害我,因为我在整个应用程序生命周期中使用相同的类吗?

有没有知道模式可以做到这一点?

3 个答案:

答案 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)

我不相信上下文的实例之间存在任何共享状态。话虽如此,控制器执行的事务时间并非易事。您持有上下文的时间越长,您就越有可能发生冲突。我发现将冲突和重叠保持在最低限度的一种方法是尽可能缩短加载/更改/保存周期。

埃里克