modello Design Strategy con i contenitori del CIO - Ninject specificamente
-
25-09-2019 - |
Domanda
Ho una classe che sta per essere necessario utilizzare il modello di progettazione strategia. In fase di esecuzione sono tenuto a passare algoritmi diversi dentro e fuori per vedere gli effetti sulle prestazioni dell'applicazione.
La classe in questione assume attualmente quattro parametri nel costruttore, ognuno dei quali rappresenta un algoritmo.
Come utilizzare Ninject (o un approccio generalizzato) potrei ancora usare CIO ma utilizzare il modello di strategia?
Il limite di corrente è che il mio kernel (contenitore) è a conoscenza di ogni interfaccia algoritmo, ma che può essere associato ad una sola classe concreta. L'unico modo per aggirare questo posso vedere al momento è passare in tutte le otto algoritmi a costruzione, ma utilizzare diverse interfacce, ma questo sembra totalmente uncessary. Non vorrei fare questo se non stavo usando un contenitore CIO, quindi ci deve essere un modo per aggirare questo.
Esempio di codice:
class MyModule : NinjectModule
{
public override void Load()
{
Bind<Person>().ToSelf();
Bind<IAlgorithm>().To<TestAlgorithm>();
Bind<IAlgorithm>().To<ProductionAlgorithm>();
}
}
persona ha bisogno di fare uso di entrambi gli algoritmi in modo da poter cambiare in fase di esecuzione. Ma solo TestAlgorithm è legato, in quanto è il primo nel contenitore.
Soluzione
Facciamo un passo indietro ed esaminare un quadro un po 'più grande. Dal momento che si vuole essere in grado di cambiare strategia a run-time, ci deve essere un qualche tipo di segnalazione meccanismo che dice a persona per cambiare la strategia. Se l'applicazione è UI-driven, forse c'è un pulsante o elenco a discesa in cui l'utente può selezionare quale strategia da utilizzare, ma anche se questo non è il caso, un po 'di mosto chiamante esterno Mappa un pezzo dei dati di runtime a un'istanza della strategia.
Invece di registrare le singole strategie con il contenitore, si registra la fabbrica.
E 'del tutto possibile scrivere un API completa in modo che sia DI-friendly , ma ancora DI Container-agnostic .
Altri suggerimenti
Se è necessario variare l'attuazione IAlgorithm
in fase di esecuzione, è possibile modificare Person
di richiedere un algoritmo fabbrica , che fornisce diversi algoritmi di cemento in base alle condizioni di runtime.
Alcuni contenitori iniezione di dipendenza si lascia legano ai delegati creazionali anonime -. Se non supporti Ninject che, si potrebbe mettere la logica decisione in una di quelle