在 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
我希望通过这样做,我能够像这样覆盖数据项目中 DbContext
的 SaveChanges
方法:
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);
我们目前正在开发一个使用 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
我希望通过这样做,我能够像这样覆盖数据项目中 DbContext
的 SaveChanges
方法:
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
?
为什么不使用 override
而不是声明一个将用户身份作为参数的新方法,如下所示:
public int SaveChanges(Identity identity)
{
// Your code
return SaveChanges();
}
当然,您必须修改 SaveChanges
调用才能通过身份传递:
db.SaveChanges(HttpContext.Current.User.Identity);