我需要在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() { ... } );
答案 0 :(得分:2)
如果你绝对,肯定必须使用会话状态,那么我会投票给模式2.它会发生更多的事情。
但我确实希望能完全使用会话状态。您可以在页面上放置一些内容,例如ID或者在响应回来时查找的内容吗?原因如下:
那么,也许你可以序列化到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。
另外,如果我更改了会话管理小工具,我只有两个地方可以更改我的代码(获取和添加功能)