Удостоверение. Дизайн класса
Всем привет!
У меня есть базовый класс AuthenticatorBase он имеет возможность входить в систему пользователей с различными субъектами аутентификации-логином и паролем и токеном.
Класс выглядит так:
public abstract class AuthenticatorBase { public abstract LogInResult LogIn(object authSubject); public abstract void LogOut(string sessionKey); }
Подкласс, который аутентифицируется с помощью логина и пароля
public class BasicAuthenticator : AuthenticatorBase { public override LogInResult Authenticate(object authSubject) { LogInData credentials = authSubject as LogInData; if (DbContext.Security.Authorize(credentials)) ............... } }
Подкласс, который аутентифицируется с помощью токена
public class TokenBasedAuthenticator: AuthenticatorBase { public override LogInResult Authenticate(object authSubject) { string token = authSubject as string; User user; if (DbContext.Security.LogInWithToken(token, out user)) ........... } }
Что мне не нравится в этом коде, так это параметр authSubject типа Система.Объект, Мне нужно разыграть его в подклассах. Если я использую, скажем BasicAuthenticator, Я мог бы передать недопустимый тип в качестве параметра.
Я знаю, что могу сделать универсальный тип AuthenticatorBase & lt;TAuthSubject> и имеют два подкласса BasicAuthenticator: AuthenticatorBase & lt;LogInData> и TokenBasedAuthenticator : AuthenticatorBase & lt;string> Но что делать, если мне нужно иметь их в списке, оба универсальных класса не имеют общего интерфейса.
Я мог бы создать дополнительный интерфейс, подобный этому:
public interface IAuthenticator { LogInResult LogIn(object authSubject); } public abstract class AuthenticatorBase<tauthsubject>: IAuthenticator { public abstract LogInResult LogIn(TAuthSubject authSubject); // implementing interface LogInResult IAuthenticator.LogIn(object authSubject) { return LogIn((TAuthSubject)authSubject); } }
Теперь я могу хранить экземпляры IAuthenticator в списке, но это, кажется, очень перегружено. Как лучше всего избавиться от этого параметра authSubject как тип Система.Объект?? Я хочу вызвать его и передать правильный экземпляр типа аутентификаторам, не думая о правильных типах, которые принимает Аутентификатор. Спасибо
Что я уже пробовал:
Пытался использовать мой код, но он оказался перегруженным