Problema:
1) Costruttore con sempre maggiore lista di parametri.
2) Se la classe è ereditata (Es: RepositoryBase
), quindi la modifica del costruttore causa modifiche nelle classi derivate.
Soluzione 1
Passo IoC Container
al costruttore
Perché
- Non più sempre crescente lista di parametri
- firma Costruttori diventa semplice
Perché non
- Ti fa classe strettamente accoppiati al contenitore CIO. (Che provoca problemi quando 1. si desidera utilizzare tale classe in altri progetti in cui si utilizza un contenitore IoC diverso 2. si decide di modificare il contenitore IoC)
- Rende la classe meno descrittiva. (Non si può davvero guardare al costruttore di classi e dire cosa serve per il funzionamento.)
- La classe può accedere potenzialmente a tutti i servizi.
Soluzione 2
Creare una classe che raggruppa tutti i servizi e passarlo al costruttore
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;
}
}
classe derivata
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;
}
}
Perché
- classi Aggiunta nuova dipendenza di classe non influenza deriva
- Class è agnostica di IoC Container
- Class è descrittivo (in aspetto delle sue dipendenze).Per convenzione, se volete sapere quale classe
A
Dipende, che l'informazione si accumula nei A.Dependency
- firma Constructor diventa semplice
Perché non
- necessità di creare classe aggiuntiva
La registrazione del servizio
- diventa complessa (È necessario registrarsi ogni
X.Dependency
separatamente)
- Concettualmente stesso passando
IoC Container
- ..
Soluzione 2 è solo un grezzo però, se v'è solido argomento contrario, allora commento descrittivo sarebbe apprezzato
perché stai passando il contenitore? Penso che potresti fraintendere IOC –
Se i tuoi costruttori richiedono più o più parametri potresti fare troppo in quelle classi. –
Non è così che si fa l'iniezione del costruttore. Gli oggetti non conoscono affatto il contenitore IoC, né dovrebbero. – duffymo