C# 如何保存会话BLL';s变量?

C# 如何保存会话BLL';s变量?,c#,asp.net,session,C#,Asp.net,Session,我写了一个asp.net网站。 我有一个BLL项目(意思是dll类型的项目) 在其中,我想为会话保存一些静态数据 我怎样才能做到?如果我将它们声明为静态,那么应用程序的它们将是静态的。 有没有办法避免将它们保存在asp.net会话字典中(我不想给网站增加负担,毕竟它在BLL中) TIA您可以使用HttpContext.Current.Session属性。您可以使用HttpContext.Current.Session属性。会话是存储此数据的正确位置 要在BLL中使用它,您可以从会话中抽象并创建某

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

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


TIA

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

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

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

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


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

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

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


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

这里有一篇不错的文章:

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

设计会话对象模型时,避免存储对象类型 在会议上。相反,只在会话中存储基元类型 字典并在每个数据库上重建业务层会话对象 基于会话数据的请求。这避免了使用 二进制格式化程序


这里有一篇不错的文章:

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

设计会话对象模型时,避免存储对象类型 在会议上。相反,只在会话中存储基元类型 字典并在每个数据库上重建业务层会话对象 基于会话数据的请求。这避免了使用 二进制格式化程序


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

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 );

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

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 );

如何重构BLL,使您可以在每个用户会话中创建某个业务入口对象(业务外观)的一个实例

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


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

如何重构您的BLL,使您可以为每个用户会话创建某个业务条目对象(业务外观)的一个实例

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


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

+1但是,我建议避免直接引用业务层中的System.Web assembly。使用自定义抽象(如UserStore)是一个更好的主意。是的,我同意,我只是添加了一些关于抽象库的内容。+1,但是,我建议避免直接引用业务层中的System.Web assembly。使用自定义抽象(如UserStore)是一个更好的主意。是的,我同意,我只是添加了一些关于抽象库的内容。