首页 > 解决方案 > 如何创建一个类来帮助我记录我的应用程序用户活动?(干净的编码和代码重构问题)

问题描述

目前,当用户执行 CRUD 操作时,我将其记录在数据库中:

var user = User.Identity.Name;
var log = (from l in db.AppLogs where l.UserName == user select l).ToList();
var logresult = (from lr in log select lr).LastOrDefault();
var loggedUser = (from lu in db.AMProfiles where lu.UserName == logresult.UserName select lu).SingleOrDefault();
var logAppName = "My Application";
var logRequestType = "Create New Movie - " + Movie.Name;

if (ModelState.IsValid)
{
    AMLog userLog = new AMLog
    {
        CreateDate = DateTime.Now,                 
        UserId = Convert.ToInt32(loggedUser.EmployeeId),
        AppName = logAppName,
        RequestType = logRequestType,
        LogId = logresult.Id
    };
    db.MADMovies.Add(mADMovies);
    db.SaveChanges();
}

这里的问题是我知道这不是很干净,重复,应该有更好的方法来做到这一点。

我想做的是使用一个在执行 CRUD 操作时调用的类。这是怎么做到的?

标签: c#asp.net-mvcrefactoring

解决方案


我通常使用自定义 ActionFilter 来完成这样的事情。

获取一些类型或您需要的任何类型:

public enum AuditEventType 
{
    LoggedIn,
    LoggedOut,
    ViewedPage,
    Etc
}

创建一个动作过滤器类:

public class AuditEvent : ActionFilterAttribute 
{
    AuditEventType Type;

    public AuditEvent(AuditEventType type) 
    {
        Type = type;
    }

    public override OnActionExecuted() 
    {
         //log user name and audit event to db
    }
}

装饰您要记录的控制器方法:

[HttpPost]
[AuditEvent(AuditEventType.LoggedIn)]
public ActionResult Login(LoginModel model) 
{
   //do login logic
}

推荐阅读