从业务逻辑中删除ASP.net会话调用

时间:2011-02-04 10:36:33

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

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我在某些项目上做过类似的事情:

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"]; }
    }
}

答案 2 :(得分:-1)

业务层通过Session获得了哪些业务?为了更多地理解这个陈述,可以这样考虑:为什么业务层需要持久保存用户相关信息?

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

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