EF中DbContext的生命周期


/// <summary>
/// 依賴注入系統中類的生命周期。
/// </summary>
public enum DependencyLifeStyle
{
    /// <summary>
    /// 單例模式。
    /// 第一次解析是創建一個實例,后續解析都使用第一次創建的實例。
    /// </summary>
    Singleton,

    /// <summary>
    /// 范圍內唯一模式。
    /// 同一請求周期內,第一次解析是創建一個實例,后續解析都使用第一次創建的實例。
    /// 不同線程 實例不同。
    /// </summary>
    Scoped,

    /// <summary>
    /// 瞬態對象。每次解析都創建一個對象。
    /// </summary>
    Transient
}

完成EF上下文對象的創建,保證在一次請求內只創建一次。保證線程內唯一。
(在asp.net中,EF上下文容器。如果只要有一個,則每次一個用戶訪問,添加一些實體,然后又不會自動銷毀,就會造成內存爆炸。
如果每次創建一個,則就出現一個實例調用混亂。在asp.net中,保證一個線程(一次http請求及一個管道事件),一個EF上下文容器就剛剛好,解決上面問題。)

[MethodImpl(MethodImplOptions.Synchronized)]
public static XFKDB.XFKDB GetDBContext()
{
    var dbContext = CallContext.GetData("dbContext") as XFKDB.XFKDB;//線程內唯一的。
    if (dbContext == null)
    {
        dbContext = new XFKDB.XFKDB();
        CallContext.SetData("dbContext", dbContext);
    }
    return dbContext;
}

另一種方式:
[MethodImpl(MethodImplOptions.Synchronized)]
public static XFKDB.XFKDB GetDBContext()
{

    var dbContext = NLite.Threading.Local.Get(DbKey) as XFKDB.XFKDB;
    if (dbContext == null || dbContext.IsDisposed)
    {
        dbContext = new XFKDB.XFKDB("constring");
        NLite.Threading.Local.Set(DbKey, dbContext);
    }
    
    return dbContext;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM