C'è questo articolo che dice:
A Composition Root is a (preferably) unique location in an application where modules are composed together.
Only applications should have Composition Roots. Libraries and frameworks shouldn't.
A DI Container should only be referenced from the Composition Root. All other modules should have no reference to the container.
La mia domanda è simile a questa:
Abbiamo un'app Console e in un altro progetto una libreria che esegue alcuni algoritmi. Ha una classe AlgorithmFactory
, che accetta un AlgorithmInput
come parametri e crea un AlgorithmRunner
. I fatti sono:
- Dalla console che voglio chiamare:
IoC.AlgorithmFactory.CreateAlgorithmRunner(input).Run()
-
AlgorithmInput
contiene dati di runtime necessari per alcune classi della libreria per la loro configurazione (ad esempio:RoundingPrecision
che indica il numero di cifre decimali che dovremmo arrotondare a, oConnectionString
o altri tipi di credenziali ...) -
AlgorithmInput
contiene anche dati che indicano quale implementazione di una particolare interfaccia dovrebbe essere usato (per esempio: c'è un interfacciaISorter
e due implementazioni:MergeSorter
, %codice%. Ci sono classi che dipendono daRadixSorter
e non importa quale è usato, questa informazione sarà parte dell'input) -
ISorter
internamente dipende da un numero non banale di classi. La sua complessità suggerisce che agisce come un separato sub-applicazione.
Non posso davvero configurare l'algoritmo al di fuori della libreria, perché ho bisogno di dati di runtime per questo. Ma non dovrei fare riferimento al contenitore dalla libreria (o da qualsiasi altro componente). Come si risolve solitamente questo scenario? (Credo che debba essere un caso ben noto).