Условное разрешение - это последнее, чего я не понимаю на данный момент.Единство единства взыскания - Условное разрешение
Допустим, у нас есть интерфейс IAuthenticate
:
public interface IAuthenticate{
bool Login(string user, string pass);
}
Теперь у меня есть два типа аутентификации.
Twitter Auth
public class TwitterAuth : IAuthenticate
{
bool Login(string user, string pass)
{
//connect to twitter api
}
}
Facebook Auth
public class FacebookAuth: IAuthenticate
{
bool Login(string user, string pass)
{
//connect to fb api
}
}
регистрирующие типов в единстве конфигурации:
unityContainer.RegisterType<IAuthenticate, TwitterAuth>();
unityContainer.RegisterType<IAuthenticate, FacebookAuth>();
впрыснуть объектов через DI в нашем контроллере:
private readonly IAuthenticate _authenticate;
public AuthenticateController(IAuthenticate authenticate)
{
_authenticate = authenticate;
}
// login with twitter
public virtual ActionResult Twitter(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
// login with fb
public virtual ActionResult Facebook(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
// login with google
public virtual ActionResult Google(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
Как точно будет знать, какой объект должен решить, для разных типов аутентификации? Как я могу сделать условное разрешение в этом случае?
Я говорил с моим другом, и он объяснил, возникает ли эта ситуация, это неправильный дизайн, но это всего лишь заводская модель.
Возможно, ваш друг может быть прав. Посмотрите внимательно, если вы не нарушаете [Принцип замены Лискова] (https://en.wikipedia.org/wiki/Liskov_substitution_principle).Если реализации IAuthenticate не являются взаимозаменяемыми друг для друга (что означает, что потребитель, такой как «AuthenticateController», не будет работать правильно, если он ошибочно реализуется), вы нарушаете LSP. Решение в этом случае часто дает каждой реализации собственную абстракцию. – Steven