通用存储库模式中的当前用户(ASP.NET 身份)信息

Current user (ASP.NET Identity) information within Generic repository pattern

例如,我已经在 EF Core 上下文中实现了通用存储库模式;

    public class GenericRepository<TEntity, TContext> : IGenericRepository<TEntity>
        where TEntity : EntityBase
        where TContext : DbContext
    {
        internal TContext context;
        internal DbSet<TEntity> dbSet;

        public GenericRepository(TContext context)
        {
            this.context = context;
            dbSet = context.Set<TEntity>();
        }

        public virtual TEntity GetById(long id)
        {
            return dbSet.Find(id);
        }

        public virtual void Insert(TEntity entity)
        { 
            entity.CreatedDate = DateTime.Now;
            dbSet.Add(entity);
        }

        //... additional methods removed for brevity
    }

我的所有模型都使用 EntityBase class,它允许我记录创建记录的时间和创建者,例如;

    public abstract class EntityBase {
        public long Id { get; set; }
        public DateTime CreatedDate { get; set; }
        public string CreatedBy { get; set; }
        //... additional fields removed for brevity
    }

在存储库中访问当前用户的不同方式有哪些,以便我可以在创建时将用户添加到实体;

        public virtual void Insert(TEntity entity)
        { 
            entity.CreatedBy = CurrentUser.Name; // TODO: get current user here?
            entity.CreatedDate = DateTime.Now;
            dbSet.Add(entity);
        }

感觉我应该可以通过中间件和/或注入来做到这一点。

我认为,您应该将用户信息从控制器传递到存储库方法,或者在控制器而不是存储库方法中设置 CreatedBy 值。此外,在我看来,您应该避免将您的存储库依赖于身份并保持简单和独立。

换句话说,在您的存储库中引用 HttpContext.User.Identity 不是一个好主意,并且 HttpContext 属于表现层而非数据层。