用于管理Session对象中数据的推荐模式

时间:2010-11-19 21:14:24

标签: .net design-patterns

我需要在Session对象中存储一个“POCO”类。在存储和性能方面,您会推荐哪种模式? (我知道模式2需要序列化)。谢谢。

模式1(简化):

class Location {
    string Country { get { return Session["Country"]; } set { Session["Country]" = value };
    string City { get { return Session["City"]; } set { Session["City]" = value };
}

模式2(简化):

class Location {
    string Country { get; set; }
    string City { get; set; }
}

Session.Add("Location", new Location() { ... } );

5 个答案:

答案 0 :(得分:2)

如果你绝对,肯定必须使用会话状态,那么我会投票给模式2.它会发生更多的事情。

但我确实希望能完全使用会话状态。您可以在页面上放置一些内容,例如ID或者在响应回来时查找的内容吗?原因如下:

  • 会话状态在Web场中具有挑战性。你现在可能没有,但......
  • 会话过期,如果页面“稍后”返回,则必须处理该页面。
  • 会话会为您可能再也看不到的访问者消耗服务器上的资源。

那么,也许你可以序列化到viewstate?

答案 1 :(得分:2)

性能将(如你所注意)在模式1中更好。但是,你现在对于拥有一个会话有一个巨大的依赖 - 如果这个类永远要在一个会话的上下文之外使用Web应用程序,那么你将不得不改变它。

答案 2 :(得分:1)

我选择模式2只是因为它更干净。向Location对象添加新项不会改变整个代码中对Session.Add(objLocation)的所有调用。

如果性能是一个严重的问题,那么序列化开销可能是一个问题,但我的经验是内存便宜,而大修不是。所以我选择了模式#2。

答案 3 :(得分:1)

模式1对于性能更好,但是如Harper Shelby指出的那样,会对Session对象产生很大的依赖性。

最小化该依赖性的一种方法是创建用于存储和检索会话对象的接口。您对接口的“真实”实现将根据需要调用会话。可以通过依赖注入将此接口实现提供给您的类。接下来,您可以为单元测试注入“假”实现 - 无需在那里使用真实会话。

答案 4 :(得分:1)

我使用模式2.我只在会话中存储一个对象,我巧妙地称之为SessionData。我尽量保持尽可能小 - 几乎每个请求都会使用这个对象的每个成员。如果我需要一些额外的数据用于特定任务(比如购物车),我有一个通用插槽,我可以将它添加到我的对象。当我完成额外数据后,我将其从SessionData对象中删除,以避免不必要的序列化。

使用单个对象意味着我只需要为每个请求访问一次Session。虽然请求像Session["City"]这样的单个简单项目比获取我相对较大的对象要快,但因为无论如何我需要整个事情,我怀疑我拨打的单个电话会更快打到十几个或更多的个人电话。 Seession。

另外,如果我更改了会话管理小工具,我只有两个地方可以更改我的代码(获取和添加功能)