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