【问题标题】:Removing ASP.net Session calls from business logic从业务逻辑中删除 ASP.net 会话调用
【发布时间】:2011-06-21 06:53:04
【问题描述】:

我继承了一个 asp.net Web 解决方案,它具有作为单独程序集的业务逻辑和数据调用。在业务层中有少量调用来获取/设置 HttpContext 会话值。我环顾四周寻找一个示例,该示例可以让我将其从业务逻辑中抽象出来,因为我希望能够在非 Web 项目中重用这些程序集,谁能给我一个最佳方法的示例做这个。我正在考虑某种会话工厂,它将根据使用场景从某种持久存储中获取值,但我真的是架构新手,希望能得到一两个指针。

【问题讨论】:

  • 会话状态中存储的值是什么样的?
  • 现在只是一个复杂类型,包含用户详细信息及其数据权限作为 Guid 列表。

标签: asp.net architecture business-logic separation-of-concerns


【解决方案1】:

我认为最简单的方法是创建一个ISessionProvider 接口,并带有Dictionary<string, object> {get; }。然后创建一个返回实际会话包内容的public class HttpSessionProvider : ISessionProvider

至少,在您的 Web 应用程序中实例化此对象并将其提供给后端类,方法是手动指定它或使用任何 IOC 模式。

[编辑]经过一个小小的反思,这不是一个干净的方式。您不会依赖于 asp.net 框架,但您仍然可以访问会话的“asp.net”内容。 在这种情况下,保留接口,但要么添加特定属性(字符串 customer、int userID 等),要么返回仅包含实际业务数据的字典

【讨论】:

    【解决方案2】:

    我在一些项目上做过这样的事情:

    public interface IAppContext {
        string SomeVariable {
            set;
            get;
        }
    }
    public class HttpContextAppContext : IAppContext {
    
        public static readonly string CONTEXT_PREFIX = "appcontext_";
    
        public string SomeVariable {
            set { HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"] = value; }
            get { return (string)HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"]; }
        }
    }
    

    【讨论】:

      【解决方案3】:

      业务层通过 Session 获得了什么业务?为了更深入地理解这句话,可以这样想:为什么业务层需要保存与用户相关的信息?

      业务层需要处理处理用户相关数据,而不是存储它。这意味着应该注入当前存储的数据,即它应该作为参数传递给需要它的函数。这样做是在形成一个架构合同,它以一种非常明确的方式说“嘿,我需要用户信息来完成我的工作”——你并没有在幕后使用一些随机的先前存储的值来执行一些魔法。业务层可以使用该数据以某种方式对用户进行身份验证或授权,但它应该在完成验证结果后丢弃它们。如果这些值被持久保存以将一两个调用保存到数据库,那么您的数据库调用效率就会出现问题,因为数据库调用这样简单的事情很快。

      所以我的建议是从您的业务层中删除任何对 Session 的引用,并更改您的函数签名以包含您需要传递的用户数据。

      【讨论】:

      • 经过反思,您是对的,我不想将值存储在该层中,我只是希望该层能够使用当前保存在 Session 中的数据。在这种情况下,存储在 Session 中的 Guid 列表直接反映在数据库中,因此如果需要,我可以从那里检索它。我想我真正想要的是将对该数据的请求移交给第 3 方(会话工厂),它将从最合适的位置返回列表,我认为如果从 UI 和数据库调用 Session不是。
      • 太棒了...我不反对在有理由的情况下投反对票,但我希望从投反对票的人那里得到教育,了解我的错误。我不会错过 2 个代表点,这只是一个原则问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多