Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Geracao de Link para outro endpoint! .net c#

Boa tarde,

Estou enfrentando um desafio em meu projeto, que envolve diversos endpoints. Atualmente, o fluxo consiste em obter dados do banco de dados, realizar o binding para DTO e retornar no formato JSON. No entanto, meu controlador está ficando extenso, com uma quantidade significativa de lógica, especialmente porque há objetos aninhados que exigem outros objectos (optei por não utilizar mapeamentos).

Sempre retorno um link para o objeto interno. Dentro do controlador, consigo usar o Url.Action, o que está funcionando bem. Recentemente, criei uma classe estática para realizar esse mapeamento, mas estou enfrentando dificuldades ao tentar criar o link fora do controlador. Já experimentei passar o UrlHelper como parâmetro, criar no construtor da controller, mas até agora não obtive sucesso.

Objecto de Exemplo dentro da controller:

var missaionReadDTO = missions.Select(m => new MissionReadDTO
            {
                Id = m.Id,
                Title = m.Title,
                Planet = new PlanetReadDTO {
                    id = m.Planet.id,
                    Name = m.Planet.Name,
                    Url = Url.Action("getById", "Planet", new { id = m.Planet.id }, Request.Scheme)
                },
                Goal = m.Goal,
                starships = m.starships.Select(s => new StarshipReadDTO
                {
                    id = s.id,
                    name = s.name,
                    model = s.model,
                    manufacturer = s.manufacturer,
                    link = Url.Action("getById", "Starship", new { id = s.id }, Request.Scheme)

                }).ToList()
            }).ToList();

Alguma ideia ou sugestão sobre como posso simplificar esse processo?

2 respostas
solução!

E aí, Adilson, tudo certo?

Bora descomplicar isso com algumas ideias:

  1. Separação de Responsabilidades: Tipo, é essencial dividir as tarefas pra facilitar a vida. Pensa em criar uns serviços específicos só pra cuidar dos links. Dá uma olhada nesse exemplo:

    public interface ILinkService
    {
        string GeneratePlanetLink(int planetId);
        string GenerateStarshipLink(int starshipId);
        // Coloca mais métodos se precisar
    }
    
    public class LinkService : ILinkService
    {
        private readonly IUrlHelper _urlHelper;
    
        public LinkService(IUrlHelper urlHelper)
        {
            _urlHelper = urlHelper;
        }
    
        // Implementa os métodos como esse abaixo
    }
    
  2. Injeção de Dependência: Garante que o LinkService seja injetado onde precisa. Usa a injeção de dependência do ASP.NET Core pra isso. Tipo assim:

    public class SuaController : Controller
    {
        private readonly ILinkService _linkService;
    
        public SuaController(ILinkService linkService)
        {
            _linkService = linkService;
        }
    
        // E mantém o resto do teu código de boa
    }
    
  3. Usa o Serviço no Mapeamento do DTO: No mapeamento do DTO, chama o serviço pra gerar os links e mantém o código na paz. Sacou?

    var missaionReadDTO = missions.Select(m => new MissionReadDTO
    {
        // Mantém as paradas antigas e acrescenta os links
    }).ToList();
    
  4. Centralização da Configuração de Rotas: Se precisar de configuração específica de rotas, centraliza isso no serviço. Tipo assim:

    // No LinkService
    _urlHelper.ActionContext.RouteData.Values["area"] = "SuaArea";
    

Essas dicas tão aí pra desenrolar o código, deixar mais fácil de entender e manter. Com injeção de dependência e serviços especializados, tu isola a bagunça e deixa o código mais clean.

TOOOOOOOOOOOOOP Mano, vllllw de mais pela ajuda!