.NET 6: Minimal APIs con Vertical Slice Architecture (Bonus: DDD)

Поделиться
HTML-код
  • Опубликовано: 25 июл 2024
  • En este vídeo explico el template que he estado realizando en este repositorio 👉🏽 github.com/isaacOjeda/Minimal....
    La intención de este template es crear una solución que implemente la arquitectura vertical (features).
    El hecho de que use Minimal APIs es irrelevante, podríamos estar usando Web APIs con controllers.
    También en mi blog hablo sobre este tema y tengo links de interés en donde baso todo este template 👉🏽 dev.to/isaacojeda/vertical-sl....
    Saludos y Happy Coding 🖖🏽.
    Timestamps:
    00:00 Introducción
    14:39 Demo
    15:38 Domain
    19:51 Features (Slices)
    36:07 Infrastructure (Persistence)
    40:59 Decorators (Cross cutting concerns)
    44:57 Web API (Minimal API)
    50:50 Debuggeando el flujo
    58:56 Preludio
    1:01:37 Integration Tests y Unit Tests
    1:11:40 Ejemplo: Nuevo Feature
  • НаукаНаука

Комментарии • 50

  • @gonzalorf
    @gonzalorf Год назад

    Excelente todo. Bien explicado, alta calidad el contenido, provee referencias, código... No entiendo por qué éste canal no está lleno de suscriptores. Saludos desde Argentina.

  • @exepinero5533
    @exepinero5533 Год назад

    Muy bueno Isaac, muy claro todo! Genial el contenido

  • @oscarpantaleon6840
    @oscarpantaleon6840 Год назад

    Excelente contenido y muy buena explicacion. revise a detalle el proyecto y personalmente me gusto mucho la formas de organizacion de las capas de DDD en folders y no en proyectos separados. muchas gracias !!!

  • @the.baxtian
    @the.baxtian Год назад

    Excelente man, gracias por acercarnos esta nueva forma de organizar nuestros proyectos. Una de las que mas me atrae para no volverme loco con tanto spaguetti de proyectos, simplemente para realizar una modificación o incorporar una nueva caracteristica.

  • @josoeichuta3893
    @josoeichuta3893 2 года назад

    Gracias por compartir tu conocimiento, me sirvieron de mucho

  • @delmirio
    @delmirio Год назад

    Excelente, esperamos con ansias más contenido. (y)

  • @jeduardocarvajal
    @jeduardocarvajal 2 года назад

    Excelente, este contenido vale oro

  • @HuneSilver
    @HuneSilver 2 года назад

    Buen video aprendí bastante, te animo a seguir haciendo mas 🙂

  • @alejandroarellanoaleman4791
    @alejandroarellanoaleman4791 2 года назад

    Excelente video!! Espero sigas subiendo contenido igual o mejor!!

  • @fernandopoveda9861
    @fernandopoveda9861 2 года назад

    Hola Isaac!! Que bueno que te hayas animado a crear tu canal...te felicito!! Cuando tengas dudas preguntas...XD XD. Saludos un abrazo

  • @Tamer_Ali
    @Tamer_Ali 10 месяцев назад

    Thanks a lot for this awesome video

  • @adriannlara
    @adriannlara 2 года назад

    gran contenido! saludos!

  • @hector9079
    @hector9079 2 года назад

    Muy bueno 👍🏾👍🏾

  • @Moly767
    @Moly767 6 месяцев назад

    Excelente Isaac, acabo de descubrir tu canal y la verdad que tienes mucho talento para esto, se te da bien explicar y con toda la experiencia que tienes da mucho gusto escucharte para aprender.
    Quisiera aprovechar para hacerte una pregunta, ya que soy nuevo en todo lo relacionado a la programación, apenas llevo 1 año de constante aprendizaje y horita quisiera meterme en patrones de diseño.
    De momento seguiré el estandar de clean architecture pero una vez que lo tenga bien digerido seguro que me meto a arquitecturas como la mencionada en este video, que por cierto, hasta yo entendí el propósito siendo nuevo, así imagínate lo bien que explicas.
    Como te decía, quisiera adentrarme en patrones de diseño y aquí la pregunta, qué patrones de diseño me recomiendas aprender como algo indispensable en .NET?
    Si te soy sincero, quisiera aprender lo que más se utilice a nivel laboral o lo que más demanden las empresas. Obviamente también para aplicaciones propias y tal pero la realidad es para tener un mejor perfil ante empresas y claramente a futuro, adaptarme mejor a los equipos con los que me toque trabajar.
    Por ahora solo conozco el patron repositorio y estoy aprendiendo unit of work.
    Gracias por leerme, abrazo grande, activé la campana por si subes más contenido, espero que si.

    • @IsaacOjeda
      @IsaacOjeda  6 месяцев назад +1

      Muchas gracias por tu comentario! me da gusto que te sirva el contenido (aunque ya no he subido😔)
      El uso de patrones siempre depende, como creo lo menciono en el vídeo, siempre el código nos dirá cuando refactorizar y hacer algo mejor.
      Los que habitualmente uso son: Factory, Builder, Decorator y Strategy
      Hay mucho contenido sobre esto, incluso en mi blog he usado algunos (dev.to/isaacOjeda )
      Saludos!!

  • @ggwilly
    @ggwilly 3 месяца назад

    Isaac como estas, mi consulta apunta a que sería una buena practica, si los metodos Handle() deberían devolver siempre un IResult, desde mi punto de vista en los commands no lo veo mal, pero que pasa con los queries, debemos devolver también un IResult para unificar o conceptualmente es mejor devolver un por ejemplo List, Muchas Gracias!

  • @antsa2526
    @antsa2526 2 года назад

    Muy interesante, gracias por tu aportación... ¿Que tema y font estas usando en Visual Studio?

    • @IsaacOjeda
      @IsaacOjeda  2 года назад +1

      Gracias!
      Uso Fira Code, en el vídeo no estoy seguro cual era porque suelo cambiarlas y el tema se llama Dracula, saludos!

  • @r.amilcarrivasmarquez2892
    @r.amilcarrivasmarquez2892 Год назад

    En mi opinión arquitectura limpia es una herramienta conceptual sobre todo, Si no quieres implementar abstracciones está bien, todo sigue siendo igual, siguen estando en tu serebro y eso es bueno, el día que se requieran se implementan y todo sigue estando bien, eso está en el capítulo de "Límites parciales". Arquitectura limpia implementada como en el libro da grandes beneficios en aplicaciones medianamente grande y mientras más grandes más beneficios, en aplicaciones pequeñas o minúsculas puede ser un problema sobre todo con desarrolladores novel. No creo que el ejemplo del vídeo se una contra tesis o algo parecido a Clean Arq, me párese más bien nCapas con tintes en DDD, Esto no es una "Arquitectura que grita".

  • @patxi4876
    @patxi4876 2 года назад +1

    Muy buen video, gracias! Tengo una duda: Qué pasaría si el manejador de un evento de dominio haría una tarea costosa en tiempo, incluso puede que no realice nada en BD pero sí invocando un servicio externo, por ejemplo. Se quedaría la transacción abierta por mucho tiempo, y esto no parece una buena idea.

    • @IsaacOjeda
      @IsaacOjeda  2 года назад +2

      Gracias!!
      Tienes toda la razón, en este caso si son eventos tipo "Fire and Forget" sería útil tener algo asíncrono como HangFire o alguna implementación similar y dejar que el flujo actual termine la transacción anterior.
      De igual forma, considerando este escenario, se puede modificar el DbContext para terminar la transacción y que los eventos tengan sus propias transacciones (Las que implícitamente SaveChangesAsync te crea) si es necesario que el evento siga modificando el DbContext.
      Interesante observación, gracias!

  • @FFilman
    @FFilman 2 года назад

    Muy buen! ¿Dónde estaría un jwt?

  • @pedrocano3798
    @pedrocano3798 Год назад

    En el query getProducts, en el caso que yo solo requiera traer de la base de datos 2 de las propiedades como lo podría manejar, debería de crear otro query que responda un output solo con esas dos propiedades?

    • @IsaacOjeda
      @IsaacOjeda  Год назад

      Hola!, disculpa la demora. GetProductsResponse es el DTO que va a decir cuantas propiedades exponer en el endpoint, este lo puedes modificar a las propiedades que tu quieras regresar sin ningún problema.
      Saludos!!

  • @omartorresrios8216
    @omartorresrios8216 9 месяцев назад

    Hola Issac, antes que nada darte las gracias por este video muy claro sobre esta nueva arquitectura, una pregunta que queria hacerte si tienes tiempo de responder es, Crees que sea recomendable realizar validaciones dentro del validator que involucren la base de datos?, para solo tenerte en este lugar las validaciones que se requieran por ejemplo que el correo del nuevo usuario debe ser unico, gracias nuevamente.

    • @IsaacOjeda
      @IsaacOjeda  9 месяцев назад +1

      Hola! Gracias por tu comentario.
      Respecto a eso, yo preferiría ponerlo en el Handle, ya que al involucrar la base de datos, se requiere un scope para resolver dependencias y desconozco una forma limpia para hacer eso en los validadores.
      Sin complicarnos tanto, me iría por esa opción, por qué desde el Handle podemos lanzar errores de validación sin ningún problema y siento yo que hace más evidente el cómo funciona el código (aunque eso ya es opinión mía)
      Saludos!

    • @omartorresrios8216
      @omartorresrios8216 9 месяцев назад

      @@IsaacOjeda si tienes razón, gracias por responder

  • @georgepinargote
    @georgepinargote 9 месяцев назад

    Hola Isaac, muy buen video y muy claro, nuevo suscriptor, he estado investigando sobre este tema y uno de las interrogantes que intento cubrir por ahora es, ¿Como manejar la comunicación entre slices?, que sucede cuando tengo que registrar una orden por ejemplo y debo de comunicarme con un slice de pagos, de entregas o de facturación, supongo que se puede usar eventos pero si no es aceptable la consistencia eventual, entonces lo que he pensado es crear una Interfaz que el handler pueda utilizar y tratar el otro slice como un servicio externo, me gustaría saber que manejo le darías o que ideas tienes al respecto.

    • @IsaacOjeda
      @IsaacOjeda  9 месяцев назад

      Hola? Gracias por comentar.
      Los eventos son la opción que te recomiendo acompañados por el outbox pattern si son cosas delicadas.
      La consistencia eventual no aplica aquí ya que no estamos hablando de transacciones distribuidas, sino que todo ocurre en el mismo proceso y también puede que en una misma transacción.
      El outbox pattern nos ayudaría a asegurar que todos los side effects (eventos) ocurran, y si uno no terminó, se puede reintentar.
      También, la comunicación entre slices no ocurre, es decir, un slice no llama a otro, si necesitas usar funcionalidad que otros slices usan, tal vez lo mejor es usar un servicio que este se reutilice, pero me iría por los eventos.
      Saludos!!

    • @georgepinargote
      @georgepinargote 9 месяцев назад

      @@IsaacOjeda vale entiendo, tengo en mi análisis la consistencia eventual porque es muy probable que luego saquemos uno que otro slice a microservicio, supongo que sí me voy por eventos el proceso no cambiaría mucho si es que desde el inicio lo modelo así, muchas gracias 👍 quedo atento a nuevos vídeos 👌

  • @HuneSilver
    @HuneSilver 2 года назад

    Me gusta mucho el theme que usas para VS ¿Cuál es?

  • @infotips2475
    @infotips2475 2 года назад +1

    Excelente video, tengo una pregunta, el proyecto que se llama Api de tipo es ? (Core Web API / Core Web App), Gracias !!!

    • @IsaacOjeda
      @IsaacOjeda  2 года назад

      Que tal, es Web API .net 6

  • @infotips2475
    @infotips2475 2 года назад

    Que utilizarias para versionar el API ?

    • @IsaacOjeda
      @IsaacOjeda  2 года назад +1

      Definitivamente no tenemos opción de hacerlo como en Web API (ya que es muy flexible). Por ahora, es hacerlo manual por medio del Path, y viendo el Roadmap para .net 7, aun no está planeado agregar esta funcionalidad (pero en cada versión de .net están agregando muuucha funcionalidad a minimal APIs)

  • @infotips2475
    @infotips2475 2 года назад

    Ya crearon una solucion de Asp equivalente a Carter ? o aun se tiene que usar carter ?

    • @IsaacOjeda
      @IsaacOjeda  2 года назад +1

      Para .NET 7 se sacará algo llamado Route Groups, que te permitirá definir endpoints en un grupo (el equivalente a Module en carter) y simplemente agregarlo en el Program. Carter probablemente ya no será necesario en futuras versiones si este no saca otro tipo de valor agregado

  • @user-JN33
    @user-JN33 Год назад +1

    hola, por que dejaste de subir contenido? saludos!

    • @IsaacOjeda
      @IsaacOjeda  Год назад +1

      Hola! Sí he querido volver, solo que he escrito en mi blog solamente, hacer videos se requiere de más tiempo del que he tenido últimamente, pero sí lo intentaré, saludos

  • @infotips2475
    @infotips2475 2 года назад

    Una pregunata muy puntual, No se puede usar un Handler de MediatR con un TRequest con parametro List, la unica forma que eh encontrado es crear la clase commando CreateProductListCommand y la propiedad de tipo List CreateProductList.

    • @IsaacOjeda
      @IsaacOjeda  2 года назад +1

      Te refieres a recibir múltiples requests en un mismo handler? nunca me he topado con esa necesidad, de hecho, me resulta un poco extraño. Tener la propiedad con el List debería de ser suficiente.

    • @infotips2475
      @infotips2475 2 года назад

      @@IsaacOjeda En el caso que necesites agregar varios registros con el AddRange debes de recibir un arreglo o una lista de objetos .

  • @81NARY
    @81NARY 2 года назад +1

    I don't speak Spanish, but still this was an interesting watch. Thanks!
    I'm implementing something similar but with asynchronous events via AMQP and then Hangfire picks up events that need to be scheduled (like a scheduled social media post) and everything else is picked up by a worker service.

  • @lococba84
    @lococba84 2 года назад

    Veo un slice como un microservicio

    • @IsaacOjeda
      @IsaacOjeda  2 года назад +1

      Un slice podría ser "Rechazar facturas" dentro de un microservicio de facturación, yo pienso que un microservicio cuenta con varios slices pero están dentro del mismo bounded context