1

在我的 UI 层中,我在会话状态中存储了一些时区信息。

我现在需要访问我的服务/业务/数据层中的时区。

从我的 UI 层,我传递登录用户的用户 ID,我的数据库存储了该用户的时区信息。我不希望通过用户 ID 传递时区。

时区仅用于时间很重要的少数呼叫。(有一个项目开始了,今天是一个人休假......等等)。

我正在考虑可能有一个静态类,它在所有层(服务/业务/数据)上都被引用,它有一个时区信息字段。我希望它是静态的,以便我可以引用它:

var CurrentDate = CommonClass.GetLocatDateTime(_userId);

那可能会返回一个DateTime.

然后,如果 CurrentDate == null,使用 UserId,从数据库中为该用户获取 TimeZoneId - 因此,数据库调用只会发生一次,并且只有在之前没有发生过时才会发生。

但是,静态类是什么时候“诞生”和“消亡”的?

它是每个用户的会话吗?还是在 Asp.Net 应用程序运行时?当我说用户会话时,我的意思是,每次用户单击某些东西时,都会创建一个新会话,因此,我的静态类将被创建吗?还是静态类对所有其他会话“可见”?我希望它仅限于当前用户。

4

4 回答 4

5

但是,静态类是什么时候“诞生”和“消亡”的?

您不需要类的引用即可访问静态成员。所以从来没有出生或死亡。

它是每个用户的会话吗?

不,它对您的整个应用程序是全局的,并在所有用户之间共享。

我希望它仅限于当前用户。

然后忘记静态成员并使用会话。

于 2013-08-14T06:17:42.030 回答
1

静态类成员在用户会话之间共享。但是,我看不出静态方法有任何可能的问题。只要您不存储共享(静态)状态(=您不使用静态字段/属性),您就是安全的。

于 2013-08-14T06:18:26.733 回答
1

静态等同于单例——整个应用程序以及所有用户都通用。您需要基于会话的方法来实现这一点。但是,如果您无权访问会话(例如在业务库中),则可以使用单例方法(代码示例如下。)

编辑:使用单例方法实现此目的的代码示例(类似于静态但更易于维护)。它使用 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 Security Kit

于 2013-08-14T06:23:31.050 回答
1

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

  • 用户点击该网站。
  • 网站启动
  • 如果调用静态类 - 将调用其静态构造函数并且静态类将“诞生”
  • 用户完成他的会话
  • 应用程序和静态类保持活力和良好
  • 另一个用户访问网站并访问静态类
    • 静态类的构造函数没有被调用,因为静态类已经“诞生”并且访问它的任何静态变量将与前一个用户离开它们时相同
  • 没有其他人访问网站的时间超过超时时间(通常在 iis 上设置为大约 10 分钟)
  • 网站关闭,静态类处理,下一个用户重新开始
于 2015-06-09T03:48:45.180 回答