【问题标题】:How to access Session values from layers beneath the web application layer如何从 Web 应用程序层下的层访问 Session 值
【发布时间】:2011-02-11 17:51:54
【问题描述】:

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

我很难相信我们是第一批遇到此类问题的人。您如何在应用程序中处理此问题?

【问题讨论】:

  • 8 年有多么不同。如今,将任何会话需求封装在一个接口中并在适当的地方使用您的 DI 容器注入它是非常容易的。

标签: asp.net session separation-of-concerns


【解决方案1】:

我认为让您的业务类依赖于全局对象并不是一个好主意,并且会尽可能避免使用它。您应该向它们注入必要的信息 - 这使它们更具可测试性和可扩展性。

因此,与其将Session 对象直接传递给它们,不如将所需的信息访问方法封装到存储库类中。您的业​​务层可以使用存储库类作为数据源(例如,对其调用 GetUser()),并且您的 Web 应用程序的存储库可以使用会话来检索请求的信息(返回 _session.User.Identity)。

将其移植到 winforms 时,只需使用新的以 winform 为中心的类实现存储库接口(即GetUser() 返回用户主体的 windows 版本)。

【讨论】:

    【解决方案2】:

    理论上人们会告诉你这是一种糟糕的商业行为。 在实践中,我们只需要业务层中始终可用的会话级别的数据。 :-(

    我们最终将不同的存储引擎统一在一个小界面下。

    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;
    

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

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

     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 中,FormsApp 会这样做

     Framework.Storage.SessionStorage = new WebFormsSessionStorage(); 
    

    【讨论】:

      【解决方案3】:

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

      如果你想做一个半途而废的作弊(但不是太多的作弊),你可以做的是创建一个非常小的程序集,只有一对 POCO classes 来存储你想要分享的所有这些信息跨所有层(当前登录的用户名、登录时间等),只需将此对象从您的前端传递到您的业务/数据层。现在,如果你这样做,你必须避免将这个 POCO 程序集变成一个通用实用程序程序集的诱惑——它必须保持很小,否则你将来会遇到问题(相信我,或者学习困难的方法,或者请其他人详细说明这一点一)。但是,如果你有这个 POCO 程序集,通过各个层注入这些数据变得非常容易,而且由于它是 POCO,它的序列化非常好,并且可以很好地与 Web 服务、WCF 等配合使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2011-03-12
        • 2011-06-14
        • 2018-12-28
        • 2011-01-21
        相关资源
        最近更新 更多