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