Diciamo che ho un'interfaccia:
public interface IAccountStoreManager
{
bool IsUserMemberOfAny(string username, string[] groups, out string[] containingGroups);
}
La firma del metodo di IsUserMemberOfAny
era influenzata dalla mia osservazione che la classe client avrebbe controllato l'appartenenza di un utente a più gruppi. Ad esempio, potrebbe essere che per verificare se un account utente è quello di un supervisore, sarebbero membri di uno dei gruppi Admins1 o Admins2.
Se dovessi pensare a questo metodo senza considerare che ci sarebbe più di un gruppo per controllare l'appartenenza, potrei aver progettato un metodo come questo:
bool IsUserMemberOf(string username, string group);
e si è conclusa con un ciclo contenente una chiamata all'implementazione del metodo. Questo ciclo potrebbe essere costoso se l'implementazione dovesse interagire con un Account Store come Active Directory, ad esempio, dove avremmo qualcosa di simile:
using (PrincipalContext adPrincipalContext = new PrincipalContext(ContextType.Domain, ldapSettingsConfig.DomainController, ldapSettingsConfig.Username, ldapSettingsConfig.Password))
{
using (PrincipalSearcher ps = new PrincipalSearcher())
{
//code here
}
}
Quindi la mia domanda è: cosa si consiglia per quanto riguarda l'effetto dell'implementazione e le classi dei clienti sulla progettazione di un'interfaccia? È consigliabile lasciare che l'implementazione modellino l'astrazione (interfaccia) in questo modo?