2011-09-21 34 views
3

我建立一個應用程序使用EF的語境中Singleton模式像會話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可以解釋我的更多細節?

+0

你只* *讀它是不好的做法?沒有解釋? –

回答

0

一個很好的初步實踐是使用一個DataContext每個工作 的單位有關於與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你可能節省的毫秒數10秒。微觀優化這個詞讓人想起 - 在這種情況下,你可能不應該使用實體框架。

擁有從未關閉的DataContext可讓您隨時隨地進行延遲加載。你可能已經離開你的服務,現在在你的控制器中,或者更糟的是你的視圖。從視圖訪問數據庫是要求性能問題,因爲我確信你沒有故意允許。這很可能是因爲你忘記加載所有你需要的數據來填充你的視圖。

+0

文章不再可用。 –

3

NHibernate不會將Session用作單例...這種情況僅適用於非常罕見的情況,其中您的應用程序非常短,代表單個事務/工作單元。

Here are described reasons爲什麼你不應該使用共享/長生存的上下文。如果多線程或服務器應用程序服務於多個客戶端,則不得使用共享上下文。

+0

NHibernate中的Singleton是什麼? SessionFactory? –

+0

看看我的方法,是否存在任何問題?我可以對Ninject在RequestScope中使用。 –

+0

是的,工廠可以用作單例,並在每次需要時創建一個新的會話。請求範圍通常用於Web應用程序場景中的上下文。 –

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

}