[英]Life of a Static class in ASP.Net
在我的UI层中,我将一些时区信息存储在会话状态中。
现在,我需要访问服务/业务/数据层中的时区。
在我的UI层中,我向下传递已登录用户的UserID,并且数据库中存储了该用户的时区信息。 我希望不要将时区与用户ID一起传递。
时区仅在时间很重要的几个电话上使用。 (有一个项目开始了,今天有人休假。等)。
我在想可能有一个静态类,该类在所有层(服务/业务/数据)上均被引用,该类具有用于时区信息的字段。 我希望它是静态的,以便我可以引用它:
var CurrentDate = CommonClass.GetLocatDateTime(_userId);
那可能会返回一个DateTime
。
然后,如果CurrentDate == null,则使用UserId从该用户的数据库中获取TimeZoneId-因此,数据库调用只会发生一次,并且只有在之前从未发生过时才会发生。
但是,静态类何时会“出生”并“被杀死”?
是用户的每次会话吗? 还是在Asp.Net应用程序运行时? 当我说用户会话时,我的意思是,每次用户单击某项时,都会创建一个新会话,因此,将创建我的静态类吗? 还是静态类对所有其他会话“可见”? 我希望它仅限于当前用户。
但是,静态类何时会“出生”并“被杀死”?
您不需要引用该类即可访问静态成员。 因此,永远不会有生与死。
是用户的每次会话吗?
不,它对于整个应用程序是全局的,并且在所有用户之间共享。
我希望它仅限于当前用户。
然后忘记静态成员并使用该会话。
静态类成员在用户会话之间共享。 但是,我看不到任何静态方法的问题。 只要您不存储共享(静态)状态(=您不使用静态字段/属性),就可以保证安全。
静态等效于单例-在整个应用程序中是所有用户通用的。 您需要基于会话的方法来实现此目的。 但是,如果您无权访问会话(例如在业务库中),则可以使用单例方法(以下代码示例)。
编辑:使用单例方法(类似于静态但更易于维护)实现此目的的代码示例。 它使用EF代码优先方法,因此,如果不使用EF,则应该对其进行调整:
编辑2:这是您应如何使用它:
要获取用户时区的时间:
var userId = 5; // assuming 5 a valid user. If not found, current local timezone will be used (`DateTime.Now`)
var localTime = UserDateTime.Instance.GetTime(userId);`
如果添加了新用户或修改了现有用户,则可以重新加载时区:(可以根据需要对其进行进一步优化。)
UserDateTime.Instance.LoadTimezones();
实现方式:
namespace YourApp
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
class UserDateTime
{
public static readonly UserDateTime Instance = new UserDateTime();
private UserDateTime() // singleton
{
LoadTimezones();
}
private Dictionary<int, string> _userTimezones = new Dictionary<int, string>();
public DateTime GetTime(int userId)
{
if (_userTimezones.ContainsKey(userId))
return TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(_userTimezones[userId]));
else
return DateTime.Now; // You could throw an error.
}
public void LoadTimezones()
{
using (var db = new YourDbContext())
{
_userTimezones = db.UserTimezones.ToDictionary(t => t.UserId, t => t.TimezoneId);
}
}
}
class UserTimezone
{
public int UserId { get; set; }
public string TimezoneId { get; set; }
}
class YourDbContext : DbContext
{
public DbSet<UserTimezone> UserTimezones { get; set; }
}
}
编辑:派生自ASP安全工具包 。
根据我的经验,它是这样的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.