Domanda

Prima di tutto, sto usando Ninject 2.0

Ho la mia pagina principale in cui vorrei iniettare, ma non sono sicuro di come. Quello che ho provato è stato creato una classe che deriva da System.Web.Mvc.ViewMasterPage e quindi ho creato le mie proprietà:

[Inject]
public ICacheService<List<Category>> Categories { get; set; }
[Inject]
public IConfigurationSettings Config { get; set; }

Quando eseguo la mia pagina nessuna delle proprietà viene impostata e sono entrambe nulle. Qualche idea sul perché o sull'esempio su come farlo? Grazie

- Aggiorna

Quindi ho fatto più ricerche e sembra che debba risolvere da solo gli oggetti all'interno della classe perché Ninject non intercetta la creazione della classe. Quindi ora la mia domanda è: come posso creare un resolver per il mio kernel? Il codice sopra è all'interno di una libreria di classi, quindi non ho un riferimento al kernel. Ho provato quanto segue: (leggermente modificato da http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy -Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-is-Developers-Who-Pretend-To-Move-Forward.aspx )

public class KernelResolver
{
    private static IKernel _kernel;

    public KernelResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public static T Resolve<T>()
    {
        return _kernel.Get<T>();
    }
}

e quindi registrato:

Bind<KernelResolver>().ToSelf()

Eppure il kernel è nullo ... Ho solo bisogno di vedere alcuni esempi ma non riesco a trovarne nessuno o potrebbe essere che sono così confuso che non so cosa sto cercando: \

Qualsiasi aiuto è molto apprezzato!

È stato utile?

Soluzione

Inizierò chiedendo: perché vuoi iniettare qualcosa in una pagina master? Se stai usando MVC, vuoi davvero usare i modelli per passare i dati alle tue viste (inclusa la pagina principale) tramite un controller. Questa è l'essenza di un framework MVC, se forse troppo semplificato.

Ciò che Ninject o altri contenitori IoC possono fare per te è aiutarti a creare le tue classi di controller e iniettare dipendenze in esse - in effetti il ??punto di integrazione per i contenitori IoC in ASP.Net si assume in genere la responsabilità della fabbrica di controller.

L'iniezione di dipendenze appropriate nel controller può aiutare il controller a determinare il modello o lo stato appropriato del modello da passare alle visualizzazioni (inclusa la pagina principale).

Mi piace pensare al modello MVC (e, in tal caso, ASP.Net MVC) come a porre la responsabilità di tutto il processo decisionale (cioè controllo ) nelle classi del controller. Le decisioni prese dai controller possono essere modellate da numerosi input (ad es. Configurazione, input dell'utente, ambiente, ecc.) Ma a un certo punto il controller passa un modello a una vista. Penso al modello che contiene lo stato dell'oggetto del sistema. Le opinioni, secondo me, specialmente in ASP.Net MVC, sono meglio considerate prive di qualsiasi logica e più simili a "script". rispetto a classi vere o cititzen di prima classe in alcuni modelli di oggetti.

Forse hai un motivo valido per rendere la tua pagina principale di visualizzazione "più intelligente", ma in genere, i tipi di cose che stai cercando di iniettare sono meglio iniettati nel tuo controller e i dati richiesti sono passati alla tua vista. Sarei curioso di sapere di più su ciò che stai cercando di realizzare.

Nota: puoi configurare facilmente l'integrazione di Ninject con MVC per iniettare tutte le dipendenze dei tuoi controller. Dai un'occhiata a StackOverflow domanda / risposta thread per i dettagli.

Altri suggerimenti

La classe KernelResolver implementa un modello di localizzazione del servizio (chiedendo qualcosa [centrale] per le tue dipendenze), che è generalmente più un'ultima risorsa che un approccio primario. Quello che vuoi davvero è far funzionare l'iniezione di dipendenza.

Non devi assolutamente Associare KernelResolver a qualsiasi cosa: funge da contenitore generale e il sistema (ad esempio le fabbriche di MVC) deve essere collegato per ottenerlo dare una mano.

Gli attributi [Inject] non fanno nulla di magico da soli - vengono usati da Ninject quando qualcuno lo richiede per iniettare un oggetto di quel tipo.

Quello che stai cercando è un esempio di come dici a MVC di chiamare Ninject al momento giusto, che ti permetterò di cercare (ninject " asp.net mvc " example?).

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