normalmente, userò un contenitore per le dipendenze (unità) in c # come in questo esempio:
class SomeClass
{
private readonly ILogger _logger;
public SomeClass()
{
_logger = DependencyContainer.Resolve<ILogger>();
}
public void DoSomething()
{
var someOtherClass = DependencContainer.Resolve();
someOtherClass().whatElseEver();
}
}
Ieri ho letto alcuni articoli sull'iniezione di dipendenza corretta con un di contenitore. Dopo questo, so che il mio esempio è totalmente negativo. Questa non è un'iniezione di dipendenze, è solo qualcosa come un servizio di localizzazione.
Ok, come risolvere questo? Penso che con l'iniezione del costruttore puoi risolvere facilmente questo problema:
class SomeClass
{
private readonly ILogger _logger;
private readonly ISomeOtherClass _someOtherClass;
public SomeClass(ILogger logger, ISomeOtherClass someOtherClass)
{
_logger = logger;
_someOtherClass = someOtherClass;
}
public void DoSomething()
{
_someOtherClass().whatElseEver();
}
}
Ora ho la corretta implementazione del principio dell'iniezione delle dipendenze. Ma come collegare tutte queste dipendenze? Ho una classe chiamante che risolve tutti i requisiti richiesti della classe "SomeClass":
class SomeClassCaller
{
public void DoSomething()
{
var logger = DependencyContainer.Resolve<ILogger>();
var someOtherClass = DependencyContainer.Resolve();
var someClass = new SomeClass(logger, someOtherClass);
someClass.DoSomething();
}
}
Ma questo esempio usa ancora un contenitore di dipendenze come un localizzatore di servizi, che è male. In quasi tutti gli articoli su questo, ho letto, che il contenitore delle dipendenze dovrebbe essere usato solo, nei root di applicazione / punti di ingresso, è corretto?
Ciò significa che nessuna classe dovrebbe avere la capacità di risolvere alcune dipendenze con un "localizzatore di servizi" al volo, come il logger. Devo iniettare l'ILogger in quasi tutte le classi attraverso il costruttore, per evitare questo problema, correggere? In questo modo si sente davvero male, se prendo il ILogger attraverso forse 10 classi in ogni costruttore, non è vero?
Quindi, devo usare solo un contenitore di dipendenze, se ho un grafico dipendente dipendente?
Qualcuno può darmi un esempio di come appare, se usi un contenitore di dipendenze, solo nella radice di un'applicazione?