La risoluzione condizionale è l'ultima cosa che non capisco al momento.Unity Injection Unity - Risoluzione condizionale
Diciamo che abbiamo un'interfaccia IAuthenticate
:
public interface IAuthenticate{
bool Login(string user, string pass);
}
Ora ho due tipi di autenticazione.
Twitter autenticazione
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
}
}
tipi Registrazione in unità di configurazione:
unityContainer.RegisterType<IAuthenticate, TwitterAuth>();
unityContainer.RegisterType<IAuthenticate, FacebookAuth>();
iniettare oggetti via di nel nostro controller:
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);
}
In che modo l'unità saprà esattamente quale oggetto deve risolvere per diversi tipi di autenticazione? Come faccio a risolvere condizionatamente in questo caso?
Ho parlato con un mio amico, e ha spiegato se questa situazione appare è di progettazione sbagliata, ma questo è solo il modello di fabbrica utilizzato.
Il tuo amico potrebbe avere ragione. Osserva attentamente se non stai violando il [Principio di sostituzione di Liskov] (https://en.wikipedia.org/wiki/Liskov_substitution_principle).Se le implementazioni di "IAuthenticate" non sono intercambiabili l'una con l'altra (il che significa che un utente come "AuthenticateController" non funzionerà correttamente se ottiene un'implementazione errata), si sta violando LSP. In questo caso, la soluzione è spesso quella di dare a ciascuna implementazione la propria astrazione. – Steven