Iniezione del costruttore, Single Responsibility e inizializzazione dell'elenco

5

Data la classe:

public class Foo : IFoo
{
  private IBarRepository repository

  public Foo(IBarRepository repository)
  {
     this.repository = repository
  }

  public IList<IBar> Bars { get; private set; }
}

Il mio istinto di vecchia data è quello di inizializzare l'elenco di IBar nel costruttore: this.Bars = new List<IBar>(); ma usando Iniezione costruttore , la Responsabilità singola del costruttore è adatta a imposta le dipendenze per la classe.

Qual è il modo migliore per gestirlo?

Dovrei avere un inizializzatore di raccolta che richiami in qualsiasi metodo prima di utilizzare la raccolta?

private void InitialiseCollection()
{
  if (this.Bars == null)
  {
     this.Bars = new List<IBar>();
  }
}

public void Add(IBar bar)
{
    this.InitialiseCollection();
    this.Bars.Add(bar)
}
    
posta NikolaiDante 06.01.2014 - 15:34
fonte

2 risposte

12

Bene, la semplice risposta alla tua domanda è

public readonly IList<IBar> Bars = new List<IBar>();

Ma penso che dovresti mettere in discussione la tua premessa.

but using Constructor Injection, the Single Responsibility of the constructor is for it to set the dependancies for the class.

Dove l'hai letto? È completamente errato.

Non importa se usi Constructor Injection o meno. La responsabilità del costruttore è di costruire un oggetto, completamente inizializzato, con tutte le dipendenze necessarie per operare su quell'oggetto. Queste dipendenze possono essere altri servizi o stati o valori che distinguono questo oggetto da un altro oggetto del suo tipo.

    
risposta data 06.01.2014 - 17:00
fonte
3

Il principio di responsabilità unica si applica alla classe nel suo complesso, non solo al costruttore. Inoltre, resisti all'impulso di inizializzare la variabile Bars usando l'ultimo metodo - se stai usando l'iniezione, dovrebbe essere responsabile di darti un'istanza completa e funzionante di Foo o none se non può risolvere l'oggetto da passare a il costruttore.

    
risposta data 06.01.2014 - 15:39
fonte

Leggi altre domande sui tag