Files
Yi.Admin/CC.Yi.DAL/DbContentFactory.cs

44 lines
1.8 KiB
C#
Raw Normal View History

2021-03-20 14:12:24 +08:00
using CC.Yi.Model;
using Microsoft.EntityFrameworkCore;
using System.Collections.Concurrent;
using System.Threading;
namespace CC.Yi.DAL
{
public class DbContentFactory
{
2021-03-20 21:56:15 +08:00
private static DataContext Webcontext;
public static void Initialize(DataContext webContext)
2021-03-20 14:12:24 +08:00
{
Webcontext = webContext;
}
public static DataContext GetCurrentDbContent()
{
2021-03-20 21:56:15 +08:00
//return new DataModelContainer();
//一次请求共用一个上下文实例
//每一次http请求都会开启一个新的线程保证在一个线程中,DbContext是唯一的
//CallContext是线程内部唯一的数据槽一块内存空间/容器),相当于一个键值对数据容器通过key获取value了,需要引入System.Runtime.Remoting.Messaging;命名空间
DataContext db = CallContext.GetData("DbContext") as DataContext;
//从 CallContext 中检索具有指定key“DbContext”的对象并强转为DbContext
if (db == null)//线程在数据槽里面没有此上下文
{
db = Webcontext;
CallContext.SetData("DbContext", db);//放到数据槽中去,DbContext是keydb是value
}
return db;
2021-03-20 14:12:24 +08:00
}
2021-03-20 21:56:15 +08:00
private static class CallContext
{
static ConcurrentDictionary<string, AsyncLocal<object>> state = new ConcurrentDictionary<string, AsyncLocal<object>>();
2021-03-20 14:12:24 +08:00
2021-03-20 21:56:15 +08:00
public static void SetData(string name, object data) =>
state.GetOrAdd(name, _ => new AsyncLocal<object>()).Value = data;
2021-03-20 14:12:24 +08:00
2021-03-20 21:56:15 +08:00
public static object GetData(string name) =>
state.TryGetValue(name, out AsyncLocal<object> data) ? data.Value : null;
}
2021-03-20 14:12:24 +08:00
}
}