2010-03-06 10 views
6

Ho una classe che dovrà utilizzare il modello di progettazione della strategia. In fase di esecuzione mi viene richiesto di attivare e disattivare diversi algoritmi per vedere gli effetti sulle prestazioni dell'applicazione.Strategia Modello di progettazione con contenitori IOC - Ninject specificatamente

La classe in questione richiede attualmente quattro parametri nel costruttore, ognuno dei quali rappresenta un algoritmo.

Come utilizzare Ninject (o un approccio generalizzato) è possibile utilizzare lo IOC ma utilizzare lo schema di strategia?

La limitazione corrente è che il mio kernel (contenitore) è a conoscenza di ogni interfaccia dell'algoritmo, ma che può essere associato solo a una classe concreta. L'unico modo in cui riesco a vedere al momento è passare in tutti e otto gli algoritmi in costruzione, ma usare interfacce diverse, ma questo sembra del tutto inconsapevole. Non lo farei se non utilizzassi un container IOC, quindi deve esserci un modo per aggirare questo problema.

Codice esempio:

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 è associato, poiché è il primo nel contenitore.

risposta

6

Facciamo un passo indietro ed esaminiamo un'immagine leggermente più grande. Dal momento che vuoi essere in grado di cambiare strategia in fase di esecuzione, ci deve essere una sorta di meccanismo di segnalazione che indica a Person di cambiare strategia. Se l'applicazione è guidata dall'interfaccia utente, forse esiste un pulsante o un elenco a discesa in cui l'utente può selezionare quale strategia utilizzare, ma anche se questo non è il caso, alcuni chiamanti esterni devono mappa un pezzo di dati di runtime a un'istanza della strategia.

standard DI solution when you need to map a run-time instance to a dependency is to use an Abstract Factory.

Invece di registrare le singole Strategie con il contenitore, si registra la fabbrica.

È completamente possibile scrivere un'API completa in modo che sia DI-friendly, but still DI Container-agnostic.

+0

Questo ha funzionato. Saluti. – Finglas

3

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 di dipendenze per l'iniezione consentono di associare delegati creativi anonimi - se supporta Ninject, è possibile inserire la logica decisionale in uno di questi.

Problemi correlati