リポジトリパターンと作業単位を次のように実装しました。
データベースの複数のインスタンス(作業単位)を作成するとメモリリークが発生するかどうかを尋ねられました。そして、そのような実装の欠点は何ですか?または、実装は正しく行われていますか?
ありがとう。
リポジトリパターンと作業単位を次のように実装しました。
データベースの複数のインスタンス(作業単位)を作成するとメモリリークが発生するかどうかを尋ねられました。そして、そのような実装の欠点は何ですか?または、実装は正しく行われていますか?
ありがとう。
あなたが心配しなければならないのは、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>();