1

背景:

我有一个 Web 应用程序,我需要对其进行数据库审计以进行插入/删除/更新(可能还有读取)。我使用 LINQ 作为我的 ORM。使用我在网上找到的一些想法,我想出了一种使用属性来装饰具有关联审计表的实体的方法。审计表本身除了当前用户的id和名称、修改类型、修改时间、操作是否成功等字段外,还需要包含与原表相同类型的相同列。审计发生在 SubmitChanges 期间——我的数据上下文是抽象的,我在具体实现中继承和覆盖 SubmitChanges。抽象数据上下文实际上是从 AbstractAuditableDataContext 派生的,它扩展了 DataContext 并添加了一个 CurrentUser 属性,其中包含当前用户 ID 和名称的占位符。默认情况下,对于没有登录用户的实例,这些是 0 和“系统”——比如在注册或登录期间,当用户表的某些字段可能被更新时。该应用程序是使用 ASP.NET MVC 用 C# 编写的。

问题:

填充派生数据上下文的当前用户属性的最佳方法是什么?我是否应该创建一个注入到 AuditUtility 中的实用程序类,以检查 CurrentUser 是否已设置,如果没有,则将其填充。为了测试我会模拟它,但在实时应用程序中它可能会使用惰性- 加载并在会话中获取/设置它。或者我应该修改数据上下文工厂(由所有控制器使用)来执行此功能。我已经在单元测试期间使用了模拟工厂,因此这不会涉及创建新类。或者是否应该在工厂之外进行派生,并在上下文创建期间注入当前用户。这将允许我“代表”审计。

我意识到这有点主观,但我很感激你可能贡献的任何想法/经验。

谢谢。

4

4 回答 4

1

如果您使用的是 Windows 或 Forms 身份验证,则可以检查 HttpContext 而不传递任何内容。如果您不在 Web 上下文中,请从线程中获取用户。也许:

if(HttpContext.Current != null)
{
    //grab the user from the HttpContext
}
else
{
    //grab the user from the Thread
}
于 2009-02-26T16:32:07.003 回答
1

System.Threading.Thread.CurrentPrincipal应该给你你正在寻找的答案。

于 2009-02-26T16:35:29.507 回答
0

您的 DataContext 的范围是什么(应用程序、会话、请求,每个 BusinessObject ..)?如果它变化,您可能根本不想在 DataContext 中缓存当前用户(或在创建期间设置它)。我可能会在需要时使用从 Session (一种或另一种方式)检索当前用户的 DataContext 中的属性。

于 2009-02-26T15:15:47.280 回答
0

我最终创建了一个 CurrentUserUtilityBase 类,该类具有一个 GetAuditUser 方法,该方法采用当前数据上下文并检索与 HttpContext.User.Identity 中的当前用户名对应的用户对象。它使用此对象来提取当前用户的 id 和显示名称,并创建并返回包含这些属性的 AuditUser 对象。

我的实现类使用工厂来获取我的数据上下文的实例,并在此数据上下文上调用基类方法。我的数据上下文的工厂方法使用当前用户实用程序在创建上下文后将上下文的当前用户注入上下文。

于 2009-03-25T16:27:13.463 回答