После того, как все ответы на мои последние question about fine-tuning оказались более полезными, чем я ожидал, я подумал, что задам еще один похожий вопрос о MembershipProviders.Как правильно настроить поставщика членства?
Итак, во-первых, чтобы уточнить: я знаю, что такое членство, роль и профиль, как реализовать мои собственные, и как их настроить, и многое из них.
Реализация поставщика роли и профиля довольно проста, потому что в большинстве случаев требуется простой CRUD. (Одной строки LINQ достаточно для примерно половины методов RoleProvider.)
Однако поставщик членства является чужим зверем. Многие из вас могут понять, что это нарушает принцип SR (Single Responsibility), потому что он должен делать ВСЕ, связанное с управлением пользователями. Хотя это оставляет много возможностей для настройки, у него есть свои недостатки. В Интернете нет информации о том, каково их ожидаемое поведение EXACT, например, когда они должны бросать исключения или просто возвращать null, и тому подобное.
Я использую this sample implementation для справки, но он также содержит несколько противоречий.
- Например, он использует свой собственный метод ValidateUser для проверки учетных данных в методе ChangePassword. Но ValidateUser также обновляет LastLoginDate пользователя до текущей даты. Итак, оправдывает ли рамка, что я установил ее в своем собственном провайдере, или это просто ошибка в выборке?
- Другое: метод ChangePassword генерирует исключение каждый раз при проверке нового пароля, но CreateUser никогда не генерирует исключение, он просто возвращает false.
И последнее, но не менее важное: оно учитывает недопустимые попытки пароля пользователя и блокирует их, если оно проходит порог. Хотя это хорошо, но для его разблокировки требуется ручное действие. Это проблема, если мой провайдер автоматически разблокирует пользователя через определенное время?
(EDIT) Я почти забыл: метод CreateUser в образце вставляет идентификатор из параметра метода. Я на самом деле думаю, что это плохая практика, потому что я использую inter с автоматическим сжатием в качестве идентификаторов, поэтому вставка их из некоторого параметра метода не является вариантом. Должен ли я просто игнорировать параметр или требовать, чтобы его значение было null и выдавало исключение, если это не так?
В целом, есть ли в ASP.NET какие-либо предположения о поведении участника-члена?
Есть ли какая-либо документация, которая описывает, когда следует бросать исключение или просто возвращать null?
Я также попытался найти набор универсальных модульных тестов, которые предоставили бы некоторые рекомендации относительно ожидаемого поведения, но не повезло, я нашел много статей о «модульном тестировании» и «Как выполнить модульный тест MembershipProvider », но не тот, где будут какие-либо фактические тесты.
Заранее благодарен всем!
+1. Спасибо за Ваш ответ. Однако вы оставили самую важную часть. В каких методах я должен исключать исключения и в которых должен я просто возвращать false (или null, где это применимо)? – Venemo
@Venemo - Я обновил ответ, чтобы дать вам «официальное» руководство, которое вы просите, а также субъективное руководство. –
Большое спасибо, это именно то, что я искал. :) Я не знал, что у MSDN есть такое окончательное руководство. (О, и я свяжусь с вами в вашем блоге, если вы не возражаете.) – Venemo