在 class 库中访问 Web 应用程序当前用户的最佳方式

Best way to access current user of web application in class library

我们目前正在开发一个使用 entity framework 进行数据存储的项目。该项目的要求之一是我们针对每个实体存储、Created、CreatedBy、Modified、ModifiedBy 等。

我们选择使用两个项目将数据与 Web 应用程序分开,一个用于数据,一个用于 Web 应用程序。

我创建了一个接口,IAuditable 在数据项目中定义如下:

Public Interface IAuditable

    Property Created As DateTime
    Property CreatedBy As ApplicationUser

    Property Modified As DateTime
    Property ModifiedBy As ApplicationUser

    Property IsDeleted As Boolean
    Property Deleted As DateTime
    Property DeletedBy As ApplicationUser

End Interface

我希望通过这样做,我能够像这样覆盖数据项目中 DbContextSaveChanges 方法:

Public Overrides Function SaveChanges() As Integer

    For Each AuditableEntity In ChangeTracker.Entries(Of IAuditable)

        If AuditableEntity.State = EntityState.Added Or AuditableEntity.State = EntityState.Modified Then

            Dim CurrentUser As ApplicationUser = HttpContext.Current.User.Identity

            AuditableEntity.Entity.Modified = DateTime.Now
            AuditableEntity.Entity.ModifiedBy = CurrentUser

            If AuditableEntity.State = EntityState.Added Then

                AuditableEntity.Entity.Created = DateTime.Now
                AuditableEntity.Entity.CreatedBy = CurrentUser

            Else

                AuditableEntity.Property(Function(p) p.Created).IsModified = False
                AuditableEntity.Property(Function(p) p.CreatedBy).IsModified = False

            End If

        End If

    Next

    Return MyBase.SaveChanges()

End Function

现在,问题是显然 class 库中不存在 HttpContext.Current.User.Identity

将当前用户传递给此函数的最佳方法是什么?

我知道我可以将 System.Web 添加到项目中,然后将能够访问 HttpContext 但这将限制我只能在 Web 应用程序中使用数据......并且那里将来我们可能需要在其他类型的项目中使用这些数据class。

有一个单独的 DbContext 是个好主意吗?它继承自 Class 库中的 DbContext?在有权访问 HttpContext?

的 Web 应用程序中

为什么不使用 override 而不是声明一个将用户身份作为参数的新方法,如下所示:

public int SaveChanges(Identity identity)
{
    // Your code
    return SaveChanges();
}

当然,您必须修改 SaveChanges 调用才能通过身份传递:

db.SaveChanges(HttpContext.Current.User.Identity);