繁体   English   中英

ASP.Net中的静态类的寿命

[英]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安全工具包

根据我的经验,它是这样的。

  • 用户访问该网站。
  • 网站启动
  • 如果调用了静态类,则将调用其静态构造函数,并且该静态类将“出生”
  • 用户结束会话
  • 该应用程序和静态类保持良好状态
  • 另一个用户访问该网站并访问静态类
    • 静态类的构造函数未调用,因为静态类已经“出生”并且访问其任何静态变量都将与以前的用户离开它们的方式相同
  • 没有其他人会超过超时时间(通常在iis上将其设置为大约10分钟)
  • 网站关闭并且处置了静态类,下一个用户将重新开始

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM