Example #1
0
        /// <summary>
        /// 注意:这个默认取的是EFDbContext,要用DapperDbContext请用GetDapperDbContext()
        /// 根据当前用户上下文来获取DbContext
        /// 在同一个实现了GrantRpcBaseServer的上下文RpcContext同一个类型的
        /// DBContext共享同一个,在Process方法返回之后将会被全部销毁,所以在同一个
        /// RpcBaseServer中是可以保证事物的
        /// </summary>
        /// <param name="newOne">是否新创建,不共享,在多线程相互隔离的上下文中使用</param>
        /// <typeparam name="TContext">tcontext</typeparam>
        /// <returns>IGrantDbContext</returns>
        public IGrantEFDbContext GetDbContext <TContext>(bool newOne = false)
            where TContext : DbContext
        {
            var key = typeof(TContext).FullName.ToLower();

            if (newOne)
            {
                lock (rootLock)
                {
                    key = Guid.NewGuid().ToString("N");
                    IGrantEFDbContext newOneValue = GrantDBContext.GetEFContext <TContext>(this);
                    // 这里不加 lock 放入是为了回收,不用关心脏不脏 , 如果丢了, 则不能手工回收调用Dispose, 只能靠系统自动回收
                    dbContexts.Add(key, newOneValue);
                    return(newOneValue);
                }
            }

            if (dbContexts.ContainsKey(key))
            {
                return(dbContexts[key]);
            }
            else
            {
                lock (rootLock)
                {
                    // 再检查一次,防止同时进入 else
                    if (dbContexts.ContainsKey(key))
                    {
                        return(dbContexts[key]);
                    }

                    var dbctx = GrantDBContext.GetEFContext <TContext>(this);
                    dbContexts.Add(key, dbctx);
                    return(dbctx);
                }
            }
        }
Example #2
0
 /// <summary>
 /// 获取Dapper的DbContext
 /// 之所以要引入DapperDbContext是为了保持和EF在语法结构上的一致性,对上层开发人员不至于变化太大
 /// </summary>
 /// <typeparam name="TContext">TContext</typeparam>
 /// <returns>IGrantDapperDbContext</returns>
 public IGrantDapperDbContext GetDapperDbContext <TContext>()
 {
     // Dapper的DbContext不需要换成,只是一个空壳引用,没有任何性能问题,唯一的数据库连接使用连接池
     return(GrantDBContext.GetDapperContext(this, typeof(TContext).Name));
 }