0

リポジトリパターンと作業単位を次のように実装しました。

データベースの複数のインスタンス(作業単位)を作成するとメモリリークが発生するかどうかを尋ねられました。そして、そのような実装の欠点は何ですか?または、実装は正しく行われていますか?

ありがとう。

4

1 に答える 1

1

あなたが心配しなければならないのは、DbContextこれは高価なので、の作成です。私は通常、どこにでも複数のインスタンスDbContextを作成するのではなく、リクエストごとに1つを使用します。DbContext

オブジェクトに保存しHttpContext、リクエストの最後に破棄します。

あなたはそれについてのより多くの情報をここで見つけることができます

私の変更した実装を以下に示します。(元は上記のリンクからのもので、ObjectContextを使用していました)。

私のコンテキストクラス

using System.Data.Entity;
using System.Data.Objects;
using System.Web;
using Fot.Admin.Models;

namespace Context
{
    public static class ContextManager
    {
        internal const string DB = "MY_DB_CONTEXT";

        /// <summary>
        /// Get an instance that lives for the life time of the request per user and automatically disposes.
        /// </summary>
        /// <returns>Model</returns>  
        public static T AsSingleton<T>() where T : DbContext, new()
        {
            HttpContext.Current.Items[DB] = (T)HttpContext.Current.Items[DB] ?? new T();
            return (T)HttpContext.Current.Items[DB];
        }


    }
}

私のコンテキストモジュール

using System;
using System.Data.Entity;
using System.Data.Objects;
using System.Web;

namespace Context
{
    /// <summary>
    /// Entity Module used to control an Entities DB Context over the lifetime of a request per user.
    /// </summary>
    public class ContextModule : IHttpModule
    {
        private const string DB = ContextManager.DB;


        void context_EndRequest(object sender, EventArgs e)
        {
            Dispose();
        }


        #region IHttpModule Members

        public void Dispose()
        {
            if(HttpContext.Current != null)
            {
                if (HttpContext.Current.Items[DB] != null)
                {
                    var entitiesContext = (DbContext) HttpContext.Current.Items[DB];

                    entitiesContext.Dispose();
                    HttpContext.Current.Items.Remove(DB);

                }

            }
        }

        public void Init(HttpApplication context)
        {
            context.EndRequest += new EventHandler(context_EndRequest); 
        }

        #endregion

    }
}

私のweb.configで<httpModules>、これを以下に追加します。

<add name="ContextModule" type="Context.ContextModule" />

これにより、すべてのリクエストの後にend_Requestが呼び出されるため、コンテキストを適切に破棄できます。

DbContextが必要な場合の使用法は以下のとおりです。

 var Context = ContextManager.AsSingleton<MyDBContext>();
于 2013-01-22T01:31:48.993 に答える