2011-01-13 16 views
6

Hemos comenzado a usar la versión 2 de Ninject como nuestro contenedor IoC junto con la extensión para resolver mediante convenciones de nombres. También estamos usando log4net para nuestro registro.Inicio de aplicación de dependencias resueltas de ninject Log-in

Lo que me gustaría es que Ninject registre todas las dependencias que ha encontrado y lo que las resolverá, preferiblemente en el inicio de la aplicación.

He encontrado la extensión de registro, pero no puedo encontrar documentación o ejemplos sobre cómo usarla para obtener esto.

Editar:

Desde que se solicita aquí es la clase que registra los enlaces predeterminados en el arranque, usando log4net

DefaultBindingGeneratorWithLogging clase pública: IBindingGenerator { sólo lectura privada iKernel kernel;

/// <summary> 
    /// Initializes a new instance of the <see cref="DefaultBindingGeneratorWithLogging"/> class. 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    public DefaultBindingGeneratorWithLogging(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    /// <summary> 
    /// Creates the bindings for a type. 
    /// </summary> 
    /// <param name="type">The type for which the bindings are created.</param> 
    /// <param name="bindingRoot">The binding root that is used to create the bindings.</param> 
    /// <returns> 
    /// The syntaxes for the created bindings to configure more options. 
    /// </returns> 
    public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot) 
    { 
     if (type.IsInterface || type.IsAbstract) 
     { 
      yield break; 
     } 

     Type interfaceForType = type.GetInterface("I" + type.Name, false); 
     if (interfaceForType == null) 
     { 
      yield break; 
     } 

     var log = kernel.Get<ILog>(); 
     if (!(kernel.GetBindings(interfaceForType).Any())) 
     { 
      bindingRoot.Bind(interfaceForType).To(type).InTransientScope(); 
      if (log.IsInfoEnabled && !String.IsNullOrWhiteSpace(interfaceForType.FullName)) 
      { 
       log.InfoFormat("Mapping {0} -> {1}", type.FullName, interfaceForType.FullName); 
      } 
     } 
     else 
     {     
      log.InfoFormat("Didn't map {0} -> {1} mapping already exists", type.FullName, interfaceForType.FullName); 
     } 
    } 
} 

Respuesta

13

es probable que pueda lograr lo que estamos tratando de hacer mediante la creación de su propia instancia de 'ActivationStrategy'. Aquí está uno que estaba usando para controlar la activación/desactivación:

public class MyMonitorActivationStrategy : ActivationStrategy 
{ 
    private ILogger _logger; 

    public override void Activate(Ninject.Activation.IContext context, Ninject.Activation.InstanceReference reference) 
    { 
     if(reference.Instance is ILogger) 
     { 
      _logger = (ILogger)reference.Instance; 
     } 
     _logger.Debug("Ninject Activate: " + reference.Instance.GetType()); 
     base.Activate(context, reference); 
    } 

    public override void Deactivate(Ninject.Activation.IContext context, Ninject.Activation.InstanceReference reference) 
    { 
     _logger.Debug("Ninject DeActivate: " + reference.Instance.GetType()); 
     base.Deactivate(context, reference); 
    } 
} 

Usted alambre de esto cuando se crea el núcleo.

protected override IKernel CreateKernel() 
    { 
    var kernel = new StandardKernel(); 
     kernel.Components.Add<IActivationStrategy, MyMonitorActivationStrategy>(); 

     kernel.Load<AppModule>(); 

     return kernel; 
    } 

Espero que esto ayude.

Bob

+0

Nota: Esto registra los enlaces cuando se activan/desactivan. Un poco diferente de iniciar sesión en el inicio, pero ¿puede ser útil? – rcravens

+0

Definitivamente útil. Me gustaría encontrar un código para registrar los enlaces basados ​​en la convención creando mi propia clase para registrarlos tal como se encontraron, pero también me gustaría registrar la activación/desactivación, así que esto es genial. – Mant101

+2

@ Mant101, si pudiera compartir el código para el registro de enlaces basado en convenciones para que sea completo y sea útil para esta pregunta. – user3141326

Cuestiones relacionadas