public static T GetBContext() { T _logdata = CallContext.GetData("DBContext") as T; if (_logdata == null) { _logdata = new T(); CallContext.SetData("DBContext", _logdata); } return _logdata; }
protected static TObjectContext ObjectContext { get { // We are in a web app, use a request scope if (HttpContext.Current != null) { string key = "____" + typeof(TObjectContext).Name; TObjectContext _objectContext = (TObjectContext)HttpContext.Current.Items[key]; if (_objectContext == null) { _objectContext = Activator.CreateInstance<TObjectContext>(); HttpContext.Current.Items.Add(key, _objectContext); } return _objectContext; } else { //If this is not a web app then just create a datacontext //which will have the same lifespan as the app itself //This is only really to support unit tests and should not //be used in any production code. A better way to use this //code with unit tests is to mock the HttpContext if (_objectContext == null) { _objectContext = Activator.CreateInstance<TObjectContext>(); } return _objectContext; } } }
如以上的代码..两种初始化的方式,有何区别?
为什么要这么做?求解...
CallContext 如果有异步情况,异步的线程取到的DBContext就是新new出来的,异步数据不会传递,意味着2个线程拿到的db是都新的,没关系。
HttpContext.Current异步传递数据的。意味着2个线程拿到的是同一个DBContext对象
CallContext 可以使用 ILogicalThreadAffinative方式达到跨线程传递数据的要求
4.6以后可以使用AsyncLocal
第一个就是个绑定在T上面的单例
第二个看着像全局的单例
感觉..你这解释有点牵强
@GuZhenYin: 那我只能猜了
第一个看着像泛型,我猜每个类都是使用自己数据上下文
第二个就是全局单例,全局公用一个数据上下文
@刘宏玺: 没 第一个是每个类的上下文都从CallContext中去取..有就直接用 没有就new一个
网上解释是保证线程内的上下文唯一..但是..我需要...详细的解释...
2种没什么区别
只不过第一种把单例封装了
第二种分别处理了 请求单例和 线程单例
第一种只是一个单例,第二种是线程安全的。具体参考:http://www.cnblogs.com/fish-li/archive/2013/04/06/3002940.html