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

posted @ 2019-12-18 17:50  skybirdzw  阅读(1792)  评论(0编辑  收藏  举报