0

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

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

谢谢。

4

1 回答 1

1

您应该担心的是创建,DbContext因为这很昂贵。我通常DbContext每个请求都使用一个,而不是到处创建多个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 回答