Как создать класс, который поможет мне регистрировать активность пользователя в приложении? (чистый код и вопрос рефакторинга кода) - PullRequest
0 голосов
/ 28 мая 2019

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

1 Ответ

2 голосов
/ 30 мая 2019

Обычно я использую собственный 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...