我通过以下方式实现了我的存储库模式和工作单元:
我被问到创建我的数据库的多个实例(这是工作单元)是否会导致内存泄漏?这种实施的缺点是什么?或者实施是否正确?
谢谢。
我通过以下方式实现了我的存储库模式和工作单元:
我被问到创建我的数据库的多个实例(这是工作单元)是否会导致内存泄漏?这种实施的缺点是什么?或者实施是否正确?
谢谢。
您应该担心的是创建,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>();