Domanda

Ho un po 'di dilemma, che a dire il vero è un caso marginale ma pone ancora un problema.

Attualmente sto usando Ninject MVC e legato tutti i miei controller in questo modo:

Kernel.Bind<SomeController>.ToSelf();

Il che funziona per il 99% delle cose che ho bisogno di fare, tuttavia al momento sto facendo alcune cose stravaganti attorno al routing dinamico e ai controller dinamici che mi richiedono di scrivere manualmente un metodo per ottenere il tipo di controller da Ninject. Ora inizialmente ho pensato che sarebbe stato facile, ma non è ... mi aspettavo di poter ottenere il controller in base al suo nome, ma non ha funzionato.

Kernel.Get<IController>("SomeController");

Questo mi ha fatto pensare che sia probabilmente perché è solo un legame con SomeController, non per icontroller. Quindi ho pensato, posso semplicemente scrivere tutti i miei attacchi in questo modo:

Kernel.Bind<IController>.To<SomeController>().Named("SomeController");

In questo modo dovrebbe essere facile ottenere il tipo di controller dal nome che fa il codice precedente, tuttavia se dovessi vincolarmi in questo modo, avrei un problema quando arrivo a bloccare i controller (poiché i plugin possono essere caricati e scaricati in fase di esecuzione). Quindi il normale:

Kernel.Unbind<SomeController>()

Il che è stato fantastico, non funzionerà più e dovrei fare:

Kernel.Unbind<IController>();

Tuttavia, poi mi sono reso conto che ho bisogno di dargli un vincolo per dirgli quale vincolante per questo tipo voglio schierarsi, e sembra che non ci siano sovraccarichi o DSL disponibili per farlo ...

Quindi sono intrappolato tra una roccia e un posto difficile, poiché ho bisogno di soddisfare il metodo ControllerLookup, ma ho anche bisogno di mantenerlo in modo da poter aggiungere e rimuovere facilmente le associazioni in fase di esecuzione.

protected override Type GetControllerType(RequestContext requestContext, string controllerName) { 
//... find and return type from ninject
}

Qualcuno ha qualche idea?

(Nel caso in cui chiunque mi faccia domande sul perché lo sto facendo, è a causa del modo in cui sto caricando plugin, Ninject conosce i tipi e gli spazi dei nomi, ma nel contesto della creazione di un controller non conosce lo spazio dei nomi solo il nome del controller, Quindi lo faccio per soddisfare l'isolamento del plug -in e la posizione del controller dinamico, è un modo rotondo per farlo, ma è quello che le persone hanno fatto con AutoFac prima Esempio di cosa simile con AutoFac)

Nessuna soluzione corretta

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