В настоящее время, когда пользователь выполняет действие 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
}