2012-02-02 7 views
3

、私は以下のコードをたくさん書いてきたことに気づいています一元化CloudStorageAccountとTableServiceContextインスタンスASP.NET MVC 3 Webロールで

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

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

だから、私は全体のASPのためにこれを一元化することにしました私は、コントローラ内部で以下のようにこれを使用しています、

internal class WindowsAzureStorageContext { 

    public static CloudStorageAccount StorageAccount { 

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

    public static TableServiceContext TableServiceCtx { 
     get { 

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

そして:.NET MVCアプリケーションと私は静的プロパティで以下のクラスを作成し

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クラスのインスタンスを取得することを検討します。

これは良い方法ですか?アプリケーションのライフサイクル全体で同じクラスを使用しているため、いつでも私を傷つけるでしょうか?

これを行うためのパターンはありますか?

答えて

1

私はそれを行う際に何の問題もありません。それを行うための素敵なきれいな方法のように見えます。私はこれを行うための既知のパターンを知らないが、昨日あるはずだと考えていた。

+0

ありがとうございます!私がこの質問をしたのは、 'static'キーワードの完全な機能ができないからです。もし私がこれをすると、私は問題に終わるだろうと思っていた。 – tugberk

0

私は、コンテキストのインスタンス間に共有状態はないと思います。これでコントローラが実行するためのトランザクション時間は簡単ではありません。あなたが文脈を握る時間が長くなればなるほど、紛争を起こす可能性が高くなります。コンフリクトやオーバーラップを最小限に抑える方法の1つは、負荷/変更/保存サイクルをできるだけ短く保つことです。

erick

関連する問題