如何保存Session BLL的变量?

时间:2011-09-20 06:32:44

标签: c# asp.net session

我写了一个asp.net网站。 我有一个BLL项目(意思是dll类型的项目) 我希望将一些数据保存为会话的静态数据。

我该怎么办?如果我将它们声明为静态,那么它们对于应用程序将是静态的。 有没有办法避免在asp.net会话字典中保存它们(我不想给网站带来负担,毕竟它在BLL中)。

TIA

5 个答案:

答案 0 :(得分:2)

会话是存储此数据的正确位置。

要在BLL中使用它,您可以从会话中抽象并创建某种类型的UserStore,从而隐藏实现。这可以通过DI注入,可能使用IoC容器。

更简单的方法是在构造BLL对象或调用方法时传入对当前HttpContext或会话的引用。理想情况下,您可以使用abstractions库来保持其可测试性。

答案 1 :(得分:1)

您可以使用HttpContext.Current.Session属性。

答案 2 :(得分:1)

为什么不创建业务对象来保存该数据并分配给会话?

public class UserSettings 
{
    public string Name { get; set; }
    public string Company { get; set; }
    public int UserId { get; set; }
    public int CompanyId { get; set; }
}

// Assign
HttpContext.Current.Session["UserSettings"] = 
    new UserSettings() {
        UserName = "Bruno Alexandre",
        UserId = 123,
        Company = "StackOverflow Inc.",
        CompanyId = 321
    };

// retrieval: check for nulls
UserSettings userSettings = 
    HttpContext.Current.Session["UserSettings"] == null ? null : (UserSettings)HttpContext.Current.Session["UserSettings"];

...

Save( DateTime.UtcNow, userSettings.UserId );

答案 3 :(得分:1)

如何以某种方式重构BLL,您可以为每个用户会话创建一个业务入口对象(业务外观)的一个实例吗?

使用这种方法,您不需要静态数据。您可以将数据保存在类字段/属性中。

您将在ASP.NET会话中为每个会话存储一个实例,而您的BLL根本不知道会话。

答案 4 :(得分:0)

这是一篇不错的文章:Fast, Scalable, and Secure Session State Management for Your Web Applications

优化序列化(来自上面链接的文章)

...

  

设计会话对象模型时,请避免存储对象类型   在会议中。相反,只在会话中存储基元类型   字典并在每个上重建业务层会话对象   请求基于会话数据。这避免了使用的开销   的BinaryFormatter。

...