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

  • 相关阅读:
    【秋招必备】Redis面试题(2021最新版)
    【秋招必备】Spring Boot面试题(2021最新版)
    【秋招必备】Java基础知识面试题(2021最新版)
    用友二面:如何设计一个高可用、高并发秒杀系统
    万字长文,带你深入理解Java虚拟机!
    小米面试官:说说Spring源码里面的Bean的生命周期!
    苏宁易购三面:写一个脚本获取Linux系统CPU的详细信息,并说出原理!
    易错点。
    APP间传递消息
    KVC, KVO
  • 原文地址:https://www.cnblogs.com/zhaow/p/12061181.html
Copyright © 2020-2023  润新知