单例中的Entity Framework上下文

3

我正在构建一个应用程序,使用EF的上下文以单例模式工作,就像NHibernate使用会话一样:

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的人能否详细解释一下呢?


你只是看到这是不好的做法了吗?没有解释吗? - Gert Arnold
4个回答

3
NHibernate不使用Session作为单例模式……这种情况只在你的应用程序非常短暂,代表单个事务/工作单元的极少数情况下才有意义。 这里描述了不使用共享/长期存活上下文的原因。在多线程或为多个客户提供服务的服务器应用程序中,不能使用共享上下文。

NHibernate中的Singleton是什么?SessionFactory又是什么? - Acaz Souza
看看我的方法,有什么问题吗?我可以告诉Ninject在RequestScope中使用。 - Acaz Souza
是的,工厂可以作为单例使用,并在每次需要时创建新的会话。请求范围通常用于Web应用程序场景中的上下文。 - Ladislav Mrnka
我有些困惑,看看我的方法,我正在解决将InRequestScope放入Ninject配置中的问题? - Acaz Souza
请问,您能否使用请求范围内的上下文来修复我的代码?或者有一些示例代码吗?谢谢,我将非常感激。 - Acaz Souza
显示剩余2条评论

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

}


0

10
请在您的回答中添加文章的相关部分。这样,如果链接失效,您的回答仍然有意义。 - Onots

0

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

当共享相同的数据上下文时,您可能会节省几十毫秒。这让人想起微观优化——在这种情况下,您可能不应该使用Entity Framework。

拥有一个从未关闭的DataContext允许您随时进行延迟加载。您可能已经离开了Service,现在在Controller中或者更糟糕的是,在View中。从View访问数据库会导致性能问题,我相信您并没有故意这样做。这很可能是因为您忘记了急切地加载所有需要填充视图的数据。


文章已不再可用。 - Pétur Ingi Egilsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接