2010-01-20 11 views
14

Ho un metodo factory all'interno di un parser. Essenzialmente, mentre carico un token, cerco il gestore per quel token, o lo faccio passare al gestore predefinito. L'ho implementato come switch e come Dictionary<string,Type> ma entrambi gli approcci mi richiedono di memorizzare il mapping da qualche altra parte rispetto alla classe del gestore.Utilizzo di IOM Ninject per sostituire una fabbrica

Stiamo usando Ninject per CIO e così ho capito che possiamo anche farlo utilizzando

kernel.Get<ITokenHandler>(tokenName); 

ma questo non mi salva memorizzare le informazioni su ciò che gettone il gestore può affrontare in 2 posizioni . C'è un modo per decorare il gestore in modo che questo venga mappato automaticamente?

risposta

11

Se seguo correttamente la tua domanda, sembra che tu voglia recuperare un binding con nome. Non hai menzionato la versione di Ninject che stai utilizzando, ma in base al tuo frammento di codice, suppongo che tu stia usando Ninject 2.0. Se questo è il caso, allora penserei questo sarebbe sufficiente per il vostro legame nel vostro modulo:

Bind<ITokenHandler>().To<YourConcreteTypeHere>().Named(tokenName); 

Si associa il maggior numero di tipi concreti alla stessa interfaccia e differenziarli in base al nome, e quindi recuperare utilizzando la precisa sintassi hai specificato nella tua domanda.

Se mi manca qualcosa chiave, fammi sapere.

+0

Un po 'tardi per tornare qui. Quello che stavo davvero cercando è stato un modo per contrassegnare le classi concrete di ITokenHandler in modo che potessi definire i binding in cui è stato dichiarato il Gestore. Ora sono andato con il tuo esempio: tutte le barre 1 dei vincoli sono del modello: Bind (). Per >(). Named (tokenName); – baralong

1

Una tecnica che ho utilizzato è quella relativa allo standard Bind in modo da poter richiedere la consegna di un parametro (nel contesto) nel punto in cui si desidera che qualcuno selezioni qualcosa.

Tra http://ninject.codeplex.com/wikipage?title=Providers%20and%20the%20Activation%20Context e http://ninject.codeplex.com/wikipage?title=Contextual%20Binding dovresti essere in grado di legare le cose in modo tale che puoi dire Only(When.Context...) per far funzionare la selezione?

+0

Solo visto l'altra risposta (come è stato fatto +1 su questo). L'altra risposta sembra un approccio molto più esplicito e chiaro, quindi preferirei sicuramente se possibile - il mio approccio è un approccio più generale per quando costruito in modi non possibili. –

Problemi correlati