我正在构建一个ASP.NET Web应用程序,其中我使用了几个包含静态函数的类来检索数据库值等(基于用户会话,因此它们的结果是特定于会话的,而不是应用程序范围的。)
也可以通过标记调用这些函数,这样可以快速轻松地开发GUI。
现在我想知道:这是正确的做事方式,还是创建一个包含这些函数的类并在需要时创建类的实例更好?
当这个网站有很多访问者时会发生什么?访问者是否必须等到功能准备就绪后才能使用#39;如果它也被另一个会话召唤?或者IIS会将工作负载分散到多个线程上吗?
或者这仅仅取决于个人偏好,而且应该测试什么效果最好?
编辑和补充问题:
我使用的代码如下:
public class HandyAdminStuff
{
public static string GetClientName(Guid clientId)
{
Client client = new ClientController().GetClientById(clientId);
return client.Name;
}
}
完成此功能后,是否会处理Client和ClientController类? GarbageCollector会处理它们吗?或者他们会继续生活吗?每次调用函数时都会增加内存量?
**请,我不需要像以下那样的答案:'测量而不是询问,我知道。我希望根据他们的经验,从能够给出一个好的答案的人那里获得反馈,或许是一些专业人士或缺点。谢谢。
答案 0 :(得分:1)
“访问者是否必须等到该功能'准备就绪',如果它也被另一个会话调用了?”
是。如果您具有线程安全功能体,或者在锁定DB的事务中执行某些数据库操作,则可能会发生这种情况。
看看这些主题:
答案 1 :(得分:1)
最好有基于实例的对象,因为它们也可以很容易处理(可能是连接?),除了提到的所有问题之外,你不必担心多线程问题。
例如,静态DAL层的每个函数都应该是原子的。也就是说,dal内部的调用之间不应该共享任何变量。 asp.net中常见的错误是认为 [TreadStatic] 数据在静态函数中使用是安全的。每个请求数据存储的唯一安全池是 Context.Items 池,其他一切都不安全。
编辑: 我忘了回答关于IIS线程的问题。客户的每个请求都将由不同的线程处理。只要您不使用会话状态,来自同一用户的并发请求也将由不同的线程同时处理。
答案 2 :(得分:0)
我不建议使用静态函数来检索数据。这是因为这些静态函数会使您的代码更难以测试,更难维护,并且无法利用任何oo主体进行设计。您最终会得到更多重复的代码等。