Se si dispone di una classe base con servizi iniettati tramite dipendenze del costruttore: È possibile dichiarare il costruttore della sottoclasse senza utilizzare : base (params)
?Iniezione delle dipendenze sia nella classe base che nella sottoclasse con IoC?
public MyBaseClass
{
private IServiceA _serviceA;
private IServiceB _serviceB;
private IServiceC _serviceC;
public MyBaseClass(null, null, null)
public MyBaseClass(IServiceA serviceA, IServiceB serviceB, IServiceC serviceC)
{
_serviceA = serviceA;
_serviceB = serviceB;
_serviceC = serviceC;
}
}
E una sottoclasse con alcune dipendenze extra iniettato:
public MySubClassA : MyBaseClass
{
private IServiceD _serviceD;
public MySubClassA (null, null, null, null)
public MySubClassA (IServiceA serviceA, IServiceB serviceB,
IServiceC serviceC, IServiceD serviceD)
: base (serviceA, serviceB, serviceC)
{
_serviceD = serviceD;
}
}
Il problema qui è che ho più sottoclassi, solo il 10 o giù di lì in questo momento, ma il numero aumenterà. Ogni volta che ho bisogno di aggiungere un'altra dipendenza alla classe base, devo passare attraverso ogni sottoclasse e aggiungere manualmente anche la dipendenza. Questo lavoro manuale mi fa pensare che c'è qualcosa di sbagliato nel mio design.
Quindi è possibile dichiarare il costruttore di MyBaseClassA
senza i servizi richiesti dalla classe di base nel costruttore di sottoclassi? ad esempio, in modo che il costruttore di MyBaseClassA
ha solo questo codice molto più semplice:
public MySubClassA (null)
public MySubClassA (IServiceD serviceD)
{
_serviceD = serviceD;
}
Di cosa ho bisogno di cambiare nella classe base in modo che vi avviene l'iniezione di dipendenza e non ha bisogno di essere aggiunti alle classi secondarie come bene? Sto usando LightInject IoC.
Impossibile che il contenitore IoC si inietti alle proprietà anziché al costruttore? Penso che sarebbe molto più semplice, specialmente se si sono classi profondamente annidate e molta iniezione. –
In aggiunta all'altra idea di Simon .. puoi lanciare un wrapper attorno a queste dipendenze (un contenitore di dipendenze, se vuoi) come un'altra soluzione. Anche se preferisco l'approccio alla proprietà. –
@SimonBelanger tutto il resto nell'app utilizza l'iniezione param. Penso che l'iniezione di proprietà sia stata provata in una parte dell'app e abbia avuto qualche problema che ho dimenticato - dovrò rivisitarla. –