0

我正在编写一个基于 VS 的默认模板的 MVC 4 应用程序。我的数据库存储库位于 Models 文件夹中。当用户修改数据库时,我想做一些日志记录。

我想将进行日志记录的方法放在存储库中。这样,控制器和操作方法就不必关心日志记录。

作为日志记录的一部分,我想捕获:

var userIdentityName = User.Identity.Name;

var pathAndQuery = Request.Url.PathAndQuery;

在模型文件夹中的数据库存储库中提供这些信息的优雅解决方案是什么?

所以我要求一种优雅的方法将这些信息从我的控制器和操作方法传递到我的存储库?顺便说一句,我没有使用依赖注入。

4

2 回答 2

0

我会使用 DI 将一个注入ILogger到您的存储库中,然后HttpContext在您的记录器(而不是您的存储库)中使用它来访问信息并进行日志记录。

于 2013-09-20T13:55:50.870 回答
0

我制作了一个 ActionFilterAttribute,它负责从控制器层捕获有趣的信息。然后我将这些信息存储在 Session 中,并在我的存储库中再次访问它,在那里我将审计跟踪记录到数据库中。

    [Audit]
    public ActionResult Index()

.

public class AuditAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase httpRequestBase = filterContext.HttpContext.Request;
        HttpContext httpContext = HttpContext.Current;

        string urlPathAndQuery = httpRequestBase.RawUrl;
        string windowsLogonName = WindowsIdentity.GetCurrent().Name;
        string ipAddress = httpRequestBase.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? httpRequestBase.UserHostAddress;

        httpContext.Session["WindowsLogonName"] = windowsLogonName;
        httpContext.Session["UrlPathAndQuery"] = urlPathAndQuery;
        httpContext.Session["IpAddress"] = ipAddress;

        base.OnActionExecuting(filterContext);
    }
}
于 2013-09-22T16:08:13.147 回答