代码之家  ›  专栏  ›  技术社区  ›  Matthew Vines

如何从Web应用程序层下面的层访问会话值

  •  1
  • Matthew Vines  · 技术社区  · 16 年前

    我们的应用程序中有许多实例,我们希望能够访问业务域和数据访问层中当前登录的用户ID等内容。在日志中,我们将这些信息推送到会话中,因此所有前端代码都可以很容易地访问它。但是,我们在获取应用程序较低层的数据时遇到了巨大的问题。我们似乎找不到一种方法来存储业务域中的值,该业务域仅为用户提供全局范围(静态类和属性当然由应用程序域共享,这意味着会话中的所有用户只共享对象的一个副本)。我们已经考虑将会话传递给我们的业务类,但是我们的域与我们的Web应用程序紧密耦合。我们想让WinForms版本的应用程序的前景继续下去。

    我觉得很难相信我们是第一个有这种问题的人。您如何在应用程序中处理这个问题?

    3 回复  |  直到 15 年前
        1
  •  3
  •   womp    16 年前

    我不认为让您的业务类依赖于一个全局对象是一个很好的想法,如果可能的话可以避免它。你 应该 向它们注入必要的信息——这使得它们更具可测试性和可扩展性。

    所以与其通过 Session 对象,您应该将所需的信息访问方法打包到一个存储库类中。您的业务层可以使用存储库类作为数据源(调用 GetUser() 例如,在它上面,Web应用程序的存储库可以使用会话来检索请求的信息(返回 _session.User.Identity )

    将其移植到WinForms时,只需使用新的以WinForm为中心的类(即 GETUSER() 返回用户主体的Windows版本)。

        2
  •  1
  •   Radu094    16 年前

    理论上,人们会告诉你这是一种糟糕的商业行为。 实际上,我们一直都需要业务层中可用的会话级别的数据。:

    我们最终在一个小界面下结合了不同的存储引擎。

    public interface ISessionStorage 
    {
       SomeSessionData Data {get;set;}
       ...
       .. and most of the data we need stored at "session" level
        }
     //and a singleton to access it
        public static ISessionStorage ISessionStorage;
    

    这个接口几乎在我们的代码中的任何地方都可用。

    然后我们有一个会话和/或一个单例实现

     public WebSessionStorage
    {
       public SomeSessionData Data 
      {
           get { return HttpContext.Current.Session["somekey"] as SomeSessionData;}
          set { HttpContext.Current.Session["somekey"] = value;}
      }
    
    public WebFormsSessionStorage
    {
       private static SomeSessionData  _SomeSessionData; //this was before automatic get;set;
       public SomeSessionData 
       {
           get{ return _SomeSessionData;}
           set{ _SomeSessionData=value; }
    }
    

    }

    在启动应用程序时,网站将执行

     Framework.Storage.SessionStorage = new WebSessionStorage(); 
    

    在global.asax中,表单SAP将

     Framework.Storage.SessionStorage = new WebFormsSessionStorage(); 
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    我完全同意Womp—将数据从前端向下注入到较低的层中。

    如果你想做一个中途作弊(但不要做太多的作弊),你可以做的是用一对夫妇创建一个非常小的程序集。 POCO classes 要存储您希望在所有层(当前登录的用户名、登录时间等)共享的所有信息,只需将此对象从前端传递到您的biz/data层。现在,如果你这样做,你必须避免诱惑,把这个POCO大会变成一个通用的大会-它必须保持小,否则你将有问题在未来(相信我或学习硬的方式,或请别人详细说明这一点)。但是,如果您有这个POCO程序集,通过不同的层注入数据变得非常容易,而且由于它是POCO,所以它可以很好地序列化,并且可以很好地与Web服务、WCF等配合使用。