Регистрация события в MVC - какой подход подходит лучше всего? - PullRequest
1 голос
/ 24 ноября 2010

У меня есть веб-приложение MVC2, которое должно записывать количество уникальных входов пользователей.Каждый раз, когда пользователь входит в систему, должна быть запись, сохраненная в базе данных.Только основы, такие как время, дата и т. П.

Учитывая, что бизнес-требования заключаются в том, чтобы регистрировать только случаи в одном конкретном ActionResult (т. Е. Вход в систему пользователя), я должен просто написать некоторый пользовательский код для запуска записи добаза данных?

В качестве альтернативы, учитывая, что у компании есть опыт более позднего изменения своего мнения (необычно для клиентов), могу ли я создать что-то более надежное и использовать это?

Наконец, а как насчет использования Log4Net?Принимая во внимание, что первоначальные требования касаются только одной небольшой части одного приложения, является ли это излишним, даже если впоследствии оно может быть более расширяемым?

Советы и живые дебаты приветствуются.

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Поскольку вы используете SqlMembershipProvider, самое простое, что можно сделать, это добавить update trigger в таблицу aspnet_Membership.Когда LastLoginDate обновляется, триггер может заполнять отдельную таблицу отслеживания.Вы можете сделать то же самое, если хотите отслеживать неудачные попытки входа в систему, используя столбец FailedPasswordAttemptCount.

Подробнее об обновлении этих полей при входе пользователя в систему см. Документацию для SqlMembershipProvider.ValidateUser метод:

При успешной проверке пользователя значения даты последней активности и даты последнего входа обновляются до текущей даты и времени в базе данных.

Если для метода ValidateUser указан неверный пароль, внутренний счетчик, который отслеживает попытки ввода неверного пароля, увеличивается на единицу.

Что касается ведения журнала в целом, вы можете использовать каркас ведения журналанезависимо от того, и я бы предложил NLog .

1 голос
/ 24 ноября 2010

Описанная вами потребность отлично подходит для события приложения / домена.

Когда пользователь входит в систему, должно возникать событие всего приложения, сигнализирующее о том, что событие (вход пользователя в систему) произошло. «Событие» - это сообщение, я всегда пишу их как пакеты данных без какого-либо поведения (ничего, кроме полностью открытых свойств), и я обычно заставляю их содержать весь контекст (данные), необходимый для обработчиков (который часто является просто единичным ID записи).

Отдельно напишите обработчик для события, который записывает соответствующую информацию в вашу базу данных. Обработчик должен быть классом с единственной ответственностью. Если в ответ на событие требуется выполнить больше действий, реализуйте их как отдельные обработчики.

Затем где-то при запуске приложения должны быть подключены обработчики для прослушивания событий приложения / домена.

Таким образом, для поддержки этого шаблона потребуется немного кода инфраструктуры, но это должен быть простой и короткий код, которому часто могут сильно помочь контейнеры DI / IoC. Существует также множество примеров реализаций, доступных, если вы регистрируете события в домене Google.

Этот шаблон событий приложений / доменов, как мне показалось, исключительно мощный. Использование этого шаблона значительно улучшило мой код. Я считаю, что гораздо проще расширить поведение систем без изменения любого существующего кода, и это поведение инкапсулируется благодаря наличию в вашем примере четкого места для кода, который регистрирует пользователя, и кода который записывает статистику о логинах приложений.

Наконец, я бы не использовал Log4Net для этого. Если вы реализуете событие, обработчик должен быть предельно простым и понятным, но если вы попытаетесь использовать Log4Net для поддержки настойчивости, ну ... похоже, вы в конечном итоге будете бороться со своим инструментом (Log4Net) хотя бы до некоторой степени. степень - и этого можно полностью избежать, просто не используя его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...