es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Autofac: Agregar registro después de haber agregado un registro

Quiero suscribirme a un evento global que se invoca después de que se agregue un registro.

No quiero suscribirme manualmente a un evento para cada servicio/componente registrado, porque eso es código repetitivo y es fácil olvidarlo al agregar nuevos registros.

Cuando se dispara el evento, quiero hacer algunas comprobaciones en los registros ya registrados y si se cumple una condición, por ejemplo, si es un registro con nombre y es de tipo referencia, entonces quiero agregar registros adicionales/nuevos, esto debe ocurrir antes de que se construya el contenedor.

¿Cuál es la forma correcta de lograr esto?

¿Puedo hacerlo en un CustomModule que derive de Module?

Saludos

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes lograr esto creando un módulo personalizado de Autofac que herede de Module. En este módulo, puedes anular el método Load y suscribirte al evento ComponentRegistryBuilder.Registered, que se invoca después de que se haya agregado un componente/registro al contenedor.

    Aquí tienes un ejemplo de implementación:

    public class MyCustomModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.Registered += (sender, args) =>
            {
                // Verificar si el servicio registrado es un registro con nombre y es un tipo de referencia
                if (args.ComponentRegistration.Services.OfType<namedservice>().Any() && args.ComponentRegistration.Activator.LimitType.IsClass)
                {
                    // Agregar registros adicionales
                    builder.RegisterType<myadditionalservice>().As<imyadditionalservice>().SingleInstance();
                }
            };
        }
    }
    

    En el ejemplo anterior, nos suscribimos al evento Registered y verificamos si el servicio registrado es un registro con nombre y es un tipo de referencia. Si es así, agregamos un registro adicional para MyAdditionalService como singleton.

    Luego, puedes registrar tu módulo personalizado en el constructor del contenedor de la siguiente manera:

    var builder = new ContainerBuilder();
    builder.RegisterModule(new MyCustomModule());
    

    De esta manera, no tienes que suscribirte manualmente al evento para cada servicio/componente registrado y tus registros adicionales se agregan automáticamente cuando se cumple la condición.

Comments are closed.