Uwarunkowanie warunkowe to ostatnia rzecz, której nie rozumiem w tej chwili.Zależność wtrysku jedności - warunkowe rozwiązywanie
Powiedzmy mamy interfejs IAuthenticate
:
public interface IAuthenticate{
bool Login(string user, string pass);
}
teraz mam dwa typy uwierzytelniania.
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
}
}
Rejestrowanie typy w jedności config:
unityContainer.RegisterType<IAuthenticate, TwitterAuth>();
unityContainer.RegisterType<IAuthenticate, FacebookAuth>();
wstrzyknąć obiekty via di naszego kontrolera:
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);
}
Jak dokładnie jedność będzie wiedzieć, który obiekt musi rozwiązać w przypadku różnych typów uwierzytelniania? Jak mogę w tym przypadku wykonać rozwiązywanie warunkowe?
Rozmawiałem z moim przyjacielem, a on wyjaśnił, czy ta sytuacja wydaje się błędnym projektem, ale jest to tylko wzór fabryczny.
Twój przyjaciel może mieć rację. Przyjrzyj się uważnie, jeśli nie naruszasz [zasady substytucji Liskova] (https://en.wikipedia.org/wiki/Liskov_substitution_principle).Jeśli implementacje "IAuthenticate" nie są wzajemnie zamienne (co oznacza, że konsument taki jak "AuthenticateController" nie będzie działał poprawnie, jeśli otrzyma błędną implementację), naruszysz LSP. Rozwiązaniem w tym przypadku jest często nadanie każdej implementacji własnej abstrakcji. – Steven