2010-09-22 3 views
5

Vedo metodi per enumerare elenchi di collegamenti per un determinato servizio (tipo), ma da nessuna parte trovo un metodo che restituisce un elenco di tutto ciò che è stato associato ai miei moduli caricati. Sto cercando qualcosa come Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()Come elencare tutti gli IBindings registrati in Ninject?

Esiste? In caso contrario, potrei essere in grado di creare un'estensione che potrebbe farlo? Avrei bisogno di essere in grado di raggiungere i binding senza un tipo di servizio ...

+0

Può spiegare perché lo vuoi, wat hai intenzione di fare quando vi diciamo come: P –

risposta

2

Ho controllato il codice e non ho visto un modo per richiedere tutti i binding. Se sei a tuo agio con modificandolo e utilizzando il codice modificato, ecco cosa si può fare:

a IKernel.cs, aggiungere:

/// <summary> 
    /// Gets all registered bindings 
    /// </summary> 
    IEnumerable<IBinding> GetBindings(); 

a KernelBase.cs, aggiungere:

/// <summary> 
    /// Gets all registered bindings 
    /// </summary> 
    public virtual IEnumerable<IBinding> GetBindings() 
    { 
     return _bindings.SelectMany(kvp => kvp.Value); 
    } 

e ricompilare.

da usare:

var bindings = Kernel.GetBindings(); 
    bindings.ForEach(b => logger.DebugFormat("Binding: {0} -> {1}", b.Service, b.Target)); 
1

Mentre @ Dave thieben isnt lontano dal vero, sembrerebbe che il percorso in senza richiedere forkage può essere quello di registrare un personalizzato IBindingResolver componente nel kernel e poi inventare un IRequest che riconoscerà, eventualmente attraverso ResolutionExtensions.GetAll() (in generale, la maggior parte richiedono di specificare un service (anche se nessuno Ensure.NotNull su di esso, alcuni vanno partito su di esso assumendo NotNull).

Ma si è dimenticato di dire perché lo vuoi.

Così mi raccomando:

  1. dire ciò che si vuole
  2. chiedendo sulla mailing list Ninject, compresa la risposta alla # 1 - questa non è una domanda per principianti!
+0

ooh, che figata. Non l'avevo considerato. –

+1

Thx Dave; grazie Ruben. Ci scusiamo per il ritardo, non ho avuto "Notifica" controllato. Questo era originariamente per il puro scopo di fornire un singolo punto di ingresso in un framework, ad esempio una classe FrameworkServices che fornisse un elenco dei discendenti di IFrameworkService che erano stati associati; quindi chiamare il codice poteva verificare con il Manager quali associazioni di servizio erano disponibili ... Da allora ho intrapreso un percorso diverso, anche se mi piacerebbe ancora essere in grado di ottenere un elenco di tutti i collegamenti. ;-) –

+0

@Robert Leahey: ci sono un buon numero di chiamate che fanno quello che vuoi (trova i bindegni per un servizio specifico) integrato. Il modo in cui lo hai chiesto ti suggeriva di volere tutti i collegamenti per tutti i servizi, il che è un po 'complicato . Ci sono chiamate per ottenere associazioni e ci sono richieste per ottenere IEnumerable o array di implementazioni di un servizio. Ci sono anche un set di API per mettere i metadati sui binding per aiutarne uno nella selezione programmatica di uno appropriato al momento della risoluzione, in modo imperativo o dichiarativo –

1

sono stato in grado di utilizzare la riflessione per fare questo:

KernelBase baseKernel = (KernelBase)Kernel; 

// _commandCollection is an instance, private member 
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 

// Retrieve a FieldInfo instance corresponding to the field 
FieldInfo field = typeof(KernelBase).GetField("bindings", flags); 

Multimap<Type, IBinding> bindingsMap = (Multimap<Type, IBinding>)field.GetValue(baseKernel); 

bindingsMap.SelectMany(x => x.Value).ToList().ForEach(x => log.DebugFormat("Binding: {0} -> {1}", x.Service, x.Target)); 
+0

Questo ha davvero fatto il trucco per te? L'ho provato con l'ultima versione di Ninject, e per i miei binding, 'x.Target' stampa solo' Type'. I valori di destinazione del binding interno di Ninject erano uno dei seguenti: {'Costante',' Metodo', 'Sé',' Tipo', 'Fornitore'}. Non sono riuscito a trovare alcun metodo su 'x.Target' da usare per ottenere il nome effettivo del target (' x.Target.GetType(). Nome' non mi ha dato nulla di utile) – Jeff

+0

No, penso di aver avuto lo stesso problema in realtà. Non ho mai trovato un ottimo modo per visualizzare queste informazioni. –