Ich entschuldige mich, wenn dies wie eine weitere Wiederholung der Frage erscheint, aber jedes Mal, wenn ich einen Artikel zum Thema finde, wird meist nur darüber gesprochen, was DI ist. Also, ich bekomme DI, aber ich versuche zu verstehen, dass ein IoC-Container benötigt wird, in den sich offenbar jeder hineinzuversetzen scheint. Ist der Sinn eines IoC-Containers wirklich nur, die konkrete Implementierung der Abhängigkeiten "automatisch aufzulösen"? Vielleicht haben meine Klassen nicht viele Abhängigkeiten, und vielleicht sehe ich deshalb nicht die große Sache, aber ich möchte sicherstellen, dass ich den Nutzen des Containers richtig verstehe.
Normalerweise teile ich meine Geschäftslogik in eine Klasse auf, die ungefähr so aussieht:
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;
}
}
Es hat also nur die eine Abhängigkeit, und in einigen Fällen hat es vielleicht eine zweite oder dritte, aber nicht allzu oft. So kann alles, was dies aufruft, sein eigenes Repo übergeben oder es erlauben, das Standard-Repo zu verwenden.
Nach meinem derzeitigen Verständnis eines IoC-Containers ist alles, was der Container tut, die Auflösung von IDataRepository. Aber wenn das alles ist, sehe ich nicht viel Wert darin, da meine Operationsklassen bereits einen Fallback definieren, wenn keine Abhängigkeit übergeben wird. Der einzige andere Vorteil, den ich mir vorstellen kann, ist, dass ich mehrere Operationen wie habe Wenn Sie dasselbe Fallback-Repo verwenden, kann ich dieses Repo an einer Stelle ändern, die die Registrierung / Fabrik / Container ist. Und das ist toll, aber ist es das?
ConcreteRepository
und (2) Sie können zusätzliche Abhängigkeiten für angeben ConcreteRepository
(eine Datenbankverbindung wäre beispielsweise üblich).