通用存储库模式中的当前用户(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 属于表现层而非数据层。
例如,我已经在 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 属于表现层而非数据层。