2010-09-22 24 views
5

Veo métodos para enumerar listas de enlaces para un determinado servicio (tipo), pero en ninguna parte encuentro un método que devuelve una lista de todo lo que se ha vinculado en mis módulos cargados. Estoy buscando algo así como Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()¿Cómo enumerar todos los enlaces registrados en Ninject?

¿Esto existe? Si no, ¿podría ser capaz de construir una extensión que podría hacerlo? Tendría que poder acceder a los enlaces sin un tipo de servicio ...

+0

¿Puede explicar por qué lo quiere, wat vas a hacer cuando te decimos cómo: P –

Respuesta

2

Miré el código y no vi la forma de solicitar todas las vinculaciones. Si se siente cómodo con la modificación y usando el código modificado, esto es lo que puede hacer:

a IKernel.cs, añadir:

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

a KernelBase.cs, añadir:

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

y vuelva a compilar.

de usar:

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

Mientras @dave thieben isnt muy mal, parece que en su ruta sin necesidad de forkage puede ser personalizada para registrar un componente IBindingResolver en el Kernel y luego inventar un IRequest que reconocerá, posiblemente a través de ResolutionExtensions.GetAll() (en general, la mayoría requieren que usted especifique una service (aunque ninguno Ensure.NotNull en él, algunos van partido en él asumiendo NotNull).

Pero se le olvidó decir por qué lo quiere.

Así que recomiendo:

  1. diciendo lo que quiere
  2. preguntar en la lista de correo ninject, incluyendo la respuesta a # 1 - esto no es una cuestión principiante!
+0

ooh, eso está bien. No había considerado eso. –

+1

Thx Dave; gracias Rubén. Perdón por el retraso, no he marcado "Notificar". Esto fue originalmente para proporcionar un punto de entrada singular en un marco, es decir, una clase FrameworkServices que proporcionaría una lista de los descendientes IFrameworkService que se habían enlazado; por lo tanto, el código de llamada podría verificar con el administrador qué enlaces de servicio estaban disponibles ... Desde entonces, he ido por una ruta diferente, aunque aún me gustaría poder obtener una lista de todas las vinculaciones. ;-) –

+0

@Robert Leahey: Hay algunas buenas llamadas que hacen lo que quieres (encuentra los enlaces para un servicio específico) integradas. La forma en que lo preguntaste sugería que querías todas las vinculaciones para todos los servicios, que es el truco . Hay llamadas para obtener enlaces y hay llamadas para obtener IEnumerable o matrices de implementaciones de un servicio. También hay un conjunto de API para poner metadatos en los enlaces con el fin de ayudar a uno a seleccionar programáticamente uno apropiado en tiempo de resolución, ya sea imperativa o declarativamente –

1

que era capaz de utilizar la reflexión para hacer esto:

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

¿Esto realmente te hizo el truco? Lo intenté con la última versión de lanzamiento de Ninject, y para mis propios enlaces, 'x.Target' solo imprime' Type'. Los valores objetivo de enlace interno de Ninject fueron uno de los siguientes: {'Constant',' Method', 'Self',' Type', 'Provider'}. No pude encontrar ningún método en 'x.Target' para usar para obtener el nombre del objetivo real (' x.Target.GetType(). Name' no me dio nada útil) – Jeff

+0

No, creo que tuve el mismo problema en realidad. Nunca encontré una excelente manera de mostrar esta información. –

Cuestiones relacionadas