Problem :
1) Konstruktor mit ständig wachsender Parameterliste.
2) Wenn die Klasse vererbt wird (Bsp: RepositoryBase
), dann ändern Sie den Konstruktor Signatur zu einer Änderung in den abgeleiteten Klassen.
Lösung 1
Pass IoC Container
zum Konstrukteur
Warum
- Keine ständig wachsende Parameterliste mehr
- Die Signatur des Konstruktors wird einfach
Warum nicht
- Macht Ihre Klasse eng an den IoC-Container gekoppelt. (Das führt zu Problemen, wenn 1. Sie diese Klasse in anderen Projekten verwenden wollen, in denen Sie einen anderen IoC-Container verwenden. 2. Sie sich entscheiden, den IoC-Container zu wechseln)
- Das macht Ihren Unterricht weniger anschaulich. (Man kann nicht wirklich einen Klassenkonstruktor betrachten und sagen, was er zum Funktionieren braucht).
- Klasse kann potenziell auf alle Dienste zugreifen.
Lösung 2
Erstellen Sie eine Klasse, die alle Dienste zusammenfasst, und übergeben Sie sie an den Konstruktor
public abstract class EFRepositoryBase
{
public class Dependency
{
public DbContext DbContext { get; }
public IAuditFactory AuditFactory { get; }
public Dependency(
DbContext dbContext,
IAuditFactory auditFactory)
{
DbContext = dbContext;
AuditFactory = auditFactory;
}
}
protected readonly DbContext DbContext;
protected readonly IJobariaAuditFactory auditFactory;
protected EFRepositoryBase(Dependency dependency)
{
DbContext = dependency.DbContext;
auditFactory= dependency.JobariaAuditFactory;
}
}
Abgeleitete Klasse
public class ApplicationEfRepository : EFRepositoryBase
{
public new class Dependency : EFRepositoryBase.Dependency
{
public IConcreteDependency ConcreteDependency { get; }
public Dependency(
DbContext dbContext,
IAuditFactory auditFactory,
IConcreteDependency concreteDependency)
{
DbContext = dbContext;
AuditFactory = auditFactory;
ConcreteDependency = concreteDependency;
}
}
IConcreteDependency _concreteDependency;
public ApplicationEfRepository(
Dependency dependency)
: base(dependency)
{
_concreteDependency = dependency.ConcreteDependency;
}
}
Warum
- Das Hinzufügen einer neuen Abhängigkeit zu einer Klasse hat keine Auswirkungen auf abgeleitete Klassen
- Die Klasse ist unabhängig vom IoC-Container
- Die Klasse ist beschreibend (in Bezug auf ihre Abhängigkeiten). Wenn Sie wissen wollen, welche Klasse Sie haben, müssen Sie per Konvention
A
Hängt davon ab, dass die Informationen in A.Dependency
- Die Konstruktorsignatur wird einfach
Warum nicht
- zusätzliche Klasse erstellen müssen
- die Registrierung von Diensten wird komplex (Sie müssen sich für jede
X.Dependency
getrennt)
- Konzeptionell dasselbe wie beim Passieren
IoC Container
- ..
Lösung 2 ist nur ein grober Entwurf, wenn es stichhaltige Argumente dagegen gibt, dann wäre ein beschreibender Kommentar willkommen