Singleton中的entity framework上下文

我正在构建一个在单例模式中使用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().ToConstant(DbContextFactory.Instance.GetOrCreateContext()); } } 

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

有人知道EF的这个可以解释一下我的更多细节吗?

NHibernate不使用Session作为单例…这种情况仅在非常罕见的情况下意味着您的应用程序是非常短的批处理代表单个事务/工作单元。

这里描述了为什么不应该使用共享/长生活环境的原因。 如果multithreading或服务器应用程序为多个客户端提供服务,则不得使用共享上下文。

一个好的实践是每个工作单元使用一个datacontext要获得有关EF工作单元的更多信息,您应该阅读http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository -and-单元的功图案与-entity framework-4-0.aspx

共享相同的datacontext时,您可能会节省几十毫秒。 微观优化这个词让人想起 – 在这种情况下,您可能不应该使用entity framework。

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

你读过这篇文章。 为什么不应该在Entity Framework中使用单例DataContexts? http://www.britishdeveloper.co.uk/2011/03/dont-use-singleton-datacontexts-entity.html

 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; } 

}