Quando trovo una dipendenza concreta all'interno di un metodo di estensione, ho tentato di rimuovere la dipendenza (concreta) parametrizzandola in questo modo
// original implementation
public static List<Address> GetDuplicate(this Address address)
{
var repository = new AddressRepository();
return repository.FindAddress(address.Street, address.Town);
}
// 'Fixed' implementation using 'parameter injection'
public static List<Address> GetDuplicate(this Address address, IAddressRepository repository = null)
{
repository = repository ?? new AddressRepository();
return repository.FindAddress(address.Street, address.Town);
}
La mia idea era che ciò avrebbe invertito il controllo della classe collaborante, AddressRepository, facendo in modo che potesse essere passato dal codice usando il metodo.
Ad ogni modo, quando un collega ha visto questo, ha affermato che il codice faceva ancora affidamento su un'implementazione concreta e non utilizzava il CIO. Anche se posso vedere che ci sono alcuni aspetti negativi del codice, non sono sicuro di essere d'accordo sul fatto che non è Inversion of Control dal momento che
- Il codice dipende da un'astrazione (IAddressRepository)
- Il codice chiamante può fornire un'implementazione diversa.
Quale principio viene violato rispetto al CIO? Quale parte del codice in particolare viola questo principio? In poche parole, l'iniezione di parametri è in realtà una cosa?