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.

È stato utile?

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.

La soluzione DI standard quando è necessario mappare un'istanza di run-time per una dipendenza è quello di utilizzare un Abstract Factory .

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top