Pregunta

¿Es posible realizar un procesamiento personalizado cuando Windsor instancia un tipo?

Algo similar a:

        container.Register(
                  AllTypes.Pick()
                      .FromAssembly(Assembly.GetExecutingAssembly())
                      .BasedOn<MyMarkerInterface>()
                      .WhenInstantiating(instance => // do some stuff with this instance)
                      .Configure(component => component.Startable().LifeStyle.Singleton)
                      .WithService.Base());

Actualmente estamos usando Istartable. Dado que el código "Iniciar" (es decir, el procesamiento personalizado) es idéntico, sería bueno sacar esta lógica de cada clase.

¡Gracias! Brio

¿Fue útil?

Solución

Te refieres a algo como OnCreate ¿método?

    container.Register(
              AllTypes.FromAssembly(Assembly.GetExecutingAssembly())
                  .BasedOn<MyMarkerInterface>()
                  .WithService.Base()
                  .OnCreate((kernel, instance) => instance.CreatedAt = DateTime.Now)
);

Singleton es un estilo de vida predeterminado, por lo que no tiene que indicarlo explícitamente.

Sin embargo, observe que el comportamiento es ligeramente diferente aquí, en comparación con cómo funciona la instalación inicial.

  • Cuando el componente es inicial, es instanciado y iniciado por el contenedor en sí, lo antes posible (cuando todas sus dependencias requeridas estén disponibles).
  • OnCreate se llama antes de que su componente se devuelva desde el contenedor, pero no lo crea de manera proactiva. Así que si Nunca tire de este componente, no se llamará a su creación.

Además, si bien los documentos afirman que OnCreate vive en una instalación, ya no es cierto (sí, necesitamos actualizar documentos). Este método funcionará fuera de la caja.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top