Mi scuso se questa sembra un'ennesima ripetizione della domanda, ma ogni volta che trovo un articolo sull'argomento, parla principalmente di DI. Quindi, ottengo DI, ma sto cercando di capire la necessità di un contenitore IoC, in cui tutti sembrano entrare. Il punto di un contenitore IoC è davvero solo quello di "auto-risolvere" l'implementazione concreta delle dipendenze? Forse le mie classi tendono a non avere diverse dipendenze e forse è per questo che non vedo il grosso problema, ma voglio assicurarmi di capire correttamente l'utilità del contenitore.
In genere divido la mia logica aziendale in una classe che potrebbe assomigliare a questa:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
Quindi ha solo una dipendenza, e in alcuni casi potrebbe avere una seconda o una terza, ma non così spesso. Quindi tutto ciò che chiama questo può passare il proprio repository o consentirgli di utilizzare il repository predefinito.
Per quanto riguarda la mia attuale comprensione di un contenitore IoC, tutto il contenitore fa è risolvere IDataRepository. Ma se è tutto ciò che fa, allora non vedo un sacco di valore in quanto le mie classi operative già definiscono un fallback quando non è passata alcuna dipendenza. Quindi l'unico altro vantaggio che posso pensare è che se ho diverse operazioni come questo usa lo stesso repository fallback, posso cambiare quel repository in un posto che è il registro / fabbrica / contenitore. Ed è fantastico, ma è così?
ConcreteRepository
e (2) è possibile fornire dipendenze aggiuntive ConcreteRepository
(una connessione al database sarebbe comune, ad esempio).