1
resposta

[Dúvida] Problema com Proxy e desserialização dos dados

Estou enfrentando o seguinte problema ao tentar utilizar o endpoint get que retorna o artista pelo nome: erro com a mensagem: An unhandled exception occurred while processing the request.

Identifiquei em outros tópicos no forúm, outros alunos com esse mesmo problema, e com algumas soluções propostas, principalmente em relação a não utilização do LazyLoading, algo que eu não queria ter que fazer, por não saber se vamos utilizá-lo mais adiante no curso.

Ao invés de seguir com essa abordagem, encontrei uma outra possível solução, que seria passar o objeto recebido para um outro objeto, forçando uma materialização dele, evitando que os proxys sejam retornados. Segue meu código:

using ScreenSound.Banco;
using ScreenSound.Modelos;
using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
var app = builder.Build();

app.MapGet("/", () => "API do projeto ScreenSound está rondando!");

app.MapGet("/Artistas", () =>
{
    var DAL = new DAL<Artista>(new ScreenSoundContext());
    return Results.Ok(DAL.Listar());
});

app.MapGet("/Artistas/{nome}", (string nome) =>
{
    var DAL = new DAL<Artista>(new ScreenSoundContext());
    var artista = DAL.RecuperarPor(a => a.Nome.ToUpper().Equals(nome.ToUpper()));

    if (artista is null) return Results.NotFound();

    var artistaLimpo = new Artista(artista.Nome, artista.Bio)
    {
        Id = artista.Id,
    };

    return Results.Ok(artistaLimpo);
});

app.Run();

Queria saber se essa é uma boa abordagem, ou se existe alguma problemática envolvendo ela.

1 resposta

Bom dia

Sua abordagem de materializar o objeto antes de retorná-lo é válida e resolve o problema com proxies gerados pelo Lazy Loading. No entanto, um ponto de atenção é que, ao criar uma nova instância manualmente, você pode perder informações caso o objeto tenha relações aninhadas.

Uma alternativa melhor seria desabilitar o Lazy Loading apenas para essa consulta específica ou configurar a serialização para evitar ciclos de referência, como já fez com ReferenceHandler.IgnoreCycles. Outra opção seria utilizar .AsNoTracking() na query para evitar o tracking do EF.

Se quiser manter o Lazy Loading no projeto, testar essas alternativas pode ser uma boa ideia. O que acha?