c# - 如何创建一个类来帮助我记录我的应用程序用户活动?(干净的编码和代码重构问题)
问题描述
目前,当用户执行 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 操作时调用的类。这是怎么做到的?
解决方案
我通常使用自定义 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
}
推荐阅读
- swift-playground - 在 iPad Playgrounds 应用程序上编辑 Swift 标记
- javascript - 如何使用 Node-express 将通过页面 B 的表单发布的数据呈现到页面 A?
- c# - 如何在 XAML 中将弹出窗口居中放在我的窗口上?
- c - Cyclone V FPGA DDR3 内存的以太网传输速度慢
- excel - 从两列中选择值
- docker - Docker 撰写文件中的“-”字符
- java - 这是从 Java 中的图像数据创建 BufferedImage 的最有效方法吗
- javascript - Javascript 功能仅在手动重新加载页面时启动
- flutter - FocusNode - 为什么 requestFocus() 不起作用?
- java-11 - 如何在多个线程上追逐 JFR 事件