我的工作单元实施会导致内存泄漏吗?

时间:2013-01-22 01:27:30

标签: entity-framework

我以下列方式实现了我的存储库模式和工作单元:

我被问到创建我的数据库的多个实例(这是工作单元)是否会导致内存泄漏?这种实施的缺点是什么?或者实施是否正确?

感谢。

1 个答案:

答案 0 :(得分:1)

您应该担心的是DbContext的创建,因为这很昂贵。 我通常每个请求使用一个DbContext,而不是在任何地方创建多个DbContext个实例。

我将它存储在HttpContext对象中,并在请求结束时将其丢弃。

您可以在here

上找到更多信息

在下面找到我修改过的实现。 (原文来自上面的链接并使用了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

    }
}

<httpModules>下的web.config中,我在下面添加。

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

这确保在每个请求之后调用end_Request,以便您可以正确地处理上下文。

当您需要使用DbContext时,如下所示。

 var Context = ContextManager.AsSingleton<MyDBContext>();