【问题标题】:Entity Framework Context in Singleton单例中的实体框架上下文
【发布时间】:2011-09-21 11:49:08
【问题描述】:

我正在构建一个在单例模式中使用 EF 上下文的应用程序,例如 NHibernate 与 Session 一起使用:

public class DbContextFactory
{
    private static volatile DbContextFactory _dbContextFactory;
    private static readonly object SyncRoot = new Object();
    public DbContext Context;

    public static DbContextFactory Instance
    {
        get
        {
            if (_dbContextFactory == null)
            {
                lock (SyncRoot)
                {
                    if (_dbContextFactory == null)
                        _dbContextFactory = new DbContextFactory();
                }
            }
            return _dbContextFactory;
        }
    }

    public DbContext GetOrCreateContext()
    {
        if (this.Context == null)
            this.Context = new DbContext(ConfigurationManager.AppSettings["DefaultConnectionString"]);

        return Context;
    }
}

我正在使用 Ninject 来注入上下文:

public class DbContextModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDbContext>().ToConstant(DbContextFactory.Instance.GetOrCreateContext());
    }
}

我正在阅读有关这种方法的信息,有些人说这是不好的做法,我会遇到问题。

谁知道这与 EF 可以更详细地解释我?

【问题讨论】:

  • 您是否阅读过这是不好的做法?不解释?

标签: c# .net entity-framework entity-framework-4 ninject


【解决方案1】:

NHibernate 不将 Session 用作单例...这种情况仅在极少数情况下有意义,即您的应用程序是非常短的批处理,代表单个事务/工作单元。

Here are described reasons 为什么你不应该使用共享/长寿上下文。如果多线程或服务器应用程序为多个客户端提供服务,则不得使用共享上下文。

【讨论】:

  • NHibernate 中的单例是什么?会话工厂?
  • 看看我的做法,有什么问题吗?我可以说 Ninject 在 RequestScope 中使用。
  • 是的,工厂可以用作单例并在每次需要时创建一个新会话。请求范围通常用于 Web 应用场景中的上下文。
  • 我很困惑,看看我的方法,我正在解决将 InRequestScope 放入 Ninject Configuration 的问题?
  • 我在您的代码中看不到任何请求范围,并且仍然在请求范围内使用您的单例工厂无法解决它,因为它每次都会返回相同的上下文实例。
【解决方案2】:

一个好的做法是在每个工作单元中使用一个数据上下文 要了解有关 EF 工作单元的更多信息,您应该阅读http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

共享相同的数据上下文时,您可能会节省几十毫秒。想到微优化这个词——在这种情况下,您可能不应该使用实体框架。

拥有一个从不关闭的 DataContext 可以让您随时延迟加载。你可能已经离开了你的服务,现在在你的控制器中,或者更糟糕的是,你的视图。从视图访问数据库会导致性能问题,因为我确定您没有故意允许这样做。这很可能是因为您忘记预先加载填充视图所需的所有数据。

【讨论】:

  • 文章不再可用。
【解决方案3】:

您阅读了这篇文章。 为什么不应该在实体框架中使用单例 DataContexts? http://www.britishdeveloper.co.uk/2011/03/dont-use-singleton-datacontexts-entity.html

【讨论】:

  • 请将文章的相关部分添加到您的答案中。这样,如果链接失败,您的答案仍然有意义。
【解决方案4】:
public class Dock
{
    // Statik field
    private static Dock _dock;
    // lock object
    private static object lockObject = new object();

    // We prevent the constructive method from being modeled with new by 
    //making it secret.
    private Dock()
    {

    }
    // Class in Instance
    public static Dock Instance()
    {   
        if (_dock == null)
        {
            lock (lockObject)
            {
                if (_dock == null)
                    _dock = new Dock();
            }
        }
        return _dock;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2022-01-20
    • 2011-07-06
    • 1970-01-01
    • 2017-09-17
    • 2012-12-08
    相关资源
    最近更新 更多