Asp.net core 通用存储库模式中的当前用户(ASP.NET标识)信息
例如,我在EF核心上下文上实现了通用存储库模式Asp.net core 通用存储库模式中的当前用户(ASP.NET标识)信息,asp.net-core,asp.net-identity,repository-pattern,Asp.net Core,Asp.net Identity,Repository Pattern,例如,我在EF核心上下文上实现了通用存储库模式 public class GenericRepository<TEntity, TContext> : IGenericRepository<TEntity> where TEntity : EntityBase where TContext : DbContext { internal TContext context; internal Db
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
}
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属于表示层而不是数据层。我认为,您应该将用户信息从控制器传递到存储库方法,或者在控制器内设置CreatedBy值,而不是存储库方法。此外,在我看来,您应该避免将存储库依赖于标识,并保持它的简单性和独立性
换句话说,在存储库中引用HttpContext.User.Identity不是一个好主意,而HttpContext属于表示层而不是数据层。这取决于您使用什么进行身份验证。您使用的是JWT吗?我使用的是ASP.NET Identity和Cookies。这取决于您使用什么进行身份验证。您使用的是JWT吗?我使用的是ASP.NET标识,数据的审核要求意味着我需要记录谁创建和编辑了它。我知道您的意思,但正如我提到的,最好将模型中的数据传递到存储库,而不是存储库类中的访问标识(类或…)。将来使用这种方法,您可以更改身份验证库。对数据的审核要求意味着我需要保留创建和编辑它的人的记录。我知道您的意思,但正如我所提到的,最好将模型中的数据传递到存储库,而不是存储库类中的访问标识(类或…)。将来使用这种方法,您可以更改身份验证库。