3

私が尋ねる理由は、特定の ORM テクノロジに関連する依存関係をリポジトリに注入する必要なく、リポジトリが透過的にアクセスできるように、コレクションがなどのオブジェクトHttpContext.Current.Itemsを配置するのに適しているように思われるためです。これにより、リポジトリは、実際に変更を永続化するという追加の責任を負うか、引き受けるかを決定できます。IDisposableDataContextUnitOfWork

例えば:

ページ:

protected void Page_Load(...)
{
   Items[KeyValueFromConfigurationFile] = new DataContext();
   var repo = new Repository();
   var rootEntity = repo.GetById(1);
}

リポジトリ:

public virtual TEntity GetById(int id)
{
   var ctx = HttpContext.Current.Items[KeyValueFromConfigurationFile] as DataContext;
   return ctx.TEntities.SingleOrDefault(p => p.Id == id);
}

もちろん、null をチェックし、コレクションDataContextで利用できない場合は取得するために必要な手順を実行します。HttpContext.Current.Items

したがって、上記のコードが与えられた元の質問に戻りますHttpContext.Current例外がスローされた場合でも、Items コレクションに含まれるオブジェクトと一緒に破棄されますか?

4

2 に答える 2

13

HttpContext.Current.Items内のオブジェクトは自動的に破棄されません。これは自分で処理する必要があります。これは、global.asaxApplication_EndRequestで実行できます。

            foreach (var item in HttpContext.Current.Items.Values)
            {
                var disposableItem = item as IDisposable;

                if (disposableItem != null)
                {
                    disposableItem.Dispose();
                }
            }
于 2011-02-07T16:37:58.347 に答える
2

基になるコレクションが変更されていないため、解決策を提供する最後の投稿に問題があるとは思いませんでした。これは、列挙されている間は実行できませんが、最近、このコードで散発的なエラーに遭遇しました. 「コレクションが変更されました。」というエラーが表示されました。OnEndRequest が発生し、以下の for ループを実行すると、列挙操作が実行されない場合があります。

        foreach (var item in HttpContext.Current.Items.Values)
        {
            var disposableItem = item as IDisposable;

            if (disposableItem != null)
            {
                disposableItem.Dispose();
            }
        }

そのため、foreach ループを使用してコレクションを反復処理しているときに、現在の HttpContext アイテムを明らかに破棄すると、問題が発生する可能性があります。これにはいくつかの方法がありますが、私は次の方法で行うことにしました。

        int size = HttpContext.Current.Items.Count;
        if (size > 0)
        {
            var keys = new object[size];
            HttpContext.Current.Items.Keys.CopyTo(keys, 0);

            for (int i = 0; i < size; i++)
            {
                var obj = HttpContext.Current.Items[keys[i]] as IDisposable;
                if (obj != null)
                    obj.Dispose();
            }
        }
于 2013-09-25T17:41:28.107 に答える