2012-02-21 33 views
1

我用下面,static class访问数据方面在我的应用关于如何访问我的DataContext(不论它是错的)

public static class DataContext 
{ 
    internal const string _contextDataKey = "dataContext"; 

    /// <summary> 
    /// Returns a unique data context that lives for the duration of the request, which can be from ASP.NET or a WCF service 
    /// </summary> 
    /// <returns>The entity data model context for the current request</returns> 
    public static EntityDataModelContext GetDataContext() 
    { 
     IPersistanceContainer state; 

     if (HttpContext.Current != null) 
     { 
      state = new AspNetPersistanceContainer(); 
     } 
     else if (OperationContext.Current != null) 
     { 
      state = new WcfPersistanceContainer(); 
     } 
     else 
     { 
      state = new StaticPersistanceContainer(); // this container is thread-unsafe. 
     } 

     EntityDataModelContext edm = state.Get<EntityDataModelContext>(_contextDataKey); 
     if (edm == null) 
     { 
      edm = new EntityDataModelContext(); 
      state.Store(_contextDataKey, edm); 
     } 

     return edm; 
    } 
} 

忘掉其他容器,这是WCFConsole应用简单-tests分别,这里的ASP.NET容器:

internal class AspNetPersistanceContainer : IPersistanceContainer 
{ 
    public T Get<T>(string key) where T : class 
    { 
     if (HttpContext.Current.Items.Contains(key)) 
      return (T)HttpContext.Current.Items[key]; 

     return null; 
    } 

    public void Store(string key, object value) 
    { 
     HttpContext.Current.Items[key] = value; 
    } 
} 

当我需要访问context我只是援引DataContext.GetDataContext(),做我的DB-访问,我甲肾上腺素ver添加任何using声明。

如果我添加一条using语句,context适合一次性使用,下次尝试使用它时,它将被处置。引发异常。

如果我不这样做,就像现在一样,这让我有点不高兴,我觉得这样做不是正确的做法,不处理它。

所以我想知道在这里做什么是正确的事情。

这个设计是否有缺陷,我应该放弃它吗?

我应该想出一种方法来重新创建上下文吗?

我应该只是离开设计,这很好吗?

也许设计是“足够好”,有没有任何书你会推荐我阅读这个主题?我觉得我在后端架构方面的技能很缺乏。

回答

0

在一个asp.net应用的一个解决方案可以是这样的:

  1. 创建上下文时的请求开始
  2. 当请求结束

Here的制品废弃它讨论这种方法(对于NHibernate会话管理,但对EF几乎相同)

相关问题