src/DotNetCommon.Core/User.cs

(开头部分) 14KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using DotNetCommon.Extensions;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DotNetCommon
{
    /// <summary>
    /// 登录用户信息
    /// </summary>
    /// <remarks>
    /// 该对象储存三类信息:<para></para>
    /// <list type="bullet">
    /// <item>IdString:用户Id字符串,使用string类型表示,可兼容int/long/string/guid等key值,需要在程序启动时注入获取逻辑,参照:<seealso cref="User.RegisterIdString(Func{string}, bool)"/></item>
    /// <item>IsAuthenticated:用户是否登录,默认如果IdString为空则返回false,否则返回true,如果需要自定义,请调用:<seealso cref="User.RegisterIsAuthenticated(Func{bool}, bool)"/>;</item>
    /// <item>Properties:与用户关联的其他属性,需要注入属性容器字典,参照:<seealso cref="User.RegisterPropertiesDictionary(Func{IDictionary{object, object}}, bool)"/>;</item>
    /// </list>
    /// 使用示例:<para></para>
    /// 首先,在StartUp.cs的Configure中注入逻辑:<para></para>
    /// DotNetCommon.User.RegisterIdString(() => httpContextAccessor.HttpContext.User.Identity.Name);<para></para>
    /// DotNetCommon.User.RegisterIsAuthenticated(() => httpContextAccessor.HttpContext.User.Identity.IsAuthenticated);<para></para>
    /// DotNetCommon.User.RegisterPropertiesDictionary(() => (httpContextAccessor.HttpContext?.Items) ?? new Dictionary&lt;object, object>());<para></para>
    /// 然后,在业务代码中使用:<para></para>
    /// var id=DotNetCommon.User.Current.IdString.To&lt;long&gt;();<para></para>
    /// var isAuth=DotNetCommon.User.Current.IsAuthenticated;<para></para>
    /// DotNetCommon.User.Current.SetProperty("age", age);<para></para>
    /// </remarks>
    public class User
    {
        private User()
        {
            UserCreated?.Invoke(this);
        }

        /// <summary>
        /// 用户创建事件
        /// </summary>
        public static event Action<User> UserCreated;

        //异步上下文中保存用户属性
        private static AsyncLocal<User> _asyncUser = new AsyncLocal<User>();

        /// <summary>
        /// 当前登录用户信息
        /// </summary>
        public static User Current
        {
            get
            {
                _asyncUser.Value = _asyncUser.Value ?? new User();
                return _asyncUser.Value;
            }
        }

        #region 用户IsAuthenticated
        private static bool _isCacheAuthenticated = false;
        private static Func<bool> _isAuthenticated;
后面还有 328 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。