Aula sensacional, mt boa explicação, ia aplicar o Exception Filter no projeto que tô trabalhando que aprendi num curso, mas essa abordagem achei mt melhor, só pra diminuir a controller talvez de pra fazer uma função recebendo os erros e tratando lá pra não tratar mais de 1 erro na controller e ficar enorme
parabéns pelo vídeo! tenho algumas considerações com relação ao seu comentário de que validação de regra de negócio não deve jogar exceção... neste caso que você mostrou do vídeo, eu concordo com a abordagem. Mas pensando em uma classe de domínio mais rica, na minha visão, deveria ser utilizado exception no construtor, e nos métodos dentro da classe. Você colocou as regras dentro do service, deve ter feito isso até para ter um exemplo para mostrar o result pattern. Mas no meu mundo ideal, essa regra de não criar carro com a letra "M", deveria estar dentro do construtor da classe Car, não no service, e na camada da controller, teria um data annotation, ou alguma validação para não permitir criar carro com a letra m, e ali sim teria um retorno amigável. Penso que em classe de domínio, deve ter uma proteção para não permitir criar um objeto em um estado inválido, então de dentro da classe de domínio eu jamais retornaria um result, até porque isso obrigaria quem ta chamando a classe a sempre ficar colocando ifs, e se por acaso alguém não colocar um if, e logo após vier um ctx.SaveChanges(), então foi persistido o Car no DB em um estado invalido.
Fala meu amigo Cris, aproveitando a sua informação sobre a classe ser internal, gostaria de reforçar também a necessidade de tornar o serviço que é injetado no container como sealed, para que nenhum pé de pano herde ele num momento de epifania e queira extender uma classe provida pela DI hahaha
Muito bom, já deixei meu like!!! Manja de SignalR? Ultimamente estou com algumas dificuldades pra manter a conexão aberta seria bom um vídeo sobre pra ver se tenho alguns insights.
explica melhor o problema. Quando cai a conexão? Onde e quando ela é feita? Dentro ou fora de componentes de apresentacao? Conexão com Signalr não é para cair não. Ele tem até protocolo de ping e pong para manter a conexão ativa em caso de inatividade. Uma coisa que pode ser também é no caso de ficar inativo por conta de IDle no browser, aí precisa configurar reconexão automática e a estratégia de reconexão. Sem mais detalhes fica dificil entender seu caso.
Cristian, quando trabalhamos com response headers, precisamos expor eles para que o client consiga acessá-los, por conta do CORS. Recentemente tive que incluir isso no arquivo de configuração (Program.cs) de uma aplicação minha, porém queria saber como você aborda isso geralmente?
Não conhecia essa biblioteca... estou usando uma outra estratégia, devolvendo um objeto container que tem duas propriedades, Data e Error. Na controller verificava qual das duas propriedades trouxe valor para retornar o status code adequado
Na prática você utilizaria em conjunto, ao invés de lançar exceptions (exceptions são caras...) para retornar os erros de validação do FluentValidation você poderia retornar os um TSuccess (o caminho feliz) ou um TError (os errors de validação)
Como eu definiria o retorno desse endpoint? No projeto em que estou trabalhando na assinatura de todo endpoint tem o objeto que é retornado por esse endpoint. Como faria nesse caso?
@@mateusantonio8912 provavelmente está usando controllers ao invés de minimal, nesse caso, usei minimal, ai todo retorno vem do Results, que define qual o código de status code de retorno… não sei se consegui te ajudar.
Se for esse o caso, poderia usar isso acima da controller em questão, pra cada tipo de resposta que vc pretende retornar [ProducesResponseType(typeof(ResponseActivityJson), StatusCodes.Status201Created)] [ProducesResponseType(typeof(ResponseErrorsJson), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ResponseErrorsJson), StatusCodes.Status404NotFound)]
@@OQueLucas No meu caso não utilizamos essas anotações "ProducesResponseType", a gente só define o que vai ser retornado na assinatura do método. Exemplo: [HttpPost] public async Task ValidateDocument([FromBody] string Document) Nessa situação como eu faria pra definir que esse endpoint pode retornar um DocumentResultModel Ou um ErrorResultModel?
Fala, Cristian. Deixa eu aproveitar pra perguntar quanto você paga na licença anual do rider? Eu tenho free por conta da faculdade mas quero saber se vale a pena mantê-lo $$
E se eu tiver uma entidade de domínio, eu posso lançar uma exceção por lá caso uma regra de negócio não seja atendida, pegar ela no caso de uso e retornar assim?
N sei se daria um bom topico para video mas sempre tive duvidas sobre a melhor forma de lidar com dependencias no npm. Ja tive problemas de pegar um projeto (sustentação) com 2 libs que cada uma usava uma versão diferente do angular core e chegou um ponto que ficou insustentavel (peguei o projeto no meio do caminho, não sei se no meio dele alguem atualizou a versão do angular e não se atentou a isso), e o projeto quebrou e não sabia nem como lidar com isso. Existe alguma "boa pratica" para gerenciar dependencias ou vc vai só adicionando as versões mais atuais e deixa o npm lidar com tudo isso? e quando da um conflito desses oque fazer?
só o ponto sobre as extensions da outra camada já valeu o like
Excelente vídeo Cristian, muito útil.
Explicação muito clara.
Parabéns.
Valeu demais mano, fico feliz que curtiu!
Chegando de voadora no like!!! O conteúdo do cara é top!!
Muito bom, refatorei todo meu projeto de exceptions para essa abordagem.
Bah Cristian venho tentando explicar isso a anos para os DEVs com que trabalho/trabalhei e é difícil convencer o pessoal! Excelente vídeo!
Aula sensacional, mt boa explicação, ia aplicar o Exception Filter no projeto que tô trabalhando que aprendi num curso, mas essa abordagem achei mt melhor, só pra diminuir a controller talvez de pra fazer uma função recebendo os erros e tratando lá pra não tratar mais de 1 erro na controller e ficar enorme
Sim mano, eu mesmo tenho funcoes que retornam o status code com base no Type do erro, boaaaa!
Cara vc manda muito bem, Ótima didática, Gostara sim saber mais sobre o inpicit operator
parabéns pelo vídeo!
tenho algumas considerações com relação ao seu comentário de que validação de regra de negócio não deve jogar exceção... neste caso que você mostrou do vídeo, eu concordo com a abordagem.
Mas pensando em uma classe de domínio mais rica, na minha visão, deveria ser utilizado exception no construtor, e nos métodos dentro da classe.
Você colocou as regras dentro do service, deve ter feito isso até para ter um exemplo para mostrar o result pattern. Mas no meu mundo ideal, essa regra de não criar carro com a letra "M", deveria estar dentro do construtor da classe Car, não no service, e na camada da controller, teria um data annotation, ou alguma validação para não permitir criar carro com a letra m, e ali sim teria um retorno amigável.
Penso que em classe de domínio, deve ter uma proteção para não permitir criar um objeto em um estado inválido, então de dentro da classe de domínio eu jamais retornaria um result, até porque isso obrigaria quem ta chamando a classe a sempre ficar colocando ifs, e se por acaso alguém não colocar um if, e logo após vier um ctx.SaveChanges(), então foi persistido o Car no DB em um estado invalido.
Muito bom Christian, não usar o try catch e nem um monte de if sujo ja é otimo, boa dica do OneOf.
Que aulaaa tooppp, só fiquei com uma dúvida, se as classes de implementações das interfaces são internal, como faria para testes unitários?
Fiquei com a mesma dúvida, não encontrei nenhuma saída pra isso.
Pesquise por InternalVisibleTo, é uma forma de deixar visível apenas para o projeto de teste mano
Fala meu amigo Cris, aproveitando a sua informação sobre a classe ser internal, gostaria de reforçar também a necessidade de tornar o serviço que é injetado no container como sealed, para que nenhum pé de pano herde ele num momento de epifania e queira extender uma classe provida pela DI hahaha
@@rodrigol3onardo hahahaahah boa lembrada mano 😂😂😂
Muito bom mesmo.
Muito bom, já deixei meu like!!!
Manja de SignalR? Ultimamente estou com algumas dificuldades pra manter a conexão aberta seria bom um vídeo sobre pra ver se tenho alguns insights.
explica melhor o problema. Quando cai a conexão? Onde e quando ela é feita? Dentro ou fora de componentes de apresentacao? Conexão com Signalr não é para cair não. Ele tem até protocolo de ping e pong para manter a conexão ativa em caso de inatividade. Uma coisa que pode ser também é no caso de ficar inativo por conta de IDle no browser, aí precisa configurar reconexão automática e a estratégia de reconexão. Sem mais detalhes fica dificil entender seu caso.
Por acaso você tem algum curso, ou somente pelo you tube? Sua didática é muito boa.
Ainda não tenho curso mano, já que chega 👏🏻👏🏻
Eu uso OneOf em prod e gosto muito, só tive problemas com o uso do Switch, fora isso ficou bem clean o codigo ( livre de algumas exception)
Cristian, quando trabalhamos com response headers, precisamos expor eles para que o client consiga acessá-los, por conta do CORS. Recentemente tive que incluir isso no arquivo de configuração (Program.cs) de uma aplicação minha, porém queria saber como você aborda isso geralmente?
Cristian tem uma maneira de fazer o enum retornar o nome e não o número na serialização, procura por JsonStringEnumConverter
Muito boa essa dica, amigo. Obrigado.
muito bom
Não conhecia essa biblioteca... estou usando uma outra estratégia, devolvendo um objeto container que tem duas propriedades, Data e Error. Na controller verificava qual das duas propriedades trouxe valor para retornar o status code adequado
Muito bom essa metodologia. Por mais vídeos assim!
Uma dúvida: Quais os ponsotos positivos de usar OneOf ao inves de Fluent Validation?
Na prática você utilizaria em conjunto, ao invés de lançar exceptions (exceptions são caras...) para retornar os erros de validação do FluentValidation você poderia retornar os um TSuccess (o caminho feliz) ou um TError (os errors de validação)
@@nandoandrade34 Valeu!
show de bola, parabens..
Como eu definiria o retorno desse endpoint? No projeto em que estou trabalhando na assinatura de todo endpoint tem o objeto que é retornado por esse endpoint. Como faria nesse caso?
@@mateusantonio8912 provavelmente está usando controllers ao invés de minimal, nesse caso, usei minimal, ai todo retorno vem do Results, que define qual o código de status code de retorno… não sei se consegui te ajudar.
Acredito que vc se refere ao payload que vai vir que podemos visualizar no swagger, seria isso?
Se for esse o caso, poderia usar isso acima da controller em questão, pra cada tipo de resposta que vc pretende retornar
[ProducesResponseType(typeof(ResponseActivityJson), StatusCodes.Status201Created)]
[ProducesResponseType(typeof(ResponseErrorsJson), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ResponseErrorsJson), StatusCodes.Status404NotFound)]
@@OQueLucas No meu caso não utilizamos essas anotações "ProducesResponseType", a gente só define o que vai ser retornado na assinatura do método.
Exemplo:
[HttpPost]
public async Task ValidateDocument([FromBody] string Document)
Nessa situação como eu faria pra definir que esse endpoint pode retornar um DocumentResultModel Ou um ErrorResultModel?
Fala, Cristian. Deixa eu aproveitar pra perguntar quanto você paga na licença anual do rider? Eu tenho free por conta da faculdade mas quero saber se vale a pena mantê-lo $$
@@juniorodrigues8198 15 dólares mano, acho que vale a pena manter se não usa o Windows para .Net
@@cristianwilliamdev Obrigado, é que estou pensando em começar a usar linux pra me ambientar em um novo SO. E a longo prazo ir para o MAC
ae cris fala de testes no angular
E se eu tiver uma entidade de domínio, eu posso lançar uma exceção por lá caso uma regra de negócio não seja atendida, pegar ela no caso de uso e retornar assim?
Qual sua setup de fonte para os comentários ficarem assim?
Tem um vídeo no canal pra isso brow, massa demais
muito legal!!
N sei se daria um bom topico para video mas sempre tive duvidas sobre a melhor forma de lidar com dependencias no npm. Ja tive problemas de pegar um projeto (sustentação) com 2 libs que cada uma usava uma versão diferente do angular core e chegou um ponto que ficou insustentavel (peguei o projeto no meio do caminho, não sei se no meio dele alguem atualizou a versão do angular e não se atentou a isso), e o projeto quebrou e não sabia nem como lidar com isso. Existe alguma "boa pratica" para gerenciar dependencias ou vc vai só adicionando as versões mais atuais e deixa o npm lidar com tudo isso? e quando da um conflito desses oque fazer?