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.

Registro de modelo genérico complejo en Autofac.

He estado intentando registrar mis clases DA con Autofac. (Estamos cambiando de MEF a Autofac…) pero no puedo hacer que funcione. Cuando hago una llamada a través de Swagger, la aplicación simplemente se detiene, sin lanzar una excepción ni nada. La salida me dice que iisexpress salió con un ‘Access violation’ Pero creo que la verdadera razón es una mala registración de la modelo con Autofac.

El modelo es el siguiente:

public abstract class EntityDa<tentity, tcontext=""> : IEntityDa<tentity>
   where TContext : IEntities
   where TEntity : class
{
   protected readonly TContext _entities;

   protected EntityDa(TContext entities)
   {
      _entities = entities;
   }
}

internal class PersonInfoDa : EntityDa<personinfo, ipersondataentities="">, IPersonInfoDa
{
   ...

   public PersonInfoDa(IPersonDataEntities entities, IStockDa stockDa, IPersonRelationDa personRelationDa) : base(entities)
   {
      ...
   }
}

Tengo muchas clases Da de estas, todas heredando de EntityDa de la misma manera que este ejemplo.

¿Cuál sería la forma correcta de registrarlas?
Tengo lo siguiente en mi módulo (lo cual no funciona)

builder.RegisterAssemblyTypes(this.ThisAssembly).AsImplementedInterfaces();

builder.RegisterGeneric(typeof(EntityDa<,>))
.As(typeof(IEntityDa))
.InstancePerDependency
“`

ACTUALIZACIÓN:

Es una excepción de StackOverflow la que ocurre. ¿Cómo puedo saber cuál es la causa raíz de esto?</personinfo,></tentity,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El registro de las clases DA con Autofac parece estar causando una excepción StackOverflowException en la aplicación. Una posible razón para esto es el registro incorrecto del modelo EntityDa con Autofac.

    La forma correcta de registrar EntityDa y sus clases derivadas con Autofac sería usar el método RegisterGeneric de la siguiente manera:

    builder.RegisterGeneric(typeof(EntityDa<,>)).As(typeof(IEntityDa<>)).InstancePerDependency();
    builder.RegisterAssemblyTypes(typeof(PersonInfoDa).Assembly).AsImplementedInterfaces().InstancePerDependency();
    

    La primera línea registra la clase genérica EntityDa como IEntityDa con Autofac y establece el ámbito de instancia de por vida en InstancePerDependency. La segunda línea registra todas las clases en la actual assembly que implementan una o más interfaces con Autofac y establece el ámbito de instancia de por vida en InstancePerDependency.

    Para identificar la causa raíz de StackOverflowException, puede usar un depurador para recorrer el código y identificar el punto donde ocurre la recursión infinita. Otro enfoque es verificar la pila de llamadas en los detalles de excepción, lo que puede proporcionar pistas sobre los métodos involucrados en la recursión.

Comments are closed.