ASP. Desarrollo de la API web de NET 5 | Trevoir Williams | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

ASP. Desarrollo de la API web de NET 5

teacher avatar Trevoir Williams, Jamaican Software Engineer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      3:49

    • 2.

      Instale Visual Studio 2019 Community Edition y . SDK de Net 5

      6:46

    • 3.

      ACTUALIZACIÓN: instala Visual Studio 2022 Community Edition y . NET 6

      2:16

    • 4.

      Configurar la cuenta de GitHub

      2:28

    • 5.

      Instalar y explorar PostMan

      9:39

    • 6.

      Crear y recorrer el proyecto de la API Web

      7:55

    • 7.

      ACTUALIZACIÓN: actualízate a. NET 6

      3:12

    • 8.

      Configurar el registro con SeriLog

      14:17

    • 9.

      Explorar la interfaz de usuario de Swagger

      10:48

    • 10.

      Configuración de CORS

      6:40

    • 11.

      Revisar y agregar cambios en GitHub

      4:39

    • 12.

      Implementar clases de datos y el marco de entidades

      26:12

    • 13.

      Datos de semilla en las tablas

      8:10

    • 14.

      Repositorios de servicio de instalación y la inyección de dependencia

      31:30

    • 15.

      UPDATE: el tipo de los que incluye para la unidad de trabajo

      6:08

    • 16.

      Configurar AutoMapper y DTOs

      21:20

    • 17.

      Revisar y agregar cambios en GitHub

      3:28

    • 18.

      Overview - cómo configurar los puntos finales de GET

      4:49

    • 19.

      Construct GET Endpoint

      26:42

    • 20.

      Construct GET By Id Endpoint

      9:33

    • 21.

      Configurar GET Endpoints para los hoteles

      4:03

    • 22.

      Toca finales y añade cambios en GitHub

      0:48

    • 23.

      Asegurar tu API - Resumen de la sección

      6:52

    • 24.

      Núcleo de identidad de usuario de la configuración

      13:39

    • 25.

      Endpoint de registro de usuarios

      30:19

    • 26.

      IMPORTANTE: registro de usuarios Endpoint Fix

      0:56

    • 27.

      Agregar roles de usuario

      10:37

    • 28.

      Explorar los tokens web de JSON (JWT)

      5:10

    • 29.

      Implementar la autenticación de JWT

      31:39

    • 30.

      Proteger los puntos finales

      8:11

    • 31.

      Revisar y agregar cambios en GitHub

      0:22

    • 32.

      Construct POST Endpoint

      13:35

    • 33.

      Construct PUT Endpoint

      23:38

    • 34.

      Construct DELETE Endpoint

      7:24

    • 35.

      Revisar y agregar cambios en GitHub

      0:44

    • 36.

      Funciones de valor agregado: Resumen de la sección

      1:16

    • 37.

      Implementar el Paging

      17:51

    • 38.

      Manejo de errores en el mundo

      11:25

    • 39.

      Implementación de la versión de la API

      12:38

    • 40.

      Implementación de la caché

      13:49

    • 41.

      Limitación de la tasa y el aceleramiento

      7:15

    • 42.

      Revisar y agregar cambios en GitHub

      3:24

    • 43.

      Cambios de arquitectura - Resumen de la sección

      2:17

    • 44.

      Proyecto de modelos de datos de configuración

      7:24

    • 45.

      Proyecto básico de la aplicación de la configuración

      10:50

    • 46.

      Limpiar y probar

      15:25

    • 47.

      Revisar las modificaciones y los beneficios

      15:00

    • 48.

      Configurar el entorno de hospedaje: IIS y SQL Server

      6:39

    • 49.

      Publicar aplicaciones en IIS y SQL Server

      24:58

    • 50.

      Crear una cuenta de Microsoft Azure

      7:12

    • 51.

      Implementar aplicaciones y base de datos en Microsoft Azure

      17:27

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

303

Estudiantes

--

Proyecto

Acerca de esta clase

Descripción general

Aprende cómo crear una API RESTful con la API de ASP.Net, el marco de entidades, las prácticas de calidad empresarial para una solución de API Web que se puede hacer en el futuro. Implementaremos varias herramientas de soporte para el registro, la documentación, la seguridad y el manejo de errores.

ASP.NET Core basado en lo nuevo. NET 5, es el marco moderno y multiplataforma de Microsoft para crear aplicaciones web listas para la empresa. En este curso, aprenderás todo lo que necesitas saber sobre cómo crear una API RESTful con el uso. NET 5, desde la comprensión de la estructura de las carpetas y los archivos, hasta la creación y la implementación de una API web completa.

¿Por qué aprender el núcleo de ASP.NET? NET 5

Microsoft . NET es la plataforma que impulsa la tecnología de negocios de muchas de las principales corporaciones de los Estados Unidos y muchos otros países. Es la tecnología predominante utilizada para impulsar la tecnología de negocios a escala empresarial. Las empresas han elegido. NET porque ya probada escalabilidad, confiabilidad y soporte.

El . El lenguaje de la red de la elección para aprender es C#, ya que es uno de los idiomas más utilizados en la actualidad. Es un lenguaje de programación de fines generales que puede manejar casi cualquier problema, desde el escritorio hasta las aplicaciones web dinámicas. Como tal, hay una alta demanda en todo el mundo para . desarrolladores de redes en una variedad de industrias, por lo que significa que hay más puestos de trabajo disponibles para los candidatos con una base que se base en . Tecnologías de red.

¿Por qué aprender a crear una API

La API de acrónimo significa la interfaz de programación de aplicaciones. La capacidad de diseñar y mantener una API es un conjunto de herramientas importante para el desarrollador web moderno. Le permite extender la accesibilidad de su software a aplicaciones externas y otros desarrolladores, lo que conduce a una solución de software más global.

Construir una base sólida en . Núcleo de red / . Programación en NET 5:

  • Cree una API de REST completamente basada en los datos, con tecnología de vanguardia

  • Cree una base de datos con Entity Framework Core

  • Unidad de trabajo y patrón de repositorio genérico

  • Inyección de dependencia

  • Configurar el registro con SeriLog

  • Configurar la documentación de la API con SwaggerUI

  • Comprender los principios de diseño de REST

  • Comprender C# 9 y . Sintaxis de la red de la base neta

  • Comprender la autenticación de los usuarios con JWT (Tokens Web de JSON)

  • Comprende cómo usar los objetos de transferencia de datos (DTO) y AutoMapper

  • Gestionar paquetes con NuGet Manager

  • Comprenderlo. flujos de trabajo, herramientas y desarrollo de aplicaciones

  • Configurar GitHub para el control de fuentes

  • Implementar aplicaciones y base de datos en Microsoft Azure

Contenido y resumen de

Para tomar este curso, necesitarás tener algunos conocimientos de la programación orientada a los objetos, si no en C#. Incluso si no tienes mucha exposición al . pila de desarrollo de red, este curso es muy agradable y chocó con consejos de desarrollo.

Este es un curso enorme. Más de 8 horas de contenido premium, pero se rompió de manera inteligente para resaltar un conjunto de actividades relacionadas basadas en cada módulo en la aplicación que se está construyendo. También veremos la solución de problemas y los errores de depuración a medida que avanzamos; la implementación de las mejores prácticas; la escritura de una lógica eficiente y la comprensión de por qué los desarrolladores hacen las cosas de la manera en que hacen. Tu conocimiento crecerá, paso a paso, en todo el curso y te mostrarás el reto de ser lo mejor que puedas ser.

No hacemos las cosas de la manera perfecta la primera vez; esa no es la realidad de escribir código. Cometemos errores y los señalamos y los arreglaremos a su alrededor. Al hacerlo, desarrollamos la competencia en el uso de herramientas y técnicas de depuración. Cuando termines el curso, habrás cambiado en Visual Studio y examinado tanto los errores de lógica y sintaxis, que será la segunda naturaleza para ti cuando trabajes en el estudio. Ambiente de red. Esto pondrá tus nuevas habilidades aprendidas en el uso práctico e impresionará a tu jefe y a tus compañeros de trabajo.

Conoce a tu profesor(a)

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Profesor(a)
Level: All Levels

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción: Oigan chicos, quería tomarme este tiempo para darles la bienvenida a este nuevo curso, último ASP.Net cinco web API Development Guide. Ahora, es tipo es un bots múltiples. Te puedo asegurar el contenido vidas más cortas hasta el edificio. En este curso, aprenderás a crear una API web mantenible usando ASP.Net five, que es la última y más grande y Microsoft y desarrollo pegado Entity Framework. Y exploraremos muchos patrones de diseño a nivel empresarial en consideraciones a la hora de diseñar y API. Yo soy tu instructor para este curso. Mi nombre es cierto. ¿Quiénes son Williams? Soy ingeniero de software y conferenciantes de medio tiempo. Exploremos qué es una API, las letras AP e IR, abreviatura de Application Programming Interface. Prácticamente una API es una interfaz de software que actúa como intermediario entre dos aplicaciones. Entonces digamos que puedes acceder a funcionalidades como Facebook desde una app que no es una app de Facebook. Por lo que esto tiene la parte superior a Facebook y te permiten hacer cosas en vivo de facebook. Bueno, eso es comunicarse con Facebook a través de una API. lo que en este curso, aprenderemos a construir ese tipo de interfaz para permitir las personas accedan a un data store subyacente que estaremos construyendo. uso de la funcionalidad que estaremos construyendo son el uso de clientes que necesitarán construir, ya sea para un móvil o web o cualquier otro tipo de dispositivo. Por lo que las API o al menos el tipo de API que estaremos construyendo se basan en los principios del resto. Por lo que vamos a aprender muñeca y detenido corto por traslado estatal representacional. Es un estándar API web muy popular y se utiliza en muchas plataformas. Entonces, aunque estaremos construyendo la API usando.net core, la API puede ser consumida por clientes de muchas otras pilas de desarrollo. Además de esto, estaremos aprendiendo a usar Dominic core cinco, estaremos buscando entender los servicios y oh, todo el flujo de aplicaciones funciona. Y también estaremos buscando usar más caliente a nivel empresarial. Entonces las mejores prácticas que podemos poner en el código de tal manera que cuando estemos listos para expandirnos, ya sea a través de nuestro propio autodescubrimiento o en un entorno empresarial. No tendremos que sacar demasiado de nuestra aplicación para hacer eso. Bueno, sólo podemos tocar los componentes a medida que avanzamos. Entonces en pocas palabras, vas a aprender ASP.Net five y Entity Framework forward wind para estar usando quote en primer lugar, es increíble desarrollo y exploración. Una vez más, los patrones de codificación clave estarán buscando autenticación API usando los tokens web JSON son JWT para corto recorrido, podemos protegerlos más altos que nuestros endpoints y protegerlos de accesos no autorizados o no deseados. Miraremos a entender la tubería de servicio core Dark Net y todo lo que podamos ampliarlos y poner en nuestro propio middleware, tener mirando las pruebas de API y el registro sobrio usando Postman y serial out para nuestras pruebas API y con fines de registro respetuosamente, y también estaremos mirando todo el swagger puede jugar un papel en documentar nuestra API y también ayudar con el control artístico de fuentes. Estaremos usando GitHub para que podamos almacenar o codificar de forma segura y poder retroceder en caso de que necesitemos hacerlo. Y luego miramos, después de construir sobre todas estas cosas maravillosas, cómo exactamente permitimos que se acceda a nuestra API, ya sea en un entorno de empresa o por el Mundo. Ahora bien, este curso tiene principios tranquilos de alguien. Tiene unas diez horas de duración y vas a estar aprendiendo muchas cosas. Entonces a bulkload, prepárate para este viaje y estoy muy emocionado de tenerte junto. 2. Instala Visual Studio 2019 de comunidad y . Net 5 SDK: Oigan chicos, hoy vamos a empezar con la instalación Visual Studio Community Edition y.net cinco. Ahora nuestro viaje comienza aquí en el sitio web de Visual Studio, que puedes llegar a través de una simple búsqueda en Google. O puedes intentar reproducir esta URL, que es Visual Studio dot microsoft.com slash VS slash community. Ahora hay diferentes adiciones de Visual Studio. Y la comunidad es la que es, es gratuita para uso individual y esa es la que vamos a utilizar. Para que puedas seguir adelante y descargar Visual Studio, que te dará el Instalador de Visual Studio. Y una vez que eso se complete, podemos seguir adelante y ejecutar ese archivo. Lanzaremos los puntos de control de seguridad que pudiera tener, pero puede proceder a permitir que comience el instalador. Y todo esto es donde realmente se define de qué será capaz Visual Studio. Por lo que estas se denominan cargas de trabajo, y cada carga de trabajo le expondrá un conjunto de características diferente. Por lo que para el desarrollo web, querrás obtener la carga de trabajo de ASP.Net y desarrollo web. Para el desarrollo de escritorios. Se desea obtener el desarrollo de net desktop o subir. Y para cualquier otro SDK o tipo de proyecto que tal vez desee desarrollar, puede seguir adelante y obtener la carga de trabajo asociada con él. No, para este ejercicio, queremos preparar nuestro estudio de resultados con los recursos necesarios para el desarrollo web. Una vez más, puedes seguir adelante y tomar la mayor cantidad de estas cargas de trabajo. Cada una vendrá con su propio tamaño y te dice cuánto espacio se requiere en función de los que selecciones. Pero como mínimo para el desarrollo web, quieres asegurarte de tener ASP.Net y desarrollo web ticked. Puedes seguir adelante y tomar las otras herramientas de desarrollo si lo deseas. Pero no estoy dispuesto a hacer eso porque estos son all.net framework 644.84.6, lo siento, 4.74.8. Pero vamos a estar instalando el documento cinco en unos minutos para que puedas seguir adelante y hacer esto y dejar que Visual Studio se instale. Esto tomará un tiempo para que puedas tomar una taza de café y volver. Ahora una vez que se complete esa descarga e instalación, tienes dos opciones. Puedes seguir adelante e iniciar sesión. Y firma lo que significa que inicias sesión con tus conos vivos. Si tienes uno, si no, entonces adelante y crea uno. Es gratis y hace la vida más fácil si solo creas uno y realmente inicias sesión. Pero sólo voy a seguir adelante con una opción no nula quizá más tarde. Y luego eliges tu configuración general. Entonces enciendo el tema oscuro y puedes elegir lo que quieran, qué configuración de desarrollo o general. Simplemente dejaré el mío en general, pesar de que estamos haciendo qué desarrollo. Pero básicamente solo optimizan ciertos atajos de teclado y el diseño en función de tu selección. Dejaré el mío en general. Empezaré con Visual Studio. De acuerdo, así que una vez que eso se haga, te van a impulsar con esta nieve. Si no consigues esto, entonces está bien. Pero aquí la razón por la que te hubiera sugerido que inicies sesión con sus conos de vida porque entonces todo lo que tienes un periodo de prueba de 30 días. Y si no quieres la parte superior del cono, entonces básicamente te dirán que salgas. Por lo que en realidad puedes simplemente seguir adelante e iniciar sesión. Por lo que sólo voy a iniciar sesión con los míos. Y una vez que lo hayas firmado y luego verás que no te tiene licencia y solo parece presentar más acogedor. Entonces ahora en lugar de salir de Visual Studio, puedo cerrar. Y este es Visual Studio en el nivel muy básico. Ahora tenemos Visual Studio. Lo que también necesitamos es.net cinco. que puedas llegar a la página de descargas de cinco redes a través de una simple búsqueda en Google una vez más. O intentas reproducir esta URL, cualquiera que encuentres más fácil de hacer. En este punto, se desea descargar el SDK y el tiempo de ejecución. Entonces déjame empezar por cerrar Visual Studio porque necesita instalar extensiones para ello. Y el instalador siempre está disponible para ti. Entonces si no agregas una carga de trabajo, solo para que lo sepas, en realidad puedes simplemente hacer clic en modificar y luego relanzar ese pH con todo lo que diría el trabajador si más adelante quieres que haga algo nuevo, solo necesitas modificar esa carga de trabajo luego obtendrás esas Plantillas de Proyecto en consecuencia. Voy a cerrar Visual Studio, sin embargo, para que podamos continuar con nuestras instalaciones. Por lo que vamos a conseguir el.net cinco. Ahora puedes ver que los SDK disponibles en función de tu sistema operativo, tengo un sistema operativo Windows de 64 bits trabajando con retinal, así que seguiré adelante y descargaré eso. Y mientras ese se está descargando y solo Lindsay pulsa el botón Atrás y pasa al tiempo de ejecución, lo cual es absolutamente necesario para el hosting. Entonces ves que es el soporte en tiempo de ejecución. Entonces si vas a estar hospedando la aplicación.net cinco en, en un servidor local, entonces definitivamente necesitas el tiempo de ejecución. Por lo que solo puedes obtener este paquete de hosting que tienen ahí disponible para su descarga. Por lo que solo puedes descargar ambos y cuando ambos estén terminados. Entonces, cuando terminen los SDK, puedes seguir adelante e instalar ese 1 primero. No debería tardar demasiado. Y está bien, así que es exitoso. Después de haber instalado el SDK, entonces solo queremos asegurarnos de que tenemos ahí tiempo propio. También acepte cualquier cosa, y adelante y ejecute su instalación. Y te avisará cuando se complete con éxito, sepan que tenemos el SDK está completamente instalado. Solo quería lanzar Visual Studio y mostrarte lo que obtienes con esos SDK. Entonces si sigo adelante y creo un proyecto totalmente nuevo por las cargas de trabajo que tengo a mi disposición, veré diferentes plantillas de proyecto. Por lo que sólo elegí el nodo de trabajador web. Por lo que tengo la capacidad de hacer una consola regular arriba. Tengo el núcleo ASP.Net. De hecho, creo que éste viene por la carga de trabajo de escritorio, pero en este punto no estoy tratando de averiguar qué funcionó, quién pertenecería a cuál. Sólo tienes que saber que si vas a estar haciendo nuestro proyecto web, tienes la opción de elegir una aplicación web core, una aplicación blazer, y puedes elegirlos si no vas a hacer para el framework R.net, alguien para elegir una.net Core aplicación Web. Esta no es la aplicación real que estamos construyendo. Solo te estoy mostrando tus opciones. Entonces vamos adelante y ponemos el nombre del proyecto podría crear. Entonces, de la lista desplegable aquí, puedes elegir si quieres un Core 2.13.1 o el último dominate core 5. Y con eso, podrás elegir las diferentes plantillas y proceder. Entonces, cuando volvamos, realmente crearemos un proyecto y haremos un recorrido fuera de las estructuras de carpetas. 3. ACTUALIZación: instala Visual Studio 2022 Community Edition y . Redes 6: Oigan chicos. En esta lección estaremos instalando Visual Studio 2022, que se envía con dotnet six, que es el dotnet más rápido hasta la fecha. Entonces para empezar, solo necesitamos ir a las descargas de Visual Studio dot Microsoft.com slash. Y luego vamos a seguir adelante y golpear la descarga gratuita en la edición de la comunidad, que luego nos dará un instalador. Por lo que una vez que ejecutemos ese instalador, podremos seleccionar las cargas de trabajo que queramos. Las cargas de trabajo realmente se refieren a las bibliotecas o a las bibliotecas de soporte para el tipo de hasta que te interesa crear. Entonces en este caso, definitivamente queremos conseguir ese desarrollo web ASP.Net en carga de trabajo de desarrollo web. Pero entonces si te interesan otras tecnologías, puedes seguir adelante y seleccionarlas. Para que veas que tengo varias cargas de trabajo seleccionadas con desarrollo de Azure, NodeJS y desarrollo de escritorio. Para que puedas seguir adelante y dividirlos también. Creo que van a venir muy bien con otros proyectos que podrías terminar construyendo todo en general, una vez que hayas hecho eso, puedes seguir adelante y golpear Instalar, lo cual se haría por la esquina inferior derecha. Por supuesto, cuantas más cargas de trabajo selecciones es mayor será el tamaño de la descarga. Entonces una vez que hayas completado eso, entonces puedes continuar. Ahora cuando termine esa descarga, es posible que obtengan ciertas opciones que no voy a conseguir porque ya la tengo instalada. Entonces esto te guiará a través de lo que espero? Podrás obtener una opción donde llegues a elegir tu tema. Como puedes ver, estoy usando el tema oscuro, pero entonces sí tienes la opción de un tema claro, un tema azul. Y la cosa es que Visual Studio 22 tiene muchos más temas que sus predecesores. Por lo que aunque no quieras encender los temas iniciales, puedes conseguir todos los temas si los necesitas. Además, es posible que se te pida que inicies sesión. Entonces si ya tienes 2019 instalado en tu máquina y acabas de instalar en 2022, ya iniciaste sesión en 2019, entonces probablemente no te pedirá que vuelvas a iniciar sesión. No obstante, si esta es tu primera instalación de Visual Studio, posible que se te pida que inicies sesión o crea una cuenta en vivo, que punto te gustaría solo usar tu Microsoft emitida en vivo en todos los loci me enseñan un mucho conos com, o simplemente puedes seguir adelante y crear uno. Y si yo si mi memoria me sirve correctamente, puedes usar otra dirección de correo electrónico que no sea de Microsoft, secreta saliva, frío. 4. Configuración de la cuenta GitHub: Hey chicos, en este video estaremos creando o cuentas de GitHub. Y esta es una cosa realmente simple, envejece, hace que sea muy fácil para nosotros inscribirnos. Solo necesitas ir a Github.com. Hace GIT HUB DOT COM, github.com, y aterrizarás en esta página. Ahora desde aquí, si ya tienes una cuenta y puedes iniciar sesión y prácticamente puedes dejar de ver el video aquí. Si no lo haces. No obstante, entonces la forma central está justo aquí. Puedes hacer un poco de lectura, solo consigue una apreciación de lo que GitHub es cuatro y se trata de todo, sí tienen precios, por lo que sí ofrecen planes empresariales y planes de educación y diferentes plantas o situaciones diferentes . Pero para el desarrollador solar o para equipos muy pequeños que pueden no ser de nivel empresarial de lo que lo hacen. Te doy mucho gratis. Por lo que para inscribirte, solo necesitas poner un nombre de usuario y dirección de correo electrónico y una contraseña. Y una vez que hayas proporcionado todas esas cosas y siempre que tu nombre de usuario sea lo suficientemente único, por supuesto, entonces haces clic en inscribirte en GitHub y deberías estar dentro. Entonces ya tengo una cuenta, así que de verdad sólo voy a iniciar sesión. Viste que mis cejas se están volviendo locas tratando de proporcionar información. Por lo que sólo voy a iniciar sesión con mi cuenta existente. Entonces ese es mi pozo, puedes usar tu nombre de usuario o direcciones de correo electrónico para iniciar sesión y la contraseña. Y aquí estoy, esta es mi página de aterrizaje, así que en realidad te dan un sentido de comunidad. Es casi como un Facebook para desarrolladores hasta cierto punto, puedes seguir a la gente. Y una vez que están siguiendo a la gente, ves sus actividades en la página de aterrizaje, puedes saltar a tu repositorio. Entonces obviamente si eres nuevo en levantarte, entonces no tendrías nada listado a un lado aquí. De lo que no soy nuevo. He estado bastante ocupado poniendo contenido en YouTube, casi cualquier pequeño proyecto de mascota que es que empiezo, tengo un repositorio de GitHub o en realidad necesito ir a través de él. Entonces y también he tenido alumnos que me agreguen a su descanso en el pasado para que pudiéramos colaborar. A lo mejor estaban teniendo un problema y solo pude verificar su código a través del repositorio. Todas esas cosas son posibles a través de esta foto verbal. Pero una vez que has creado tus conos y estás registrado y bueno, obviamente no verías lo que estoy viendo una vez más. Pero entonces eso completaría la suscripción. 5. Instalar y explorar PostMan: Hey chicos, en este video vamos a estar instalando cartero o porcelana es una excelente herramienta para la colaboración y pruebas APA y validación en todas esas cosas maravillosas. Por lo que es bastante fácil de instalar realmente. Sólo tienes que ir a pausar man.com. Cartero hace luz Luca que entrega tu correo, Horstmann.com. No conoces el up. Y por supuesto que eliges tu aceite. Entonces Windows de 64 bits, y luego comienza la descarga. De acuerdo, así que una vez finalizada esa descarga, puedes seguir adelante y abrir el archivo de instalación, ejecutar el instalador. Está bien, entonces cuando esté terminado, bien verás una pantalla que te pide que te inscribas o que inicies sesión, o verás esta pantalla de cualquier manera, si ves algo para iniciar sesión, te animaría a hacerlo. En realidad lo tenía ya en mi máquina. Por lo que el flujo puede no ser exactamente así. Pero si ves que esta página aparece, entonces está bien. Simplemente puedes hacer clic en la X y puedes quitártela. Y no estoy firmado de todos modos. Entonces si sí ves que el fuera de pantalla luce algo como esto, entonces solo puedes seguir adelante y crear un conos solubles. Pueden crear un OK conos con bastante facilidad nombre de usuario, contraseña, o simplemente inicia sesión con Google. A mí me gusta simplemente iniciar sesión con Google. Y la cosa es que el analizador mantendrá un historial de cada prueba a la que has ido una vez que tendrás en los conos arriba. De acuerdo, así que solo voy a seguir adelante e iniciar sesión con Google. O está encendido. Una vez que hayas iniciado sesión, entonces sabes que puedes empezar a trabajar. Entonces sólo les voy a mostrar una muestra de lo que Cartero es capaz. En primer lugar, voy a sugerir que es un modo oscuro porque el modo es genial. Y luego voy a crear una nueva ventana de solicitud. Por lo que usando este signo más, igual que cualquier navegador con los signos más en la parte superior puedes ver un signo más, y eso te da una nueva solicitud. Ahora ya me adelanté y busqué algunas API públicas, como discutimos, API base tiene que ganar nuestra puerta de enlace a tu base de datos. Por lo que la gente tiene API, varias personas tienen API. Y encontré este sitio web cualquier dash api.com. Y solo triángulo volver al primer bit para que veas lo que tienen para ofrecer. Entonces desde la página de destino, los compañeros te emiten un montón de API de cara pública. Entonces vas, solo puedes seguir adelante y hacer clic en uno y, ya sabes, probarlo. Entonces pasé al diccionario Oxford uno donde conseguiría una lista de idiomas. Entonces te muestran todos los puntos finales, ¿verdad? Por lo que en la construcción de toda la API, se vinculan a la base de datos shore dab, una URL común, pero luego tienen diferentes endpoints que darán diferentes bits de información. Y luego tienen diferentes métodos, GET y publicar y posponer cualquiera de otros. Pero el hecho es que hay que conocer el tipo de solicitud. Tienes que conocer la URL a través de la cual puedes conseguir que esa solicitud quede satisfecha. Tienes que saber si tienes que pasar en encabezados. Entonces aquí sé que necesito aplicaciones. Y DNI. Y luego me muestran las respuestas. Por lo que 200 significa o, t, y los hombres iniciales ejemplifican en JSON cuál sería esa respuesta. Y entonces 404 significa no encontrado. 500 significa que hay un error interno por lo general con el servidor doméstico, no contigo, ¿verdad? Entonces para Musa, probablemente estés buscando algo que no exista. 500 significa que el proveedor de API tiene un error. De acuerdo, así que cambié de cualquier API y quería gratis, para forex api dot cottons gratis, lo siento, así que eché un vistazo más de cerca a cualquier URL API ya que se requiere todas esas API, que tendrías aire caliente no conos B, nuestra usuario registrado probablemente siendo usuario fuera de esas plataformas se puede mirar a través, ve Instagram es un YouTube, Google. La mayoría de esas son API pronosticadas, por lo que están usando así mamá auto security o la poseían. Y vamos a pasar por todas esas técnicas en este curso. Pero ahora solo quiero empezar con una victoria rápida y satisfacción de ver qué cartero puede hacer y la relevancia de ello, ¿verdad? Por lo que llamé gratis forex api.com, justo de nuevo para parar eso está en gratis para api.com. Y luego iremos con la documentación para que la página de aterrizaje sea en realidad su demo de ellos consumiendo los datos a través de la API que están exponiendo, ¿verdad? Por lo que tienen una API integrada de base de datos. Y luego el, están haciendo una serie de llamadas API para mostrar el índice de trading entre euro, USD que eres y GBP, etcétera, etcétera. Entonces si voy a la documentación, me darán las Condiciones de Uso, dime cómo usarla. Por lo que la documentación es muy, muy importante y vital cuando se trata de las API, estaré usando la interfaz de usuario del clasificador swagger a nuestra vocal swash. Cuando lleguemos allí, ya verás, pero nos estaremos centrando en documentar nuestras API en gran medida también. Entonces desde aquí te muestran que tienes el, ese es el dominio en el que está alojada la API, ¿verdad? Y luego a medida que te desplazas hacia abajo, verás los diferentes tipos de funcionalidad que expusieron. Entonces esa es una buena calificación beta, ¿verdad? Y luego me dicen la petición, es una solicitud GET. Y luego tienes el, el, los endpoints, lo siento, la URL y el endpoint, eso es lo que necesita lucir. Y esta es una respuesta sampler. Está bien, y si miras a través, ves otro. Puedes conseguir diferentes compañeros. Entonces aquí mismo te vas a buscar, él será euro-USD E1 y el retorno que los resultados de esa consulta para ti. Y luego en este, puedes conseguir más de uno si quieres. Por lo que solo pones en ambos índices que te interesan como el parámetro en ese endpoint. De acuerdo, así que esa es una cadena de consulta para los valores en los que están las consultas. Y entonces esta es la respuesta de la API. Una vez que esas consultas son un dato NDA se llama. No, los acordes de flecha cuentan una buena historia porque luego pasas a periodos que no existen en su sistema de lo que te están diciendo que si no pasas en ningún escenario se requiere y si pasas en algo eso no está ahí, entonces verás un código de error 102. Entonces tienes códigos de error estándar y tienes algunos milagros. Tú mismo puedes hacer. Probemos esta muestra. Entonces voy a probar la primera en la que estoy sacando euro y USD. Entonces sólo voy a copiar este enlace, que dijeron, eso es todo lo que se llega a los datos de este punto final. Y luego voy a abrir Cartero. Y entonces lo que voy a hacer es perforarlo dentro de este conjunto dice enter request URL, eso es lo que acabamos de copiar, ¿verdad? Solicitud. Y la URL, pego la URL de solicitud. Y luego el verbo aquí, LC puede hacer GET, publicar, PUT, parche, borrar, tienes un montón de ellos. Entonces get se usa generalmente cuando estás esperando recuperar datos, ¿verdad? Así que consigue y luego gratis para su API. Bueno, cualquiera que fuera la URL de solicitud, No, está comprometida con la memoria porque está ahí en la documentación. Y luego haré clic en enviar, saber qué hace el cartero es imitar una llamada. Bueno, realmente no imitar que realmente realiza la llamada a ese endpoint API y luego recupera los datos en la respuesta. Por lo que vemos aquí, puede que no esté tan bien formateada como está en la documentación. Por supuesto, están poniendo su mejor pie hacia adelante. ¿ Qué hace el mismo bit de información donde conseguir una lectura y estamos consiguiendo una marca de tiempo y o levantando código de 200. Si miras a la derecha, verás el Status 200. ¿ De acuerdo? Entonces 200 es el universo de respuesta para todos k Una vez que obtienes una respuesta 200, sabes que todo está bien. Entonces los diferentes números tienen diferentes significados de palabras, ¿verdad? El tiempo que me llevó el costo. Entonces esta es una API rápida tomó solo eso es lo que, 2.5a y el tamaño de la respuesta, ¿verdad? Por lo que siempre se puede formatear. Entonces esto puedes hacer clic bonito, o puedes decir crudo o previsualizar o visualizar. No estoy seguro de por qué me guapa, Oh, eso es justo después de cambiar el formato. Entonces es bastante HTML. Entonces todo esto está bien. Y mirando esto, puedo decir algo como XML y no es XML. Dije HTML. Déjame hacer clic en JSON, que es, y ahí vamos. Entonces ahora es bastante JSON. Entonces ahora se ve un poco más radical, lo que se está previendo en su documentación, ¿verdad? Por lo que Cartero es muy útil cuando solo quieres probar cómo se verá la respuesta. Json es la respuesta más utilizada que estoy viendo eso vagamente, me gusta usar respuestas JSON. Cuál sería la alternativa de Clausius a eso XML. Y una vez que se devuelven los datos que el usuario espera y has documentado lo que puede esperar, entonces tú eres, puedes sentirte seguro de que cualquiera puede usar APA cuando sea necesario. Por lo que Cartero va a venir muy bien a medida que vayamos embarcaciones desarrollando nuestro APN, Solo quiero validar que las respuestas se vean de la manera que esperamos que lo hagan. 6. Crear y recorrer el proyecto web de web: Oigan chicos, bienvenidos de nuevo. Entonces lo primero que tenemos que hacer teniendo Tan dos partes ambiente y todo es crear nuestros proyectos. Entonces lo que vamos a hacer es lanzar Visual Studio. Y luego vamos a ir a crear nuevo proyecto. Ahora desde aquí puedes elegir la plantilla que quieras si tienes la aplicación web core ASP.Net en la parte superior, adelante y selecciónela. Si no lo haces, entonces solo puedes teclear web en este filtro y se filtrará no te pongas van a estar usando C-Sharp. Por lo tanto, asegúrese de que se seleccione C-sharp. Y si bien no tienes que cambiar mucho más que seleccionar las plantillas deseadas y seguir adelante y dar clic en Siguiente. No, estaremos construyendo una API de listado de hoteles. Por lo que voy a llamar a mi lista de hoteles de proyecto. Ahora mismo que tenemos que no tenemos que cambiar mucho más. Podemos seguir adelante y dar clic en Crear. Si desea seleccionar una ubicación específica, puede seguir adelante y hacer eso. De lo contrario, proceder con crea. Siguiente paso tiene una selección del stock que pretendemos utilizar. No, ya habrías instalado el.net five SDK y Visual Studio 2090. Y así debiste haberla conseguido o 5 As, como opción. Si no tienes esto, entonces deberías tener 3.1. De cualquier manera. Usted Candace doble-back, adelante e instala el SDK. Revisa ese video si necesitas asegurarte de que tienes todo instalado. Y luego puedes seguir adelante y seleccionar 5. Y estaremos construyendo una API web ASP.Net Core. Ahora, a la derecha, tenemos la opción de agregar autenticación y configurar algunas otras cosas. Por lo que dejamos todo tal como está. No estaremos configurando la autenticación aquí porque las opciones que se nos dan no son realmente lo que queremos. Por lo que estaremos configurando manualmente eso más adelante. Y ese sería un buen ejercicio para ayudarte a entender cómo el núcleo de identidad se integra en tu API. Pero podemos dejarlo como ninguna autenticación, ¿verdad? Nulo. Y luego podemos seguir adelante y dar clic en Crear. Entonces ahora ese es nuestro proyecto se ha creado. El, justo el punto, oh, antes de avanzar mucho más allá, el diseño de mi Visual Studio significa diferente tuyo porque tiendo a usar el Explorador de soluciones. En mi lado izquierdo. Por defecto, debería estar a la derecha, estaría a la derecha. Entonces probablemente así es como se ve el tuyo. O siempre podemos arrastrarlo y ponerlo donde quieras. A mí me gusta tenerlo a la izquierda, así que ahí es donde estaré usando el mío. Ahora el Explorador de soluciones nos está dando una lista de archivos y solo estoy pasando por esto en casos es tu primera vez que creas un proyecto.net. Si no lo es, entonces solo repaso esto de todos modos porque, ya sabes, repetición Newtons en presión y tal vez voy a puntos o algo que no sabías antes. Pero oye, así que lo primero que vamos a querer ver es nuestra carpeta de propiedades. Entonces déjame, déjame empezar de nuevo. Entonces tenemos lo que llamamos la solución, que es como un manifiesto para la lista de proyectos que están en esta solución que estamos construyendo. El proyecto es listado hotelero. Me doy cuenta cuando hago clic en él. En realidad es solo un archivo XML con un montón de configuraciones en listados y todas las cosas necesarias para que el proyecto sepa cuál es su identidad. Entonces porque elegimos .net 5, ves que ese es el marco objetivo. Si elegimos, 3.1 vería algo diferente allí bajo propiedades o las leería dependencias, vemos analizadores, frameworks, paquetes a medida que avanzamos, ves esta lista creciendo, así que no te pongas demasiado en lo que está pasando ahí. Nos fijamos en las propiedades, vemos ajustes de césped. Entonces aquí es como solo configuraciones, dígale a la aplicación y cómo debe comportarse cuando estamos en modo de depuración. Entonces lo que es muy importante aquí sin embargo, es que sí le permitimos configurar SSL o HTTPS cuando estamos de acuerdo en un proyecto. En consecuencia, tenemos este puerto SSL. Entonces cuando estemos haciendo nuestra aplicación y pruebas y así sucesivamente será en HTTPS colon barra barra barra inclinada local colon host. Y luego porque HTTPS donde se utiliza el puerto SSL, lo contrario este sería el punto final HTTP menos seguro. Entonces eso es sólo una cosita que estoy señalando todo lo contrario, las otras configuraciones en las que nos meteremos a medida que avancemos. Más controladores carpeta, que realmente mangueras son bien controladores y estos hacen exactamente lo que el nombre sugiere. Controlaban la aplicación a través de la lógica o todo va. Cuando recibimos una solicitud de información santa interpretada, y todos esos comportamientos se definirían dentro de nuestros controladores. Estas son las primeras líneas de defensa. Onesy calienta un endpoint API, en realidad estás llegando a un controlador. Y entonces diría: OK, qué endpoint o sentarme, qué debo hacer? Y entonces regresará en consecuencia. Una vez más, a medida que vamos, verás que cobra vida. Está bien, voy a saltar adelante a nuestro punto molesto JSON, que no tiene mucho. Estaremos modificando eso. ¿ No va bien? Pero déjame pasar al program.cs, que es el punto de partida para nuestras aplicaciones. Entonces aquí ves que ejecuta estas funciones principales si alguna vez hiciste otro lenguaje o desarrollaste en una consola C-sharp aplicaciones, notas que siempre empiezo con main, al menos veo plus-plus C-sharp Java. Todas esas lenguas por lo menos tienen un método medio, ¿verdad? Entonces una vez que estemos ejecutando nuestra API va a golpear la media y luego principal va a hacer básicamente como un edificio. Entonces lo que hace es que agrega todos los middlewares en funcionalidad y pone en la aplicación. Por lo que llama a este método, que realmente se define justo a continuación. Y hace sus inicializaciones en base a lo que hay en nuestro archivo de inicio. Entonces si voy a startup, aquí es donde ves donde se agregan todos los middlewares y las configuraciones se llaman al get-go. Entonces aquí vemos dónde quiere usar los controladores, agrega las bibliotecas que necesites agregar para que podamos usar nuestros controladores. Setup swagger, solo. Tradicionalmente swagger hubiera sido, tendrías que implementar ese dinero temprano desde esta versión de.net API, sale de la caja para que no tengamos que hacer demasiado trabajo, pero estaremos explorando qué es swagger más adelante en caso de que no estés muy seguro de qué se trata. Nosotros así que eso es configuraciones o configuramos servicios. Lo sentimos, tenemos configure lo que nos permite configurar alguna otra funcionalidad. Entonces sin meterse demasiado en ellos, algunos de ellos son autoexplicativos, algunos de ellos son por razones de seguridad. que todos ellos son realmente agradables, los hubs, y vamos a estar agregando cada vez más a medida que ponemos más características en nuestra API. Entonces, no te preocupes demasiado por ello. La fase final en esta solución sería sólo este modelo. Por lo que este modelo simplemente representa básicamente beta o una unidad de datos fuertemente tipada. Y más adelante estaremos definiendo muchos modelos y objetos de transferencia de datos. Pero por ahora, hemos creado nuestro proyecto. Deberíamos tener una comprensión justa de lo que estamos viendo dentro de esta solución. Y cuando regresemos, comenzaremos a configurar nuestro primer servicio de app dead en forma de registro. 7. ACTUALIZación: moderniza a . Redes 6: Hey chicos, En esta lección vamos a estar buscando actualizar nuestro proyecto desde dotnet 52, dotnet seis y todo esto es completamente opcional y un requisito previo para ello es que realmente tengas instalado Visual Studio 2022 ya. Entonces si te sientes más cómodo simplemente proceder con dotnet five y Visual Studio 2019, entonces eso no es absolutamente ningún problema. No obstante, si quieres dar ese pequeño paso e ir a dotnet busca, eso es lo que te guiaré a través de hacer. En última instancia, aunque, aunque hagas esto, actualiza, todo lo demás en el resto del curso cabrá ya dotnet seis es reverso compatible con todo Para dotnet cinco. Por lo que a menos de estos pocos cambios, todo lo demás debería funcionar. Entonces el primer cambio importante que vamos a hacer es un marco objetivo. Entonces para el archivo CSB, este es ese archivo de proyecto en la parte superior aquí. Vas a hacer clic en él y luego se volverá editable. Por lo que quieres cambiar eso de dotnet cinco a dotnet seis. Además de ese cambio en este archivo, vamos a querer agregar dos nuevas referencias bibliotecarias. Y esos vendrán en forma de Microsoft, no de ASP NET cord dot JSON Patch, que será la versión 6 y Microsoft dot extension dot dot abstracciones de almacenamiento en caché, que también es dotnet seis. Entonces si haces este ajuste, todos los paquetes que estarás usando mitad para ser para dotnet seis. Por lo que durante la duración del curso, mayor parte del mismo se hace en dotnet cinco. Me verás referenciando dotnet cinco bibliotecas. Pero todo lo que tienes que hacer es asegurarte de que uses dotnet six en lugar de dotnet cinco. Entonces ahora no rompamos el archivo de configuración y esto en realidad es opcional. Pero han eliminado las bibliotecas de registro de por vida de Microsoft en Microsoft dot hosting, y lo han reemplazado con advertencia de Microsoft dot ASP NET Core. Para que puedas seguir adelante y conocer ese cambio. Después de que hayas hecho todo eso, solo quieres hacer Control Shift y B que haga una compilación, o simplemente puedes ir a construir y hacer clic en Construir solución. Y entonces probablemente vas a ver algunas áreas por encima del objetivo, proyecto objetivo. Entonces, solo saltemos a los proyectos. Ir a Nuevo get, Administrar paquetes NuGet. Si no estás muy familiarizado con lo que obtienes, es que lo miramos más adelante en el curso. Pero por ahora, el problema es que algunas de nuestras bibliotecas siguen en dotnet cinco. Entonces como dije, en lugar de referenciar dotnet 5, haremos referencia a la versión dotnet six. Entonces todo lo que tienes que hacer es saltar a las actualizaciones. Seleccionar todo cubo es, hacer una actualización. Acepta cualquier problema que surja. Y luego una vez que hayas hecho eso, probablemente puedas hacer una reconstrucción. A veces un constructor no recoge todo. Entonces, cuando hagas una reconstrucción, se limpiará y luego se restaurará y luego se construirá. Y luego vemos uno logrado. Por lo que sabemos que nuestro proyecto se ha actualizado con éxito para dominar busca. Para que puedas seguir adelante y terminar el resto de este curso y divertirte con todo lo que vas a estar haciendo. 8. Configura la registración utilizando SeriLog: Bienvenidos de vuelta chicos. Entonces en esta lección vamos a estar configurando nuestras utilidades de logger. Por lo que nuestra arma de elección para este será serial out. Dicho esto, hay bastantes herramientas potenciales que están por ahí, digamos UP SIR log n, log, log for net, al menos esas son tres que he usado y estoy seguro de que hay otras. No, estoy usando log serial porque está inclinado como el más rápido por ahí. Y es muy popular en la comunidad de desarrolladores. Pero sé muy objetivo a la hora de elegir tu herramienta. Te voy a guiar por la configuración para el registro de Siria y configurar los demás pueden tener algunas variaciones, pero en última instancia todas están orientadas a hacer lo mismo que es registrar tu actividad de aplicación. No, déjame explicar a qué me refiero registrando actividad de aplicación. Hay momentos en que ocurren eventos inesperados y si ocurre nulo y se oye hablar de ello cinco minutos después o incluso el instante después de que ocurra. A veces es difícil de rastrear, sobre todo en este contexto o es una API. No hay interfaz de usuario real, no hay retroalimentación real excepto en el error que se ha producido. Por lo que el uso de esta utilidad de inicio de sesión será capaz de tomar notas en cuanto a qué opción activó wat a respuesta que habría resultado ser una respuesta de error. E incluso entonces podemos ver los detalles de la respuesta de error set. Entonces, empecemos con la configuración de nuestro registro. Por lo que necesitamos sacar las librerías asociadas con serial. Entonces solo voy a hacer clic derecho en el proyecto, ir a administrar nuevos paquetes get. Y luego vamos a buscar en la sección de los Boroughs. Entonces estos son los que hemos instalado. Tus versiones pueden ser diferentes a las mías. Y si se te pide que actualices, ten cuidado de que deberías poder actualizar el Microsoft en CFD lo suficiente, pero solo ten cuidado al hacer y necesita estar listo para Roebuck en caso de que algo griegos. Por el momento, no, navegaremos y buscaremos Siria Log dot ASP.NET Core. Entonces verás ésta, pero esa no es la que queremos. Queremos puntos ASP.NET Core. Este cuenta con una librería dedicada a nuestro tipo de proyecto. Entonces podemos seguir adelante e instalar eso una vez más, si la versión es diferente, no debería ser un problema mayor. Y por todos los problemas que estás obteniendo, sólo tienes que seguir adelante y responder de manera afirmativa. Y luego una vez hecho eso, sólo vamos a dirigirnos a nuestro program.cs y comenzar nuestra configuración. Entonces todo lo que necesitamos hacer es dejar la aplicación ni que donde vas a estar usando Siri log en lugar del registrador predeterminado que venía con proyecto. Porque si miras en molestar, ves que hay alguna apariencia de un maderero. Te están dando algunas configuraciones, pero entonces esto no es tan robusto como lo que queremos, ¿verdad? Entonces Cirillo tipo de construye encima de eso y nos permite anular. Entonces voy a bajar al constructor de agujeros para los ojos. Y lo primero que voy a hacer es hacer una nueva línea sobre eso en su tierra 20 y los puntos usan y derecha, Siri log. Está bien. Entonces una vez que haga eso, me va a hacer saber lo que necesito para incluir esa biblioteca. Por lo tanto, utilice su registro después de incluir que usando declaración. Bueno entonces eso no es todo. Eso no es algo que el principio cosido sepa que tenemos esta biblioteca aquí. Ahora podemos volver atrás y configurar. Entonces solo estoy haciendo consiguiendo este cartílago de la rueda porque en el autobús admito, me he olvidado de poner eso. Entonces no saquemos nada del camino y procedamos a modificar nuestra aplicación principal, que va a inicializar nuestro registrador cuando la aplicación inicie jabón y donde hace termina Putin algunos escenarios de registro de prueba aquí mismo en la media como nuestro caso de prueba. Entonces lo que quiero hacer es configurar un objeto registrador. Entonces voy a decir Log dot logger es igual a una nueva configuración de registrador. De acuerdo, entonces lo que esto nos va a permitir hacer es establecer algunos valores por defecto y comportamientos esperados para nuestro logger. Entonces solo voy a estar rompiendo alineado con cada configuración que añado fue a punto c. Y la primera configuración que quiero es correcta, herramienta, luego nudos otra vez. Y luego ven aquí tienen diferentes opciones. Por lo que dispararon en consola llamaron Alltop la caja, pero luego hablan de lavabos. Para que pueda descargar bibliotecas específicas para que puedas amar a una base de datos. Puedes registrar otros dos archivos diversos o tipos de archivos en función de cómo lo necesites barco, ¿verdad? No, sólo me interesa archivo más adelante en esta pequeña base de datos de barras y así sucesivamente. Podemos doble-back en Agregar herramienta de registro de base de datos o un conjunto de herramientas. Entonces bien, no, solo veo derecho a presentar. Y entonces esto toma algunos parámetros. Entonces voy a nombrarlos sólo porque no necesariamente voy a atarlos el orden específico que se requieren aquí en los constructores o en las sobrecargas más bien, ¿verdad? Entonces el primero que voy a escribir es path. Ruta significa ¿dónde se debe crear este archivo? Cuando se necesita crear o anuncios en ruta necesita ser una cadena. Entonces no quiero establecer un camino establecido y sólo voy a pasar algún tiempo y explicado aquí. Una vez más, el contexto gobierna. Uno, puede que desee tener una ruta de registro central, porque una vez que haya desplegado su API en un servidor, no desea estar gastando en adivinar dónde hizo el logotipo, dónde podría estar el registro, posible que no lo desee en el proyecto real. Correcto. Porque tenía un archivo de registro aquí que acaba de haber borrado admitir. Pero puede que no lo desee en un proyecto porque alguien de Broglie y aplicación puede no necesariamente, no necesariamente quiere que entren en los archivos del proyecto en el servidor para poder acceder a los tacos. Por lo que se puede definir en algún lugar de la red y se puede definir en otra unidad. Simplemente puedes poner en un camino aquí donde sabes, quieres que tus archivos de registro se meta. Entonces voy a ver algo así como barra de barra de colon C y cuándo decir hotel. Entonces sé exactamente con qué obligación estoy lidiando cuando veo la carpeta, listados de hoteles, troncos de barra, ¿verdad? Ese es mi jefe el que estoy definiendo. Entonces no digo que debas definir el spot si es el disco D para ti. Si no quieres poner los troncos, eso depende de ti, correcto. Pero solo te estoy recomendando que lo hagas fácilmente accesible o lo suficientemente accesible. Lo puedes encontrar cuando lo necesites. Está bien. Entonces ver listados de hoteles, registros, y luego solo voy a dar mi archivo log dash dot TXT. Entonces voy a explicar que son aparentemente guión aleatorio en unos pocos. Entonces esa es mi ruta de archivo. Hasta ahora, muchas flechas, pero sigamos y veamos qué esas, así que solo estoy rompiendo líneas para que podamos ver todo. Está bien. Esta rompiendo y haciendo una pena, sangría. Está bien, así que eso es todo por el camino. La siguiente configuración que voy a poner es la plantilla de salida. ¿ Cómo quiero que se vea cada línea? ¿Verdad? Por lo que ya preparé todas las plantillas puestas. Yo solo lo voy a pegar ahí y te guiaré a través de ella. Por lo que una vez más llamado parámetro o poner plantillas colon y el valor que quiero serían marcas de tiempo Estoy tendiendo que pone en una marca de tiempo con ese nivel de detalle, puedes sumar o restar. Puede que no necesites todos estos año, mes, día, hora, minuto, segundo mini milisegundo y lo que sea Z, ¿verdad? Por lo que he visto esto, usado esto muy detallado. Te da la marca de tiempo exacta, pasa algo. Es posible que no necesites ese nivel de detalle que depende de ti. Y entonces el nivel qué nivel de advertencia es es es una advertencia de inflamación. Pasaré por eso más adelante. ¿ Cuál es el mensaje? Y luego nueva línea o excepción, si hay una excepción incluida y Bricklin y mostrar la excepción. De acuerdo, entonces eso es básicamente lo que es. Haciendo. Los experimentos son que tengo es rodando intervalos. Entonces eso significa qué intervalo debe eso crear unos nuevos archivos. Entonces eso me trae de vuelta a ese dash dot aleatorio, punto hub ahí. Porque lo que va a pasar aquí es cuando veo intervalo rodando punto d significa y sin guión y el DID asociado con cada d. Así que esto es bueno para segmentar a tu amado rápido. Entonces alguien dijo algo arriba en la última semana, jueves. Puedes ir fácilmente y encontrar el archivo de registro para el jueves de descanso de la semana pasada y revisarlo. De lo contrario, solo van a terminar con un archivo grande que sigue creciendo y creciendo y creciendo. Y luego vas a tener años de tacos en un solo archivo, que es para mí eso es ineficiente, al menos cuando tienes múltiples archivos, puedes manejar los más viejos. Puedes eliminarlos de forma segura o moverlos a un archivo de forma segura y aún así mantener esa segregación. Entonces por eso estoy estableciendo ese intervalo temprano. ¿ Qué tienes diferentes opciones? Podrías hacerlo por el día, por la hora, o por el minuto, por el año, depende de ti. Está bien. El siguiente sería el nivel mínimo restringido. Entonces quiero restringir a un mínimo de información de nivel de eventos de registro, ¿verdad? Significado que HACO necesita un C cada cosita, hay ciertos puntos de depuración. Todos ellos, ya sabes, esto está empezando, inicializando esto y revelan que no necesito ver todo eso. Por lo que toda la verbose aquí los logs son depende de cuánto registres, así como de lo que establezcas como mínimo. Entonces aquí estoy viendo solo log a un mínimo de información. Necesito incluir este controlador de biblioteca puntos enter, e incluimos esa biblioteca. Y luego me falta este punto y coma. Pero antes de ponerme el punto y coma y echar un vistazo aquí otra vez. Entonces estamos seguros, y me falta una coma aquí. Entonces eso es algo bueno. A tomó para revisar eso. Y entonces lo último aquí para deshacerse de todas estas matrices sería, después de que este archivo abra y cerrara llave, decimos dot create loggers. Por lo que es bueno ver una configuración de registrador en todos estos. Crear el objeto registrador. No. De acuerdo, así que ahora que lo tenemos creado, en realidad podemos empezar a usarlo. Entonces lo que voy a hacer aquí es que estamos arriba o iniciar proceso o nuestro medio, la línea principal en la función principal dentro de nuestro track cash. Y si no estás tan familiarizado con ese gadget de pista significa que va a tratar de hacer algo y si hay una excepción, lo atrapará y lo manejará en consecuencia. Entonces eso es lo que llamaremos manejo de excepciones. De acuerdo, entonces lo que vamos a hacer es intentar correr esta línea. Pero antes de eso voy a iniciar sesión en la información. Nuestros bits de información de inicio de sesión para decir, hey, se está iniciando la aplicación para que podamos ver exactamente a qué hora y todos los detalles requeridos para saber que la aplicación comenzó en ese punto. Muy bien, si atrapamos una excepción, y aquí solo estoy calificando excepción con los objetos que en realidad sostiene la excepción, entonces voy a ver fatal. Para que puedas registrar error, puedo iniciar sesión información, puedes registrar advertencia. Aquí, se alimenta de si la aplicación deja de funcionar. Entonces estoy viendo en el amor no fatal. Y ya veo y esta es la excepción que causa que el feto anhelaba ser escrito. Y esta es una aplicación MRD y una C en campos, campos a iniciar. Entonces estoy viendo para que cuando alguien revise el registro, este es el resultado de o esto es lo que pasó. Derivado de esta excepción. El logger hará farmacéutico Tito Nissl formateado y lo escupirá en el archivo de acuerdo a esto. ¿ Está bien? Y luego después de todo eso, sólo voy a decir finalmente. Por fin significa después de que has manejado o que habían probado la operación y lo atrapó y todo está hecho. ¿ Qué quiero hacer aquí? Ya veo, solo quiero vaciar y cerrar mi objeto log. Entonces eso es lo que va a pasar cuando iniciemos nuestra aplicación. Entonces bien, no, voy a seguir adelante y presionar este botón Play arriba aquí arriba, que va a poner en marcha tu aplicación. O podemos ir al archivo de registro y ver qué pasa. Muy bien, así que ahora que la aplicación está cargada y solo para que puedas ver, el navegador se le ocurrirá swagger, pasará por swagger y más adelante, no te preocupes demasiado. Humboldt es esto, se ve bien, pero nuestro enfoque aquí está en nuestros registros. Por lo que vemos nuestro registro aquí. Se inicia la aplicación ahora vemos el nivel de registro y es una especie de formateado. Santo, pensé que no estaría bien. Por lo que otras cosas realmente están escribiendo en el registro, ver sus obligaciones comenzaron. Por lo que se iniciaron los datos de registro. Entonces este es un inicio, éste comenzó. Para que puedas ver las estampillas de tiempo exactas para lo que vale, ¿verdad? Conocemos el medio ambiente, por lo que ves que los registros nos proporcionan ciertos detalles que no podemos ver cuando solo estamos mirando a los boroughs son así. Nunca sabrías que todo esto sucedió en el buck crecido con solo mirar esto. Entonces eso es todo para nosotros configurando el registrador, al menos por ahora, más adelante configuramos nuestra base de datos y así sucesivamente. Podemos volver y agregar la función que puede registrar a la base de datos. También. 9. Explora Swagger UI: Bienvenidos de vuelta chicos. Por lo que hoy queremos sólo tener un swagger de run-through off rápido, cómo se vincula con nuestro desarrollo de API y cuál es su propósito. Por lo que swagger realmente está ahí para ayudar a simplificar el desarrollo de API para usuarios, equipos y empresas. Se trata de un conjunto de herramientas de código abierto y básicamente nos ayuda a diseñar un documento nuestras necesidades obesas con mucho menos esfuerzo del que realmente se necesitaría para tener este nivel de detalle. Entonces es una herramienta realmente buena. Nos ayuda aún automatiza un montón de cosas. Y lo mejor de su impar es que ya está incluido con nuestra API en versiones anteriores, quien tendría que ir e instalarlo está otorgado que no fue un proceso muy difícil. Las balas notan que Microsoft sí parece que es una especie de estándar que todo el mundo con una EPA quiera poner al fútbol Jian porque es tan cool, tan eficiente en todo lo que está haciendo. Entonces lo que han hecho es que en realidad acaban de empezar a empaquetarlo en nuestra API para nosotros. Por lo que las principales bibliotecas que permiten integrar el swagger, bueno una, viene de este nuevo GET bolsillos. Si voy a administrar nuevo paquete get, veremos que ya tenemos el paquete instalado. Swash punto múltiple es p y.NET Core. De acuerdo, era menos herramientas de desorden que en nuestra startup. Entonces recuerda que program.cs causa el inicio. Entonces startup es nulo donde definimos todos los middlewares y el que tenemos en los servicios para Sagar es servicios, pensamientos, impar swagger, Jen, ponemos si o no nosotros de cualquier manera, si lo estuviéramos haciendo manualmente, tendríamos que hacer esto. Pero debido a que se generó, una vez más, no tenemos ese paso. Por lo que generará el jadeo y el documento. Apoya el versionado. Entonces si tienes la versión uno, versión dos, etcétera, fuera de tu API, eres capaz de mantener el camión alejado de las versiones están en agradable. Deja que quien esté leyendo documentación versión de Norwich fuera de la API que están mirando, puedes definir cierta inflamación de API abierta. Ese es el título, la versión. Si hago clic en coma aquí, verás que nuevamente agregas información de contacto. Se puede agregar una descripción, licencia, todo tipo de cosas. Por lo que tus documentos o alguien que mira tu documentación de API sabe exactamente quién si quieres proporcionar ese nivel de detalle y ver esta API es de pernos. Posteriormente. Además no lo hagas ni lo otro. En la sección Configurar, tenemos el uso swagger and up use swagger UI. Por lo que la interfaz de usuario de swagger significa que creará su propio endpoint para tener su propio tipo de archivo de configuración, y llamará a su lista de hoteles v1. No, ¿verdad? Y no, esto es al final es el desarrollo. Entonces n es sólo una variable que nos permite rastrear qué ambiente donde en nuestro temprano desarrollo, cuando pan, leche, Schon, ¿verdad? No, cualquier cosa que entre aquí. Básicamente es ver. Estamos en desarrollo. Entonces cuando publicamos esto para decir como tu IIS o a internet, lo que sea que esté donde esté lo ponemos, no hagas nada de esto. Eso es lo que dice básicamente esta afirmación if. No, creo que el futbol es útil. Entonces, si bien pueden haberlo puesto en la parte de desarrollo, que entiendo, creo que es más fácil simplemente incluirlo en la API en todo momento. De tal manera que cuando publiqué mi API ADL y duro brindar tanto soporte técnico a alguien más para enseñarles a usar la API porque para eso es la documentación swagger. Entonces voy a tomar sólo estas dos líneas todo duro que si la declaración y colocarlas en el área general donde todo se va a hacer sin importar el entorno. Entonces esa es mi modificación. Una vez más, el contexto es todo lo que puedo entender que por razones de seguridad o simplemente general Lakoff necesita el intercambio de información. Probablemente dijeron, bueno, solo lo miras en un entorno de desarrollo porque los desarrolladores pueden ser internos. Pero entonces si es para desarrolladores de terceros, entonces voy a hacerlo externo y accesible públicamente. Entonces echemos un vistazo a uno de nuestros controladores. Y bueno, el controlador que tenemos, y ustedes ven aquí nos da el pronóstico del tiempo y defensa consigo método. De acuerdo, ahora si ejecuto la aplicación y aparece la página web, estamos viendo nuestros documentos swagger de swag. De acuerdo, así que listado hotelero versión uno, todas esas eran cosas definidas en la startup. Entonces si necesitas cambiar el nombre o hacerlo más atractivo, fácil de usar, legible por humanos. Siempre se puede cambiar dentro de las áreas de configuración aquí y aquí, ahí mismo está, título. Por lo que si quieres agregar descripción, descripción, saldrá en la página. Ahora aquí nos está mostrando lo que hay en la API y lo que hay en la API sería nuestro endpoint para conseguir, correcto, volver al controlador para obtener pronóstico del tiempo. ¿ Está bien? Por lo que es generar contextualmente este documento basado en lo que ve en el proyecto. Y cuando hagas clic en eso, te mostrará ejemplos de lo que va a volver cuando intentes recuperar algo. Lo cual es exactamente correcto porque esto está devolviendo una lista de pronóstico del tiempo y pronóstico del tiempo. El terrorismo es una clase que tiene algunos campos de datos definidos en cada uno tiene un tipo de datos de fecha. Entonces datetime, int, int y string. Entonces ya ves si swagger realmente los está tomando todos, ve el que está mostrando que vas a conseguir campo MCA llamado Beat temperature, temperatura del mar f. Y resumen te va a mostrar todos ellos. Y da, incluso dándote una idea del tipo de datos, Datetime. Int, int y una cadena. Entonces solo te estoy mostrando lo poderoso que es el Sagar sin ningún esfuerzo de nuestra parte para tener ya documentación API, que una vez más es muy importante cuando vas a estar construyendo en aplicación cliente, consumiendo cualquier API. O si eres el que construye la API, lo haces fácil para alguien que tiene que consumirla. Entonces de la misma manera que te gustaría que te trataran como consumidor de la API de alguien para tener toda la información que necesitas para saber cómo construir la suya propia. Quieres asegurarte de proporcionar esa información a las personas que interactúan con la tuya. Por lo que swagger hace que salga de la caja muy fácil. Y solo para empujar un poco el sobre, cuando vamos a probarlo es viejo, en realidad podemos hacer clic en Ejecutar y swagger nos permite realmente probar nuestra API aquí mismo. Entonces estos, estos datos que están regresando con el código de estado 200, nos metemos en todo eso más adelante. Pero se ve el cuerpo de respuesta. Eso se debe a que en realidad se ejecuta el código que está aquí. Y solo para demostrar que si hacemos click sobre y esta p y obtenemos estos puntos rojos, que es un punto de ruptura. Por lo que solo voy a hacer clic de nuevo en Ejecutar. Y luego ves que Visual Studio pausas y golpea este punto de interrupción ac, ya sabes, tiene esta flecha amarilla en ella. Y eso nos permite presionar FL f 11 y ir línea por línea. Entonces no estoy tratando de mostrarte cómo depurar NANDA mostrándote que esto no es pelusa, en realidad nos ayudará a probar. Entonces no hay utilidades de prueba F2, swagger y cartero. De acuerdo, entonces y presiono F5 o solo puedo dar clic en continuar arriba aquí, cualquiera que sea, entonces solo continuará con la ejecución y lo traerá de vuelta. De acuerdo, así que eso es todo el jadeo nos ayuda en nuestra búsqueda de pruebas. Ahora sólo voy a hacer para caer en especial y vamos a incluir o logger aquí. Entonces arriba, ya lo he, bueno, por defecto se inyecta. Entonces debido a que estamos usando semilog como registrador predeterminado cuando hacemos el registro usando nuestro objeto aquí, usará el registrador serial. Entonces solo te voy a mostrar pequeños fragmentos de hoyo logging esperanzas puedo decir puntos lager. Y entonces permitiría que la información dijera pronósticos meteorológicos accedidos. Está bien. Entonces esto es solo inflamación para ver accesible el pronóstico. Y luego puedo ver más adelante los pronósticos meteorológicos regresaron algo así. Ya sabes, puede que no. Esto, esto es una bala elemental, es sólo una vez más, por ejemplo, Sikh. Entonces solo ver logger. Blogger. Ah, bueno, lo siento, pongo eso para encontrar oh, aquí hay unas declaraciones de retorno, así que sólo lo dejaré como información para que no más adelante llegaremos a experimentar web torbellino o sin comillas atestiguarlo. Entonces solo voy a ejecutar esta aplicación una vez. Y luego voy a seguir adelante y probarlo. Haga clic en Ejecutar. Puedo quitar el punto de ruptura con sólo hacer clic. Por lo que mientras ese punto rojo esté ahí, se va a parar cuando llegue a esa línea, solo quitas los puntos rojos y presiona F5 para que continúe. Muy bien, así ejecutado. Déjame ver si mi bitácora me va a mostrar algo útil y maduro y fan. Y ahí vamos. Entonces estos son ahora los archivos de registro todas las veces que en realidad lo hemos abierto y hizo algo que se ve aquí, está justo en los pulmones. Entonces aquí está nuestra primera aplicación de blog se está iniciando y luego se registran datos. Esto hizo eso. Y luego aquí está la que acabamos de escribir, accedió pronóstico del tiempo, ¿verdad? Y luego te está contando todos los detalles de lo que está haciendo y conseguir un descendido. Correcto. Entonces eso es todo un trabajo de tala, eso es todo funciona Sagar. 10. Configuración de CORS: Bienvenidos de vuelta chicos. En esta lección, vamos a estar configurando nuestra política de coro. No, por supuesto, es un acrónimo para compartir recursos de origen cruzado. Y esto es sólo un mecanismo que permite permitir nuestras restricciones. El reparto de recursos a través de los medios de aunque. Déjame decir eso en un poco más de inglés. Cuando alguien que no está en tu red intenta acceder a tu API, por defecto, tu API ha sido rechazar esas solicitudes de acceso. De acuerdo, entonces si desarrollo una API interna para ser usada en mi empresa y alguien de fuera de mi empresa con una dirección IP completamente diferente y todo trata de consumir la API o hablar con la API, entonces se va para saber automáticamente eso, oye, bueno, no puedo enviarte ninguna información porque no te conozco. Por lo que queremos configurar esta política para facilitar alguna conversación con fuentes son requirentes. Eso es que no estoy necesariamente en nuestra red. De acuerdo, así que en realidad me he topado con esto antes donde desarrollé una API para mi empresa, para uso de terceros. Y pasé algún tiempo depurando por qué esta empresa no podía acceder a la API que claramente estaba trabajando en mi máquina y en todas las demás máquinas, nuestra propia B. Y luego después de cavar, me di cuenta de que era la corresponden a c. Así que a veces dejas un e-learning aprendido a través de la experiencia. Bueno, estoy aquí sólo para hacerte saber qué configuraciones puedes poner en marcha desde el principio para evitar cierto trabajo. Entonces para agregar esta política, lo que vamos a hacer es en nuestro archivo de startup dot cs y solo lo voy a agregar aquí. El orden sí importa hasta cierto punto, pero en este momento no nos estamos centrando realmente en el auto solo quisiera conseguir nuestras configuraciones en. Alguien acaba de decir servicios, puntar, agregar núcleos, y luego simplemente poner el punto y coma ahí. Entonces cuando decimos, por supuesto, necesitamos agregar una política como el cuerpo necesita saber hacer para comportarse, ¿verdad? Entonces de la misma manera que cuando estamos montando la otra jaga Jin, lo siento, diría Ver, y luego esta lambda R0. Y entonces podemos tener múltiples líneas con múltiples configuraciones. Verías que es con puntos finales y así sucesivamente. Nosotros vamos a estar haciendo eso aquí. Entonces voy a ver todo lo que puedes usar cualquier herramienta puede realmente no iguala b, c, o igual a las opciones de palabra. Como dije, los ves usando piedra Endpoints aquí. Entonces solo diré Todo. Y luego la lambda R0. Y entonces lo que voy a hacer es abrir y cerrar llaves. Entonces eso significa que voy a tener todo un bloque de configuración en alguna esta ruptura en la línea para que podamos ver con claridad exactamente lo que buscaba. Y luego voy a decir toda la política de adición de puntos. Está bien, entonces estoy sumando póliza entonces después de darle un nombre. Entonces primer parámetro es una señora, lo llamaré herramienta de política CORS, elegante o confuso. Por lo que CORS política, luego coma y luego después definir otra lambda. Entonces solo llamaré a este construir su causa normal para estar construyendo las políticas. Entonces Builder lambda R0 y yo sólo romperé línea. Por lo que quería decir un constructor. Los puntos permiten cualquiera. Entonces aquí están todas las opciones antes de que empezara a sentarlas. Estas son todas las opciones que puedes permitir. Nea puede no permitir, puedes establecer. Entonces si es blanco listado o con ciertos encabezados, se puede definir hall. Tu API determinará a quién se le permite acceder a mí o a mis recursos y quién no. Farnell con fines educativos. Posteriormente, tal vez podamos ver el aseguramiento de la misma y sagrada mezcla y partido. Bueno entonces una vez más, el contexto lo es todo. Si estás desarrollando una API para internet y uso de terceros, entonces no puedes ser demasiado Street con la API si alguien infrarrojo debería poder subir. De lo contrario, vas a tener una sobrecarga administrativa de tratar de averiguar quién es quién todo el tiempo. Entonces solo voy a decir un bajo cualquier origen. Y solo voy a encadenar a lo largo de un bajo cualquier método, lo que significa que pueden acceder a cada método que endpoint que es se define aquí. Y luego fui a saludar, cualquier cabeza DAR, lo siento, un bajo, cualquier encabezado. Está bien, y luego cierra la llave para la póliza y luego usa punto y coma. Entonces esa es mi política de curso que se definen. Entonces HACO siloizando a todos y a cualquiera. Una vez que vengas a acceder a mi API, puedes seguir adelante y usar los recursos. Una vez más, el contexto es todo lo que determinará lo estricto que eres con tu, tu política de curso. Ahora, después de hacer todo eso, no voy a bajar a configurar. Y voy a dejar que el nulo que sí debería usar las políticas del curso. Entonces aquí mismo, solo voy a decir usa núcleos. Ahí vamos. Y luego se va a decir, vale, hace algunas sobrecargas. Voy a decirle el nombre de la póliza C. Y así que sólo con poner las comillas, es un viejo dicho, vale, ¿qué son los nombres de una póliza? Entonces el nombre de la política como acabo de esbozar arriba es la política gruesa. Entonces tal vez podrías hacerlo un poco más informativo. Se podía ver un bajo. Está bien, porque eso es todo lo que realmente está haciendo. Esta política nos está permitiendo, voy a decir usa la política que dice hola. Muy bien, entonces para eso es para lo que por supuesto es realmente la política. Entonces esto, en esta situación, no nos fuimos a ver plenamente los beneficios de la misma. Pero entonces si hiciste algún otro proyecto donde tienes la API y luego tienes un proyecto completamente diferente, que son los proyectos del cliente, lo que significa que se está transmitiendo en una dirección IP diferente a nuestro puerto, que el actual proyecto API. Una vez que intentaron platicar, eso no funcionará hasta que tengas esta política en marcha. 11. Revisar y añadir cambios a GitHub: Bienvenidos de vuelta chicos. En este curso estaremos agregando o cotizando al control de fuentes y todo el control de fuentes es una maravillosa herramienta que se utiliza para ayudarnos a hacer un seguimiento de todos los cambios que estamos haciendo en una aplicación. También nos ayuda a trabajar bien en equipos porque en lugar de tener 34 versiones diferentes fuera de un proyecto, el repositorio de control de fuentes actúa como un área de almacenamiento central para todos. Se trata de una suscripción para comprobar los cambios de Ian compararse con otros, resolver conflictos, y muchos otros beneficios. Por lo que vamos a estar configurando nuestro control de fuentes para nuestro proyecto. Y después de que completemos cada módulo solo irá adelante y lo revisaremos y nos aseguraremos de que tengamos árbol consistente de todos los cambios principales que se cumplan en nuestros proyectos a medida que avanzamos. Por lo que nuestra herramienta de elección es GitHub, que es nulo que Microsoft posee. Por lo que eso lo convierte en una herramienta maravillosa. Fácil integración en todo es maravilloso de YouTube. También nos permite albergar proyectos públicamente que otros puedan venir y ver tu trabajo y ayudarnos, nos ayuda a construir un portafolio de proyectos para ser utilizados incluso para nuestro propio currículum. Entonces si no tienes ya una cuenta de github, puedes seguir adelante y golpear Regístrate. Es bastante fácil crear uno solo necesitas un nombre de usuario, dirección de correo electrónico, y contraseña, y algo de verificación y luego estás dentro. Por lo que ya tengo medico y así sólo voy a seguir adelante e iniciar sesión. Y solo te estoy dando una vista previa de mi página web. Se ve el repositorio está a la izquierda que las personas que han seguido. Da una buena fuente de noticias en cuanto a lo que la gente está haciendo en el camino. Quién te está siguiendo IQ y los siguió. Y es solo una herramienta maravillosa para tipo de construir una relación con otros desarrolladores y comunidad de código abierto en general. Ahora volviendo a nuestros proyectos, lo que vamos a hacer es simplemente agregar este control de fuente. Por lo que la forma más fácil de hacer esto es mirar hacia abajo hasta la esquina inferior derecha y se ve que se suman al control de fuente. Entonces si hacemos clic en eso, verás se pone y lo que pasa es que tienes una versión de Git en tu computadora, pero entonces también podemos sincronizarla con GitHub. Entonces una vez que hagas eso, se va a decir, vale, mientras que el camino local por favor inicia sesión, dijiste es el destino principal. Entonces como dije, es propiedad de Microsoft. La integración es muy fácil. Para que puedas seguir adelante y firmar en silos, añadir mis conos GuitarBot, y ya tengo ahí segundo está autorizado. Y una vez que eso tiene éxito, acababan de regresar a Visual Studio. Y ves solo sentir cargar todo. El nombre del repositorio, se puede agregar una descripción alguien para ver que se trata de una API web educativa construida usando.NET Core 5. Entonces alguien tropieza con él. Llegarán a un poco sólo cosas. Ah, eso es lo que algunos pernos. No, sí permiten repositorios privados. Correcto. Entonces si estás trabajando en un proyecto escolar o realmente algo que sea confidencial, no quiero que el mundo pueda acceder a él. Adelante y deja ese simulacro de estado. De lo contrario usted en boleto. Por lo que quería compartir esto con ustedes chicos. Déjalo encendido y luego te mostrará este será el enlace directo al repositorio. Por lo que voy a seguir adelante y hacer clic en Crear y empujar. Y una vez hecho eso, voy a volver a GitHub y Trend View it. No, puede que lo encuentres fácilmente aquí tengo bastantes repositorios a mi izquierda. Entonces lo que voy a hacer es dar click en mi imagen de visualización, ir a tus repositorios, y luego voy a ver todos ellos listados tipo de en el orden en que se actualizaron por última vez, derecha. Entonces aquí está mi listado de hoteles y todos nosotros estamos aquí, OTA listando los controladores, todo en lo que he trabajado. Por lo que estos serán los primeros pollos. Entonces como dije, se mantiene apagado todos los commits. Cada vez que hacemos un cambio, podemos ir a ver qué se hizo exactamente. Y este fue el primer commit, así que no tuvimos que agregar un mensaje, pero más adelante verás que podemos agregar mensajes para que podamos anotar cada vez que tomamos código y decir, esto es lo que pasó en esta versión. Entonces con eso hecho, hemos completado esta primera fase de poner nuestra aplicación en el control de fuentes. Puedes seguir adelante y agregar un Read Me para que la gente obtenga alguna cantidad de instrucción a menos que el todo Para usar tu proyecto. Si es algo que está ahí para que cada n lo use cualquiera. 12. Implementar las clases de datos y el marco de la entidad: Bienvenido de nuevo. En esta lección, vamos a empezar a configurar nuestras clases de datos. Y por extensión o base de datos que estaremos usando Entity Framework, que es Microsoft.NET cores insignia Object Relational Mapper o ORM para abreviar. Y nos permiten realmente modelar o clases de base de datos son nuestras tablas de base de datos más bien como clases C-sharp, luego diseñar nuestra base de datos en base a nuestras definiciones de clase. Entonces lo que vamos a estar haciendo para que las cosas comiencen es crear una nueva carpeta en nuestro proyecto. Así que solo tienes que hacer clic derecho, ve a agregar y haz clic en Nueva carpeta y solo llamaremos a esta beta. Ahora dentro de los datos, vamos a empezar a poner en nuestras clases. Por lo que nuestro listado de hoteles o bien, APA realmente, solo con fines educativos, solo tendrá dos clases o dos mesas, una para el país y otra para toda la hasta. Entonces básicamente cuando buscamos nuestro país, deberíamos poder ver todos los hoteles que están asociados a dicho país. Esa es básicamente la idea por la que vamos, ¿verdad? Por lo que solo voy a seguir adelante y hacer clic con el botón derecho en los datos, haga clic en Agregar. Y nuestra primera clase será country. Por lo que nota lo voy a nombrar de manera singular, país. El siguiente sería Hotel. Por lo que esta cada clase representa una unidad, país y un hotel. Antes de empezar a definir los campos para cualquiera de los dos, solo quería poner todos los archivos en su lugar y luego solo podemos trabajar nuestro camino de regreso y ver cómo se vincula todo. Entonces después de haber definido nuestras clases, al menos estas dos, quería simplemente seguir adelante y crear lo que llamamos nuestra clase de contexto DB, ¿verdad? Entonces lo voy a llamar contexto base de datos. Y adelante y agrega eso. Y entonces esta clase realmente va a representar nuestro puente entre nuestras clases definidas o nuestras clases de entidad y la base de datos real. Entonces país, esa es una entidad que va a ser Ford ingeniada en una mesa, ¿verdad? Cualquier cosa que definamos como campos pronto se duplicará y hará eso. Pero lo que se sienta que ponemos en país serán campos en una mesa llamada lo que sea que lo atrapen. Entonces vamos a llamar a los países de la mesa, porque la tabla es efectivamente una colección de registros de tipo país. Lo mismo va para hotel, y lo mismo irá para tantas otras entidades tablas de barra inclinada como pueda tener que definir. Entonces esto es todo lo que llamaremos código primero ingeniería donde realmente escribimos todo el código para un pasillo, creo que nuestras mesas deberían mirar. Y luego adelante ingeniero nuestro hacer ajustes a la mesa en consecuencia. Entonces después de crear este contexto de base de datos, necesitamos un tipo de equipar con cosas que necesita saber que es el puente a la base de datos. Entonces lo primero que necesita saber es que hereda del contexto DB. No, esto va a dar un error porque necesito ir a buscar algunas herramientas. Pero entonces cuando controlo los puntos. Usted, verá Visual Studio sugiriendo que instale el paquete que falta, que es Microsoft dot Entity Framework Core. Si no estás viendo este prompt, NO hay problema. Siempre puedes simplemente ir haciendo clic derecho en el proyecto conseguido, administrado New gets, y luego puedes buscar el mismo paquete, solo tienes que ir a navegar y escribir el nombre del paquete y lo verías listado ahí. Entonces yo aunque en obras, pero mientras estoy aquí, sólo voy a sacar todas las bibliotecas de aquí. Eso es lo que sé que voy a necesitar, así que definitivamente voy a necesitar esta biblioteca, así que no cargue esa. Y una vez más, sé que definitivamente voy a necesitar el controlador para SQL Server porque estaremos usando bases de datos SQL Server. Dicho eso, hay otros para otro motor de base de datos para que puedas usar una luz de secuela. Tienes, he visto postgres no ver listados aquí, no de inmediato, pero están todos aquí. Entonces estaremos usando SQL Server. Entonces seguiré adelante y conseguiré esa. Y la final que estamos recibiendo, al menos para este periodo, es el conjunto de herramientas porque necesitamos las herramientas para poder ejecutar algunos comandos en el futuro. Entonces solo seguiré adelante e instalaré ese también. De acuerdo, así que ahora que terminamos en New se pone, si esos salon para revisar e instalar, si despejas el filtro, verás todo lo que tienes instalado. Eso está bien. Entonces voy a volver a mi contexto DB y luego fui a controlar y puntear otra vez y luego el prompt, NO gen aún incluye la declaración de uso porque ya tenemos la biblioteca en este punto. Ahora dentro de un repositorio lejano, bueno, lo siento, o contexto de base de datos, lo que necesitamos hacer es definir un constructor. Entonces voy a ver el contexto de la base de datos pública, o podría haber hecho de ver Tar tina, tina. Ahí vamos. Y luego voy a tomar el parámetro opciones de contexto DB. Por lo que esto se transmitirá desde el enchufe de arranque. Ya hemos definido todo eso, así que sólo lo estamos encajando. Escribir nulo. Y luego el agua que necesito hacer también es inicializar el controlador base, lo siento, un constructor para que el contexto DB tome las mismas opciones. Para no, no necesitamos poner nada más dentro del constructor para que podamos simplemente dejar eso en blanco y seguir adelante. Entonces sí dije que esto representa el puente entre nuestra aplicación en nuestra base de datos. Entonces es aquí donde realmente enumeramos lo que la base de datos debe conocerla cuando se está generando. Por lo que en términos más cortos son términos más prácticos. Yo quería decir que un conjunto de DB público da los datos de este DB, tipo de datos, que en este caso podría ser país. Y luego voy a dar el nombre de la propiedad, que serían países. Entonces el nombre que le darías aquí es el nombre que usará la base de datos. Por lo que el tipo de datos en lo que respecta a C-sharp es Gunter, preocupado es país. Pero entonces la base de datos se va a. Definir una tabla llamada países y siempre que estemos accediendo a ella accederemos como países. Entonces eso es una cosa menor. Es decir, todo el mundo tiene sus propias convenciones de nomenclatura sobre que las personas usan una letra común para sus nombres de tabla. No me gusta hacer eso. Me gusta mantener mis nombres de tabla plural y el tipo de datos singular porque este es un país y qué hace una colección de países después de agosto es ese dB? Es un conjunto de países por más que quieras justificarlo, esa es mi justificación. Una vez más, el contexto gobierna todo. Entonces haré lo mismo por hotel y hoteles. Después de hacer todo esto, necesitamos dejar que nuestras cosas molestas no tengan cadena de conexión. Entonces la cadena de conexión es básicamente igual que el nombre sugiere, como cadena, que todas las líneas se orientan para llegar a la base de datos a la que la aplicación necesita conectarse. Entonces lo que voy a hacer aquí es crear una nueva sección y ver que automáticamente le da una cadena de conexión, ¿verdad? Y dentro ahí solo voy a llamar a esto, llamémoslo conexión SQL. Y la conexión va a tener Server igual y tenemos base de datos local que es una especie de incorporada en Visual Studio. Por lo que en este punto, puede que tenga su propia base de datos que desee utilizar. Si, de no ser así, eres principiante y solo las estás siguiendo, puedes usar esta que está por defecto para hacer mucho más instalación en realidad, ya está incluida con tu instalación de Visual Studio. No obstante, en este punto, si tienes como un servidor SQL localhost comenzando con una dirección IP, eso es lo que pondrías como valor de servidor en lugar de lo que tengo aquí. De acuerdo, pero continuando, también definimos nombres de una base de datos. Entonces la base de datos que debemos buscar slash crear, voy a llamarla es listados de hoteles. Listado de fotos en el marcador dd. De acuerdo, así que ese es el nombre de la base de datos con la que me gustaría interrumpir en ese servidor. Y entonces sólo una opción más muy importante son relativamente importante la cual es la seguridad integrada. Y voy a decir que es igual a cierto. Entonces eso es todo a nuestra cadena de conexión. Eso parece. Por lo que todo se unirá después de un tiempo. Simplemente lo estamos haciendo poco a poco, construyendo hasta cuando todo está integrado. Entonces nuestro siguiente paso es pasar a una startup. Entonces sí dije que cuando definimos un contexto, conseguir sus opciones desde la startup. Por lo que la puesta en marcha necesita saber que cuando se inicia la aplicación, debe estar cargando su configuración de base de datos desde aquí y usando este archivo como la brecha. De acuerdo, entonces lo que vamos a hacer es añadir una nueva sección. En realidad, pueden sólo tres. ¿ Se someten alma? Me gusta agregar controladores como último o cerca de lo último que hago en configurar servicios. Por lo que me gustaría hacer todo lo demás antes. Añado controlador para que solo puedas seguir adelante y mover esa línea. Por lo que los servicios puntan contexto DB. De acuerdo, así que lo llamo contexto de base de datos. El código, las funciones es, está buscando contexto DB. Y entonces lo que sí tomó picos es algo de tipo db context. Entonces esto es de contextos de tipo db. Este es mi contexto DB. Eso es lo que estoy creando de alguien, vamos a pasar eso en ya que ese tipo de datos está buscando, por supuesto, incluyendo cualquier referencia que falte. Ahí vamos. Y luego aquí están las opciones de parte. Entonces ese inicializador lambda al que ya estaban acostumbrados o no nos es ajeno por nulo. Entonces para las opciones, voy a decir usar SQL Server. Está bien, y recuerda que cuando obtienes esos snow add intuido que las bibliotecas de SQL Server, si solo controlo los puntos, lo ves aquí viendo incluir la sentencia de uso, bien, así que usa SQL Server. Y luego va a querer saber K. Entonces, ¿de dónde estoy sacando la configuración? Entonces voy a decir configuración. Obtén tu cadena de conexión, cadena de conexión. Ahí vamos. Y entonces esto también se quiere ir. Van a ver la configuración de la App. Por lo que dice dar cadena de conexión porque ya sabe que podría haber una sección para cadenas de conexión. Y digo que consiga la cadena de conexión con ese nombre. Por lo que en realidad puedes definir múltiples cadenas de conexiones aquí solo necesitas una coma, separarlas, y cada una necesita tener su nombre único. Y en ese punto, en realidad podrías configurar de manera diferente. Es contextos obvios para diferentes necesidades. Nuestras bases en la aplicación CME, lo que podría ser útil si eres API necesitaba el span múltiples bases de datos. Entonces hay una serie de beneficios de tener una API porque no se limita a una escrituras se basan en un conjunto de interacciones, ¿verdad? Así que obtener cadena de conexión. Seguiré adelante y pasaré en el nombre cerrando todas las llaves que hay que cerrar. Y Farnell, creo que tenemos todo más adelante volveremos y modificaremos éste. Necesitamos alguna otra funcionalidad añadida, pero para no puntos y coma extra. Y ahí vamos hasta ahora, no, tenemos todo lo que necesitamos. Ahora antes de avanzar más, sólo voy a doblar hacia atrás y vamos a completar nuestras definiciones de clase. Entonces tenemos hotel y tenemos country. Entonces país. Y yo sólo voy a decir tina, tina va a tener una identificación. Por lo que los marcos de entidad es si crea un campo llamado ID, asuma automáticamente que esta es la clave principal. Está bien, así que tienes dos opciones. Se puede ver ID o se puede decir el nombre de la entidad, ID. Dirá automáticamente: OK, bueno, solo usaré esto como clave primaria. De acuerdo, así que ID ahí mismo. Esa es la clave y digamos que el país también tiene nombre. Entonces nombre del país y una diapositiva más. Basta con usar el control D para duplicar esa línea. Y vemos Tal vez zona o afilado. Eso es sólo en breve. Entonces en mi caso, la primera escultura que pondría en su Jamaica y el nombre corto sería j m Y luego basado en el país, por supuesto el nombre corto es diferente, ¿verdad? Entonces esos son los campos que espero que tenga la tabla de países cuando se genere la base de datos. Entonces voy a salvar esa y estoy dispuesto a mirar el hotel No. Entonces para empezar, podemos tomar y nombrar porque, quiero decir, tenemos que tener la clave primaria. Cada hoyo para tiene un nombre, pero luego tengo algunos otros campos aquí, incluyendo dirección, que es cadena, la calificación que es un doble, y luego referencia clave extranjera a nuestro país. Entonces déjame explicarle esto. Entonces si conoces las bases de datos, sabes que la clave principal es un identificador único para cualquier tabla dada. La clave externa representa referencia única o puede no ser única, pero es una herramienta de referencia fuerte. Otro registro en otra tabla. En otras palabras, cualquier hotel tiene que estar en un país. Entonces tenemos el hotel, le damos el nombre, su dirección, historia, comer, pero luego se lo hacemos saber. Nosotros, damos aquí un DNI que corresponde con un ID de país. De acuerdo, entonces tenemos que definir dos campos. Tenemos sobre anotación de datos aquí. Tan cuadrado, donde ES llave extranjera y le das el nombre que quieras. Por lo que en realidad podrías dar este campo de clave extranjera a nombre diferente si quisieras. Es igual a poner manualmente a tu nombre o en este caso, sólo voy a darle el mismo nombre que la clase a la que está referenciando. Entonces nombra como sea clase, ¿verdad? Entonces tenemos dos propiedades. Tenemos el país como objeto, y luego tenemos el ID de país como un entero. Entonces country Id es la referencia más difícil que es la ID valorada en la herramienta hace tres etcétera. Quienquiera que país represente los objetos reales. Por lo que aquí podemos incluir todos los detalles. Cuando miramos a un hotel, si queríamos saber el nombre del país, todo lo que tenemos de forma nativa dentro de Hotel es el ID de contenedor. Pero entonces podemos llenar este objeto con todos los detalles. Por lo que podemos decir Hotel dot country, dot cualquier propiedad que sea que deseamos incluir en nuestra beta. Por lo que esta es bonita y fácil manera de Juan crea una referencia clave extranjera a otra mesa. Y para asegurarnos de que cuando jalamos una consulta para una mesa que tenga llaves extrañas por todo el lugar, podemos incluir todos los detalles aquí mismo sin escribir demasiadas combinaciones internas desordenadas y tener que saltar a través de aros para quedar incluidos. Se. Entonces ahora que tenemos todos estos detalles definidos, permítanme simplemente hacer una corrida rápida sólo para asegurarme de que todos estamos en la misma página. Tenemos nuestra carpeta llamada datos en la que vamos a estar almacenando todos los objetos relacionados con el dominio o la base de datos de lujo y sacó todo eso se almacenará dentro de esta carpeta llamada beta. Posteriormente podemos mirar a tal vez poner en su propio proyecto. Pero para nulo, son solo tres archivos son un número de suelo, no necesitamos hacer todo eso. Por lo que los datos tienen un archivo llamado País, que está definiendo la tabla de nuestro país. Y uno llamado Hotel, que está definiendo la mesa del hotel. También tenemos el contexto de la base de datos, que está heredando de contextos BB cortesía de Entity Framework Core, que una vez más está actuando como nuestro puente entre ya en clases y la base de datos real. ¿ Está bien? ¿ Cómo llega a la base de datos? Bueno, uno, tenemos la cadena de conexión que define dónde buscar, qué buscar y sí, buscar su seguridad, ¿verdad? Entonces esa es nuestra cadena de conexión. De lo contrario, al inicio, queremos agregar el contexto DB o agregar ese puente a la base de datos cortesía fuera de este archivo. Y este archivo debería estar usando esta cadena de conexión. De acuerdo, lo siento, acabo de tener un corsé extra, solo lo quité. De acuerdo, así que hagamos una compilación rápida antes de proceder a la ingeniería de nuestra base de datos. Y para hacer una construcción. Y puedes hacer que sostenga Control Shift y presione B, o puedes ir a construir aquí y construir solución. Pero tenemos un proyecto de ley exitoso. Entonces pasemos a la consola de Package Manager. Si no estás viendo ahí, siempre puedes ir a herramientas y new get package manager y Package Manager console. De acuerdo, así que aquí es donde esa Entity Framework Core dot Tools Library viene muy útil porque nos permite ejecutar ciertos comandos aquí para facilitar el andamio. Y eso es lo que se llama scufed en base de datos, lea la generación de la base de datos. Tenemos que ejecutar ciertos comandos. Entonces lo que tenemos que hacer es primero agregar a lo que llamamos una migración, lo dice, agregar migración dash. Si comienzas a escribir una pestaña de prensa , este tipo de autocompletar. Y entonces diré creación, digamos base de datos creada. De acuerdo, entonces agregamos migración, se crea B2B. Entonces esto básicamente va a generar como manifiesto o un archivo preliminar para ver que se está generando y CM obteniendo un error. Entonces esto es bueno. Es bueno cuando vemos estas flechas y trabajamos a través de ellas porque a veces cuando pasamos a la perfección, no sabemos cuál es mi topping. Muy bien, así que esta flecha tiene que ver con la propiedad country en la clase hotelera. Y creo que eso nos dice el orden. Entonces lo que he hecho es reordenarlo. Entonces tuve la idea debajo de la propiedad. Eso es lo que parece inicialmente. Entonces solo voy a reordenar tomando la propiedad, la propiedad entera, y poniéndola directamente debajo la anotación para una clave externa y moviendo eso no. Y así como puedes ver, pueden ser sensibles nuestros tomates con algunas cosas. Entonces, veamos si esto funciona. Yo sólo voy a volver a ejecutar este comando y migración. Y estamos consiguiendo una vibra completamente diferente donde está viendo molino iniciado con éxito. Y ya es suficiente nieve que has querido deshacer fin de semana alrededor de esto, lo que significa que se ha hecho bien? Entonces aquí tenemos nuestro archivo de migración y luego vemos que tenemos una nueva carpeta llamada Migraciones. Y lo que hace es tomar instantáneas de cada instancia de la base de datos. Por lo que en este punto, estamos definiendo nuestros países de la tabla con estos atributos de columna y estas propiedades. Y si miras, si lo miras de cerca, no quiero que lo analicemos demasiado porque puede ser abrumador. Pero si lo miras como alguien que está familiarizado con el lenguaje C-sharp, te das cuenta de que no está viendo nada fuera de lo común. Al ver que tenemos una tabla o donde crear una tabla, escribir el nombre de la misma es países en base a lo que definimos en el contexto DB, ¿verdad? Países, que las columnas de la tabla deben ser id, que es columna de tipo int. Y lo estamos definiendo como identidad para incrementarse en uno. Está bien, eso es todo lo que realmente está haciendo. El nombre es una cadena que debe definirse como invar char, porque en, en SQL Server, una cadena es realmente invar char y short_name invar char, ¿verdad? Ahí. Estamos, podría haber controles que pudiéramos poner nuestro propio Tal vez Day tamaño y si es nullable, ¿verdad? Pero entonces esas son cosas que podemos ver más adelante. En última instancia, sin embargo, vemos aquí que tenemos nuestra migración. Y se ve bien. Por lo que el siguiente paso sería crear realmente la base de datos. De acuerdo, entonces lo que haremos es volver a nuestra consola Package Manager y rho y actualizar la base de datos y darle unos cuantos. Y luego cuando se haga, lo hará justo AHORA con un simple hecho. Entonces, ¿cómo comprobamos? Ve a hacer verificar. Para que puedas ir al Explorador de objetos de SQL Server. Lo tengo abierto aquí. Si no quieres tenerlo. Ahí vas a Ver y eliges Explorador de objetos de SQL Server. Entonces en el Explorador de objetos del servidor, vamos al servidor que sí dije que estaba integrado en Visual Studio, que es barra de base de datos local MS SQL, base de datos local. De acuerdo, para que puedas ampliar eso, ve a bases de datos y luego verás la base de datos listada ahí, listado hotelero DB. Y cuando perforamos en préstamo Andrew, verás nuestros países. También verás que están rastreando todas las migraciones que están ocurriendo. Entonces cada vez que hacemos un cambio a la clase que dicen, alguien vino y dijo todo, necesitamos extender país, necesitamos poner en el código de marcación, derecho, o área de código, sea lo que sea, entonces agregas un nuevo campo, creas una nueva migración, actualizas base de datos, crearás una 5A más. Esto para decir que este es el cambio se debe hacer y luego las actualizaciones obviamente seguirán adelante y harán esos cambios en tu nombre. Eso es bueno en un entorno de desarrollo, en un entorno de producción, no tanto. Habría mucho más controles están en espera. manejan las actualizaciones a la base de datos. Compró Farnell, cuando estamos construyendo desde cero, es bueno entender todo Para hacerlo eficientemente. Entonces eso es todo por no, lo que hicimos hoy fue que definimos nuestras clases de datos son clases de dominio. Configuramos nuestro contexto DB. Hicimos todo esto desde cero. Está bien, y eso está bien. Es bueno entender cómo todo las clínicas. Por lo que tenemos el contexto de la base de datos, las clases o los conjuntos de DB , y respetados memes, recuerdo como se llame aquí a las propiedades, así se llamará la tabla. Si necesitas deshacer la migración, se vuelve un poco complicado. Porque si solo haces una migración de remove, obtendrás una flecha donde te dirá que la migración ya se ha aplicado. Por lo que tendrías que revertir este cambio a la base de datos en un conjunto, que como está en las etapas de Yom, bien podría simplemente, realidad podría simplemente seguir adelante y eliminar la base de datos, puede obtener cambios, crear un nueva migración, y hacer una base de datos de actualización, ¿verdad? Entonces si no necesitabas la base de datos, entonces Entity Framework no sólo te estará diciendo que algo se ha aplicado, así que necesito que me evalúen no ahí, permitiría la migración inter move. Podrás obtener cambios a cualquier clase que lo hagas todo de nuevo, agregar migración, actualizar, y luego se estropearía la base de datos con cambios de IA. De lo contrario, si no es tan grave como se están moviendo con la migración, solo querías agregar o quitar algo. Sigue adelante y realiza tus cambios en tus clases de dominio en consecuencia. Después agregas migración, base de datos actualizada, y tomará una instantánea una vez más en cada punto. Entonces cuando volvamos, veremos todo el fin de semana c, d, eta en las mesas. Significado cuando el, cuando ocurre la migración, simplemente ponemos datos antes de que incluso nos metamos en la API porque es bueno tener datos de prueba allí antes de que empecemos a poner datos a través de nuestras pruebas reales de la API. 13. Datos de semena en las cuadras: Oigan chicos, bienvenidos de nuevo. Entonces en esta lección vamos a estar pasando por un proceso llamado siembra. Por lo que la siembra es donde proporcionamos algunos datos iniciales a la base de datos. Y lo que realmente vamos a hacer es simplemente codificar algunos registros que cuando realicemos una migración después, la migración tendrá instrucciones que creen estos registros. Hizo la base de datos con estos registros. Y no necesariamente se basará en la entrada del usuario. Entonces, al menos eso proporcionará una buena base para nuestras pruebas cuando empecemos a desarrollar los endpoints de la API. Entonces lo que queremos hacer es ir a nuestros contextos de base de datos y vamos a anular un método protegido que realmente está dentro de los contextos DB. Tan protegido sobre al vacío en la creación del modelo. Y estamos pasando el parámetro ModelBuilder y solo lo estoy llamando constructor. Y luego lo que veremos es algunos de los puntos de constructor de laboratorio en dy. Y entonces tengo que especificar con qué entidad estoy tratando el alma. Tenemos los países de hotel web contrarios auto para existir, para que los hoteles existan. Y eso es realmente por cómo definimos nuestras tarjetas rojas, ¿verdad? Por lo que dijo contrario y en hotel tiene una llave extranjera, así que tenemos que tener el contrato antes de poder poner esa llave extranjera. Entonces solo diremos Entidad, country dot tiene datos. Oh, lo siento, me falta un par de raquetas ahí. Correcto. Por lo que entidad contraria. Y luego abrir y cerrar corsé tiene los datos del ITER, lo siento, abrir y cerrar corsé. Y luego dentro de esto vamos a definir algo consciente. Entonces podemos definir tantos porque se necesita una matriz, por lo que tiene la, realmente toma una matriz de tipo country. Por lo que podemos definir aquí algunos registros. Entonces sólo voy a definir tres. Muy bien, por lo que nuevo contrario requerido con ID es igual a uno. Y una vez más, estamos poniendo los datos por lo que tenemos que proporcionar manualmente todos estos valores. Y este es el primer clincher que es estoy arrancando y nombre corto es j m. Y yo sólo voy a copiar esto y pegarlo. Especie de reducir el mecanografiado. Por lo que serán dos y esto serían tres. Y la siguiente, veamos, Bahamas. Y el nombre corto para Bahamas, si no me equivoco, es B, s. y entonces el siguiente sería Isla Caimán. Algunos sí eligiendo algún destino, algunos destinos turísticos populares donde probablemente querrías saber qué hoteles hay, ¿verdad? Por lo que el nombre corto para Islas Caimán sería CI. Está bien. Si no soy tan preciso, entonces más adelante podremos adquirir un libro infantil para nulo. Una vez más, estos son registros exentos, ¿verdad? Entonces lo hice por país. Yo sólo repetiría que se alimenta para los hoteles, ¿no? Entonces yo solo estoy, acabo de copiar MPI, es que la mayor parte del código. Y nota cuando cambie esto a hotel, va a cambiar los parámetros esperados para escribir hotel o si está viendo objeto porque no está consiguiendo hoteles aquí. Entonces eso está bien. Simplemente cambiaremos estas viejas fotos. Está bien, nombre de identificación. ¿ Qué más teníamos para el hotel en dirección? Entonces déjame coger esto. Por lo que estos son algunos de esos resorts en el acto. Por lo que en realidad no estoy familiarizado con algunos de ellos. Vestido nos permite mantenerlo corto y C y la parrilla. Ya conocemos el país. El país es Jamaica subcultura ID sería uno. Está bien. Y entonces el equipo de incursión es el último. Escuché que iba a decir 4.5, pero sé que es un tipo de resort de cinco estrellas. Entonces solo voy a copiar estos detalles, no lo hagas. Está bien. Por lo que tenemos un hotel para Jamaica. Es decir, solo pon un hotel por país solo para asegurarnos de que estamos repartidos por todos lados. Y sólo voy a inventar algo para Sunda, lejos Bahamas. Entonces Bahamas, digamos que tienen grand grand paladio. Por lo que sé seguro que grand paladium es un hotel en Jamaica. Pero por ejemplo, enfermos, lo estamos poniendo ahí o lo ponemos a su propia policía, lo siento. Entonces esta debe ser herramienta de país, hagamos eso. Y eso es cuatro estrellas. Una vez más, esto no es joder a esto haciendo datos abiertos, ¿verdad? Por lo que para cavernícola, tienen asientos de confort. Y juristas, digamos George tone, la identificación de clincher es de 34 cavernícolas y están comiendo es de 4.3. Está bien. Entonces eso es una cedencia de algunos datos a la base de datos para que esto pueda corroerse. Simplemente lo derrumbarías así. Por lo que no ocupa demasiado espacio. O lo que tiendo a hacer también es en realidad moverlo a debajo de las definiciones del conjunto de bases de datos. que cuando vengo a hacer modificaciones a los conjuntos de DB, siempre pueda simplemente apilar en la parte superior. No tengo que desplazarse por todo el camino más allá de eso. Hay formas de extraer esto puede no asuntos y llamar también a las configuraciones. Pero entonces esto es sólo una victoria rápida, una forma rápida de ver los datos en la base de datos. Entonces ahora que hemos definido algunas pruebas a los registros, lo siguiente que queremos hacer es agregar unas migraciones. Entonces estoy dispuesto a migrar. Y este lo vamos a llamar a esto cediendo datos, ¿verdad? Entonces note que cada muere de migración ADA y traté de ser lo suficientemente descriptivo con el nombre tal que se pueda decir, oh, eso es lo que pasó en ese punto. Entonces es casi como el control de fuente para los datos, ¿verdad? Y si miras esto, este archivo de migración, en realidad verás aquí donde dice insertar datos en esta tabla. Y estas son las columnas, y esos son los valores de datos, ¿no? Entonces va a seguir adelante y hacer todo eso, ¿verdad? No sé por qué giro mi cuatro puntos tres a 4.299 y no está seguro por qué, pero así es como se va a reformatear para que pueda hacer las inserciones. Entonces lo siguiente que queremos hacer es actualizar la base de datos para que un pueda realizar efectivamente los comandos en la migración. Por lo que sí dijo hecho. Lo que quería hacer es volver a mi Explorador de Objetos y luego voy a hacer clic derecho. Y V estaría sobre la mesa del país. Y ahí vamos. Tenemos datos en nuestra base de datos, por lo que hemos creado con éxito o tres países. Y podemos mirar los hoteles coincidentes. De acuerdo, así es como puedes poner datos iniciales en tus aplicaciones core .net usando Entity Framework Core y el contexto DB. 14. Repositorios de servicios de la servicio e Inyección de dependencia: Bienvenido de nuevo. Entonces, en ninguna parte al punto de crear nuestros repositorios y lo que estaremos implementando es patrón de desarrollo realmente. Entonces déjame solo dar algunos pero crecer y nosotros a por qué necesitamos pasar por eso. Cuando estamos haciendo nuestro trabajo con nuestra API, es bastante fácil escribir las consultas usando Entity Framework, Core y link. Y simplemente lo escribimos sobre todo como globo. Tienen dos mesas contendientes con las que nuestro país y todo Ito. Bueno, ¿qué pasa cuando tenemos mesas 891020? Se vuelve un poco tedioso intentar escribir consultas cada vez que tengamos una tabla y entonces eso va a llevar a la repetición. Y luego si tenemos la misma consulta múltiples lugares, entonces eso es una pesadilla de mantenimiento, R3. Entonces por eso vamos a estar implementando un patrón. Y estaremos usando el patrón genérico de Repositorio junto a la propia ONU herramienta de patrón de valor tipo de crea un contenedor para definir la funcionalidad básica que se compartirá través de todas nuestras tablas y todas nuestras operaciones de base de datos en nuestra proyecto. Entonces para empezar, voy a crear dos carpetas nuevas. Uno se llamaría i, i repositorio y el otro se llamaría repositorio, ¿verdad? Por lo que tenemos yo repositorio. Y eso va a ser una I. mayúscula Y entonces vamos a tener otra que es que sólo voy a llamar a repositorio. Entonces hay un concepto llamado separación de preocupaciones, donde querrás asegurarte de que alguna vez eres archivo sabe que está haciendo una cosa. Por eso nos aseguramos de definir dos clases diferentes. Para esto, vamos a definir alguna cantidad de clases individuales a lo largo del camino de lo que querían para asegurarnos de que ciertas cosas sean tipo genérico no estaban repitiendo ciertas cosas, ¿verdad? Entonces en nuestro repositorio de ojos, vamos a crear una interfaz. Alguien crea una clase porque eso es sólo rápido. Pero voy a llamarlo yo repositorio genérico. Y adelante y haga clic en agregar. Y yo sólo voy a cambiar así a interfaz. Y si elegiste interfaz eso estaremos bien. Lo único es que tienes que recordar ponerte en público, ¿verdad? Entonces esa es la otra razón por la que están clase utils se olvidó de poner en público en el pasado y eso no podía entender por qué estaba consiguiendo la flecha está consiguiendo. Entonces esa es mi pequeña a prueba de fallas basada en mi experiencia. Entonces lo que vamos a hacer es hacer que este repositorio genérico tome un parámetro genérico y en forma de t, donde t va a ser una clase. ¿Está bien? Entonces voy a hablar de genéricos. Este t sólo dice, bueno, estoy preparado para tomar cualquier tipo de clase que me envíes a mi manera. Y Eso nos ayuda a crear esas operaciones de abejas para diferentes situaciones con diferentes tipos de clases. ¿Está bien? Entonces el primero que vamos a crear una función llamada get Sowell se pone. Está bien, así que voy a decir tarea I, lista de tipo T se pone, está bien, y luego voy a estar definiendo ciertas cosas. Por lo tanto, permítanme explicar exactamente qué está pasando en este encabezado de función. Entonces tarea, mientras estamos lidiando con una programación sincrónica, tenemos que usar colmillos si estás recibiendo una flecha, porque no quieres tener esa biblioteca que ahí está resaltada. Qué puntos, ya sabes, solo haces punto controlado y seguimos adelante y en usar declaraciones. Entonces tarea I, una lista de tipo t, una vez más genérica y el nombre completo SHA-1 es obtiene todo. Entonces gets all tiene un parámetro que para el cual voy a incluir la referencia que falta, que es de tipo, expresión, función y expresión, y lo estamos convirtiendo en un parámetro opcional. También va a tomar y yo consultable, yo consultable de tipo T, pedí queryable. De acuerdo, así que solo puedes reescribir que Hawaii hábitos y ordenar POR eso también es opcional. Y entonces tenemos la capacidad de incluir si es necesario. Muy bien, entonces voy a tener una función de seguimiento para conseguir. Entonces se pone la tarea T, así que éste va a conseguir una lista. Este sólo está consiguiendo uno, ¿verdad? Entonces por eso es tarea t y tarea deshonesta que enumero. Entonces este sólo va a conseguir un registro y está tomando el mismo parámetro shun. Y va a tener el incluir así sucesivamente donde los barcos pesqueros, el, la función real entonces entenderás para qué está realmente aturdido el parámetro. Vamos a tener Sean's formales similares para nuestras operaciones crud. Entonces voy a tener tarea insertar T y T D. Así que esta va a ser la que se cree. Vamos a insertar rango. Por lo que me gusta mantener esta cerca. A veces sale ambas operaciones. Y en lugar de llamar a esto varias veces, solo podrías definir uno que toma al menos y que sólo esos la muñeca. En fin, tenemos Eliminar y plomo de tres pulgadas. Está bien. Y actualización. Aunque no me gusta hacerlo. El lesionado del árbol en el libro, tenemos la actualización. Por lo que note que la tarea que borrar es tarea, todos estos son pensamientos, pero estos dos son operaciones nulas. De acuerdo, así que eso es todo para nuestro repositorio genérico. Por lo que una vez más, esto se está definiendo como boceto b no importa cuál sea el tipo de datos, si introducimos cinco tablas más y una clases de dominio acompañante, realmente no tenemos que cambiar mucho aquí porque estas funciones estarían bien para manejar cualquier otra tabla nuestro dominio. Costo que pasa. Y así sabiendo que tenemos la interfaz, voy a seguir adelante y crear el concreto. Entonces, ¿cuál es el objetivo? ¿ Qué es una clase de repositorio? Solo soy tiempos en clase real y lo estoy llamando repositorio genérico sub i repositorio genérico. Y no, solo tengo repositorio genérico y repositorios genéricos yendo al mismo T. genérico Lo que también va a heredar del repositorio genérico IEEE donde t es un GAS. Yo sólo voy a seguir adelante e incluir la referencia faltante ahí mismo. Y luego se va a la empresa no, porque una vez que estamos heredando, Tenemos que asegurarnos de que implementamos. Entonces solo voy a seguir adelante e implementar la interfaz. Y entonces genera todos esos métodos talones para mí también amablemente. Entonces dejémonos frescos. Oh, es exactamente lo que necesitamos aquí. Entonces vamos a tener que hacerlo y no vamos a tener inyección de dependencia. Por lo que he mencionado que si lo he hecho antes, no lo he mencionado mucho. inyección de dependencia es básicamente el concepto por el cual todo lo que cargamos en la startup está ahora disponible los blancos de aplicación. Por lo que no necesitamos instanciar cada vez que necesitábamos. Todo lo que hacemos es hacer una referencia al objeto ya existente porque se definió en nuestra startup, ¿verdad? Por lo que más contextos demasiado pronto o la conexión son nuestro puente a la base de datos. Podemos saber, sólo conseguir una copia de eso para usar en nuestro archivo aquí en lugar de tratar de crear un puente completamente nuevo, están sosteniendo una instancia de este puente. apalancamiento de Kendall, el que existe como resultado de que se incluya en el procedimiento de inicio. De acuerdo, eso es, eso es en pocas palabras. Qué dependencia inyectable leerlo nos ayuda a hacer. Entonces lo que vamos a hacer es definir un solo lectura privada. Es privado, se lee sólo porque no necesitan hacerle ninguna modificación. Y va a ser una instancia de base de datos. Contextos. Entre los derechos se incluyen las referencias que faltan. Ahí vamos, privada de solo lectura, y sólo voy a llamarlo contexto de subrayado. ¿Todo bien? Y entonces de igual manera voy a duplicar este nueve porque quería entrar a EDL Andy. Quiero conjunto DB. Recuerda dv set viniendo del mismo contexto de base de datos. Y se va a definir para un genérico. Entonces solo seguiré adelante e incluiré la referencia faltante ahí también el conjunto b de tipo T, y voy a llamar a este dB. No, estos se definen para esta clase. No obstante, la inyección de dependencia AHORA me requerirá crear un constructor. Y va a tomar un parámetro de tipo contexto de base de datos. Y voy a cambiar en la insula, la privada como honesta anotó este no. Y después habiendo tomado ese parámetro, es no, no está accediendo al uno son la copia de los lados o procedimiento. Entonces para mi uso local, voy a inicializar mis contextos actuales que tengo mi lectura privada solo para ser el mismo valor que el que se inyecta. Entonces eso es más o menos inyección de dependencia en caso de que eso fuera un misterio a tu punto. Ya sabes, así es como básicamente funciona. Hay otros matices para ello. Pero para nulo, no hace falta que se complica mucho más que eso. Entonces el siguiente está en la partitura DBE va a ser igual al contexto aunque que he inicializado contextos. Yo puedo decir contexto, dame un conjunto de lo que sea t. Y recuerda que en este punto, las necesidades T todavía corresponden básicamente con algo que se ha delineado en nuestro dB. Siéntate, en nuestro DAW es contexto. ¿ Está bien? Entonces por eso puedo decir con confianza, ir a los contextos y darme un conjunto de lo que sea esto. Porque un contexto no debería saberlo para cuando estamos construyendo este repositorio. Entonces sepan que tenemos esa parte hecha, pasemos a nuestra implementación. Entonces hagamos la eliminación, que es bastante fácil solo gana. Esta es la entidad var es igual a. Y entonces lo haré, esperaré. Entonces porque están haciendo programación asíncrona después de un trigo. Por lo que he echado cuidado. Lo que me falta es la palabra clave asíncrona antes de que esté bien, cada vez que tengas una tarea que vas a estar usando, o es nafta asíncrona, Está bien, nota cuando una camarilla, la otra se resalta, van de la mano. ¿ Está bien? Entonces dices, oh, subraya DB dot find, y yo sólo lo voy a encontrar, encontrar asincrónico. Por lo que adoctrinar core, lo siento, en Entity Framework o para casi todas las operaciones se tiene una operación asíncrona correspondiente. Entonces en este punto está ahí, úsalo. Y si estás usando asíncrono, Tienes que precederlo con esperar. Y por extensión, el método en el que se está utilizando esta palabra clave await necesita tener un sumidero en las paradas del método. Entonces no está en la interfaz, no está en la interfaz, sino en la definición. Y hay que tener eso. A medida que escribas cada vez más, conseguirás el ahorcamiento de la misma. Por lo que encontraremos es hundirse y pasaremos en el DNI para el registro que queremos encontrar. Y luego diremos db dot remove. Y estamos moviendo la entidad que no se ha encontrado con esa identificación. Y eso es todo para nuestra eliminación. Eliminar rango es más o menos una línea. Simplemente va a ser db dot remove range. Por lo que tenemos una lista de entidades. Entonces voy a decir db dot, remove, range, y remover y dice, bueno, dame la lista de entidades. Bueno, ahí está la única cosa que las entidades simplemente las quitan. Está bien. Eso es todo para el rango de remoción. Entonces voy a seguir adelante y tipo de ir por las más fáciles. Por lo que el inserto es fácil, la rabia de inserción es fácil y la actualización es fácil. Y luego volveremos al get y se ponen todos porque esos se pueden complicar más. Entonces solo voy a anteponer cada tarea en el encabezado del método con la palabra clave asíncrona. Ese son vacíos. No necesito asíncrona ahí. Tan solo asegúrate de que no me encuentre con ninguna dificultad más adelante. De acuerdo, entonces para insertar ese uno es bastante simple. Todo lo que vamos a ver es un peso db dot add async, y agregamos la entidad, lo que sea que vino como datos al respecto. Eso es todo lo que tenemos que hacer, ¿verdad? Y entonces la similitud para el rango de inserción van a hacer es db dot range async. Por lo que este tiene un arreglo asíncrono, aviso o movimiento no tenía una asíncrona. Correcto. Por lo que a arreglar un fregadero y la lista de entidades que tienes que agregar. Y luego para nuestra actualización, tenemos una operación de dos partes. Uno, voy a adjuntar la entidad al db. Entonces, en otras palabras, cuando los datos llegan, podría no estar adjuntados o puede ser un objeto que existe en memoria sin conexión directa con la base de datos en ese momento. Entonces toco significa prestar atención a esto y comprobar si lo tienes ya comprobado, si hay alguna diferencia entre él y lo que tienes en la base de datos porque lo wearable para hacer una actualización, ¿no? Entonces empieza a camiones para ver eso, vale, hay ciertos campos que son diferentes. Entonces estas son dos diferentes, digamos tarjetas rojas, ¿verdad? Y entonces la siguiente línea diría contextos entrada de punto. Y entonces nos referimos entidad punto estado es igual para modificarlo. Entonces una vez le diríamos eso bien, no se ha modificado, entonces lo sabrá. De acuerdo, necesito hacer una actualización al respecto. Entonces subamos a nuestro Git. Git es en realidad más fácil de hacer que llegar a todos. Pero una vez que lo consigues, entonces consigue todo omega un poco más de sentido. Entonces lo primero que voy a hacer es ponerme un ojo consultable. Quería llamarlo consulta de lo que hay en el servidor DB. Pero los DBs ya se definieron como lo que sea que sea el tipo de datos con el que estamos tratando, ¿verdad? Por lo que sí consigue todos los registros básicamente que están en esa tabla. Más o menos eso es lo que esto va a hacer. Y luego voy a revisar para ver si había un inclusivo. Está bien. Estaba ahí e incluye requisito, es decir, ¿el usuario se hizo el código de llamada, quien llamó a este getMethod, les gustaría incluir detalles adicionales? Entonces sí dije antes que cuando llega a un hotel y país, en lugar de buscar el hotel y luego obtener la identificación contra y luego llamar de nuevo a la base de datos para obtener el contrato con esa identificación. Y entonces eso son dos bases de datos porque podrías hacer una llamada a base de datos y estamos consiguiendo el hotel e incluyendo el país para que automáticamente llene esta propiedad con todos los detalles de los países correspondientes, derecha, entonces eso es lo que eso incluye está lejos. Entonces este fragmento de código básicamente dice que si includes no es igual a null, por lo que por defecto no lo es, es opcional. No tienes que ponerles valor. Si sin embargo optas por poner su valor. Si no es igual a null, entonces para cada propiedad en includes, quiero incluir a la consulta cualquier propiedad que se pidiera. Por lo que dijeron país, entonces este bucle foreach va a correr una vez. Si tienes cinco llaves extranjeras y las pones las cinco en eso incluye esto, entonces esto va a correr cinco veces, incluyendo cada una. Más o menos eso siempre va a hacer. ¿ Está bien? Por lo que es completamente opcional, pero podría haber momentos en que necesitas incluir en su Tanzania no necesitas por motivos de velocidad, no quieres incluir todo el tiempo para una consulta, para un poco de información cuando no tenías que hacerlo. Por lo que esto nos ayuda a mantener la aplicación tipo de más rápida de lo que sería normalmente si incluyera todo todo el tiempo. Entonces lo siguiente que queremos hacer es devolver nuestro punto de consulta de pesos. Y luego voy a decir como no hay camionetas. Entonces ahí es donde entra esa cosa del camionaje porque cualquier registro que se recupere aquí no está siendo rastreado. Copias tomadas y enviadas a la memoria central al cliente, la base de datos y en diferentes palabras son realmente terribles en ello. Entonces por eso no aquí lo vemos un toque para que obtenemos ese disco que no se estaba tirando. Se están mirando a dos y yo siempre digo que empiece a mirarlo y sólo tenga en cuenta que se ha modificado por el tiempo que llega aquí, se ha modificado. Por lo que obtenemos como pequeño camionaje. Pero luego después de eso es lo que realmente quiero hacer es conseguir el primero nuestro registro predeterminado y hay un asíncrono predeterminado de primer orden. Ahí vamos. Y entonces puedo ver expresión. Entonces permítanme explicar cuál es la expresión. Por lo que la expresión se define como Express en la función t Boolean, y ese es el nombre del parámetro. Entonces este dato que básicamente nos permite poner esta noche una expresión lambda porque entonces una expresión lambda en nos permitiría ver algo que IQ. Y luego la lambda R0 y luego diría punto de consulta algo es igual a otra cosa. Entonces por eso dije bool, ¿verdad? Cualquiera que sea la condición. Entonces cuando estamos queremos recuperar la tarjeta de vagabundo, ¿cuál es la condición que queremos usar para recuperar la que Ricard? ¿ Es por DNI, es por nombre? Por lo que esto permite que sea muy genérico y flexible porque entonces podemos escribir o diferentes expresiones basadas en el contexto, pero llamando a un método en cualquier momento dado. De acuerdo, así que eso es todo para el siguiente, para el, get, lo siento. Entonces el siguiente que tenemos que hacer es conseguir todo. Está bien, y conseguir todo va a tener todo ese código con algunos ajustes en el camino. Entonces, en primer lugar, no vamos a estar mirando en ningún primer lugar nuestros impagos. Por lo tanto, permítanme modificar esta línea de época. Obtenemos la consulta osmo camionaje y el número lo va a hacer lista VO2 es fregadero. De acuerdo, así que eso es, oh, es 1-0. Al llamar a una función asíncrona, hay que precederla con malas hierbas. ¿ Está bien? Entonces estamos convirtiendo nuestra lista. Entonces lo analizamos para enumerar en contraposición a éste donde acabamos de obtener los primeros predeterminados estelares? No, tenemos el mismo parámetro para el Incluye, pero tenemos otro para ardor bay. Entonces voy a poner otros pequeños fragmentos leídos después. Bueno en realidad voy a poner fragmentos de herramienta en. Entonces, en primer lugar, tenemos la consulta. Entonces voy a comprobar si hubo una expresión, alguien para filtrar primero la consulta antes incluso de mirarla incluye. Está bien, así que voy a decir si la expresión no es igual a nula porque podríamos estar buscando una lista de tarjetas rojas. Pero queremos decir que estamos, el país es uno al sol. Dame la lista de fotos de Jamaica para que pudiéramos poner en la expresión para ver donde sea cual sea la condición que se necesite especificar desde Jamaica. Y entonces si no lo es, aunque no sea igual a nulo, significado condición está ahí, entonces filtra la consulta para mí por favor. Entonces consulta es igual a la consulta inicial que era todos los registros d2, estamos, esa expresión es verdadera. Entonces después de que hayas hecho eso, porque podríamos haber tenido 500 y saber que el filtro lo bajó a 20. Después vas adelante y te pones el Incluye. Está bien. Y luego finalmente, después de que te pongas el incluye y todo, me gustaría que ordenaras si es necesario. Entonces si la persona Boston sobre el arte o por petróleo lo quiere en R descendente o ascendente, este R que sólo se ve si, si entra el comando, la indagación es igual a R2 por consulta. De acuerdo, así que eso es todo lo que hay es que, uh, sube, baja. Por lo que hemos sacado la mayoría del trabajo del camino. Tenemos alrededor de dos pasos más por recorrer y luego terminamos con esta tarea. Entonces lo siguiente que queremos hacer es crear eso lo que voy a llamar a esa unidad de trabajo, ¿verdad? Por lo que tenemos el repositorio genérico conocedor cuándo darle la unidad de marco de trabajo en suelo superior en repositorio ire, solo voy a seguir adelante y agregar lo que será otra interfaz. Entonces solo lo estoy agregando, lo estoy llamando i unidades fuera del trabajo, cambiando esto a interfaz. Y éste va a heredar de desechables. ¿ Está bien? Y entonces lo que vamos a estar definiendo en nuestras unidades son cuatro, sería que va a recoger nuestro padrón por cada variación del repositorio genérico o relativo a la clase T, ¿verdad? Por lo que en este momento sólo tenemos dos mesas para atender. Entonces solo voy a ver un repositorio genérico para país. Perdón, por país. E incluir a cualquier desaparecido o amigos. Y yo sólo voy a llamarlo país es tan diferente la gente tiene diferentes convenciones de nomenclatura aquí. Yo soy, yo llamaría lo contrario. Algunas personas dirían repositorio contrario o lo que sea soy Claudia países. Porque cuando hago un llamado a las unidades de trabajo, puedo ver este punto países punto punto cualquier operación que quiera llevar a cabo. Está bien. Entonces vamos a hacer eso también para los hoteles. Son hotel y estoy llamando a los hoteles de la propiedad. Y luego vamos a tener una operación más, que es la tarea C. Muy bien, entonces cuando estamos llevando a cabo todas estas operaciones, la IAB para actualizar, estamos haciendo cambios en los contextos. En este punto. Sólo está puesta en escena, ¿verdad? Entonces cuando veamos Guardar o Guardar cambios, entonces se verá afectado. Entonces para eso es para lo que esto es, pero esto está fuera del repositorio porque si hay múltiples cambios por hacer en ese momento, entonces todos ellos pueden quedar atrapados en una operación a diferencia de hacer múltiples costos o la base de datos. Por lo que tenemos las unidades son para. El siguiente sería crear la clase concreta. Por lo que en un repositorio, agregaremos clase, lo llamaremos unidad fuera del trabajo. Y luego lo sumas para el trabajo va a heredar de i unidades O4. Y una vez más, incluir cualquier referencia que falte y luego implementar la interfaz. De acuerdo, entonces lo que esto realmente sólo va a saber es decir, De acuerdo, ustedes países normales, ¿qué debo devolver cuando llamen a países de mi parte? ¿ A qué debo llamar aquí? ¿ En qué se dispuso dual, qué se guarda? Esas son las cosas que necesitamos definir. Entonces primero voy a incluir una referencia al contexto de la base de datos. Muy bien, similar a lo que teníamos antes. Y luego voy a definir a mi constructor. Puerta C0. Vuelve a intentarlo. Ahí vamos. Y voy a poner en los contextos fechas arriba, los robados para escribir de nuevo en tote. Entonces solo voy a copiar sus partes ahí y pegar. Ahí vamos. Por lo que estoy inicializando el contexto de datos dentro de la célula de la unidad para una cura y necesito saber eso. De acuerdo, tengo una copia de los datos de contexto también. Entonces probablemente se estén preguntando, entonces ¿por qué necesito los contextos aquí? Y eso es realmente porque lo que tenemos que hacer es devolver una instancia del Depositario, pero entonces tenemos que retroceder un poco. Por lo que necesito rezar los eventos de la misma manera que los habríamos definido por este lado como privados. A ver si sólo puedo hacer esto rápidamente. Entonces solo voy a tomar eso y voy a definir dos propiedades privadas de la respectiva Holt y países, pero no quiero cambiarles el nombre en cuándo despegar el accessor. Entonces esto van a ser países. En este van a ser hoteles. ¿ Está bien? Entonces no hay datos como estas propiedades privadas, voy a decir aunque aquí, que si la propiedad privada está vacía, entonces devuelven una nueva instancia de los genéricos o depositantes. Yo sólo voy a hacer ese gráfico porque C sharp nueve es bastante genial. Segundo, dirá algo como países y luego signo de interrogación. interrogación es igual. Entonces es chico de la música diciendo, si esto es nulo, entonces ¿qué debo hacer ya que fuera de toda una declaración if? ¿ Verdad? Ahora, solo mira si es nulo, luego devuelve un objeto del repositorio genérico de tipo país. Y por supuesto, en base a nuestra definición off es que necesitas un contexto de base de datos, razón por la que lo tenemos inyectado aquí. Entonces pasamos en el contexto. De acuerdo, y entonces básicamente voy a hacer lo mismo por una foto. Entonces esto es como nuestro padrón. No, esto es como un rollo del éxtasis de que todos estos son repositorios genéricos potenciales sobre Siria y la unidad de trabajo a la que tengo acceso. Al contrario es la mesa del hotel en siempre que definas. Necesitas asegurarte de que pones ¿Haces representación para ello en la unidad de trabajo I así como en la unidad de trabajo. Pero todo lo que acabamos de hacer con el repositorio genérico y yo repositorio genérico, no queremos tener que rehacer nada de eso con cualquier otra tabla de datos que podamos agregar en el futuro, ¿verdad? Entonces es solo un perno manteniendo esta lista y estas funciones para asegurarnos de que tengamos acceso a lo que necesitamos. Aquí mismo en nuestras unidades, un tenedor registrador. De acuerdo, entonces lo siguiente que tenemos que hacer, o bueno, dos cosas más. Entonces quiero definir esta pose y luego necesitamos configurar un Save y luego terminamos con esto. Por lo que esta pose voy a generar disponer verdadero. Entonces esta es justamente la forma en que lo hago. Puede ver variaciones de la unidad de trabajo en otro lugar. Pero así es como he venido a hacerlo por diversas razones. Una vez más, el contexto es rey. Entonces lo que estoy viendo aquí es que voy a llamar a otro método. Entonces voy a definir un método aquí, sólo que Visual Studio genere un método o ayudas en el Neith para ese propósito. Y entonces sólo voy a decir, bueno, en realidad, ahora eso es que lo estoy haciendo. Yo sólo voy a decir aquí mismo en este contexto de piso. Por lo que esta pose es realmente como un recolector de basura. Él sólo viendo cuando terminé son cuando se hacen las operaciones, por favor campo la memoria. Ese es el propósito. Por lo que DC aquí está realmente ordenado para recolector de basura si nos fijamos en la descripción recolector de basura. Entonces esto es decir cuando se dispone llamado, entonces por favor disponer del contexto y significado mató a cualquier memoria que la conexión a la base de datos estaba usando, matar la conexión, matar todos los recursos que estaba usando, y seguir adelante y hacer lo que haría por defecto de todos modos. Entonces eso es todo para los disponer. El siguiente sería nuestro Guardar Cambios. Y esta en realidad es bastante simple porque realmente es solo una línea, al menos ahora mismo donde vemos un peso, context dot save cambia un fregadero. Aquí está la flecha. Yo estoy viendo. Ah, pero qué no tengo no tengo la asíncrona. Una vez que pongo eso ahí, todo está bien en el mundo. Entonces déjame dibujar construido para ver si he roto algo o si hay algo fuera de lugar y tener una construcción exitosa. Entonces eso significa que he puesto exitosamente en el código para que mis unidades son fork, al menos en código son sintácticamente. Posteriormente averiguaremos si funciona o no. Pero bien sé, esta es una buena característica de tener y esta tarea está hecha. 15. ACTUALIZación: en el tipo de gran tipo incluye para la unidad de trabajo de trabajo: Oigan chicos, bienvenidos de nuevo. Por lo que acabamos de terminar de configurar nuestra unidad de trabajo que fue bastante trabajo y bastante de explicación y buceando y adelante entre un montón de expedientes. Por lo que lo mantuve simple. Y la pareja a la que me refiero es la parte con los Incluye. Por lo que lo guardamos lo suficiente simplemente usando una lista de tipo string. Y luego en el repositorio genérico acabamos implementar este bucle foreach para decir por cada propiedad que está en la cadena, luego adelante e incluir, bueno, ahora mismo queremos refactorizar eso es un poco porque el peligro de tenerlo de esta manera es esa. Esto se llama cadena mágica, por lo que es propenso a un error tipográfico y el compilador nunca sabrá que es un error tipográfico que podría haber escrito inadvertidamente en SEO y TR Y en lugar de COUNTA RY, y luego lo compilaría, pero daría una flecha una vez que llegara este punto final porque Entity Framework Core no sabría qué hacer con la propiedad mal escrita. Otro tema podría ser que podría cambiar esta propiedad de navegación dentro del propio hotel de clase, ¿verdad? ¿ Y si lo cambiara de nombre de solo país a otra cosa? Y si hago eso, entonces eso también llevaría a la rotura cuando nosotros, cuando tratamos de golpear el endpoint, no mientras compilamos, así sucesivamente para asegurarnos de que si algo cambia en el código, rompa otra cosa para que podamos arreglar es nulo a diferencia de más tarde cuando un usuario se queja de voltaje, ¿no? Entonces vamos a modificar los parámetros dentro del repositorio. Entonces voy a ir primero al repositorio genérico ojo y vamos a cambiar esta herramienta de tipo de parámetro. Y incluyo una tabla BigQuery. Entonces solo voy a eliminar esa lista de cadenas. Y voy a poner en ese nuevo tipo de datos cual se ve muy parecido al que pedí queryable, pero es yo consultable de tipo T. Y luego es que incluí el queryable y vamos a seguir adelante e incluir cualquier faltante referencias. Entonces esto en realidad es más como una función, ¿verdad? Por lo que voy a hacer eso para el gueto, la lista de The Good PJ así como el Git. Por lo que todo es nulo va a ser este dato más fuertemente tipado. Ahora como de costumbre, cualquier cosa que cambiemos en la interfaz, tenemos que cambiar en la implementación. Por lo que acabo de seguir adelante y actualizar estos parámetros en el genérico o póster con el mismo tipo de datos. Y claro que estamos viendo que estamos recibiendo un montón de flechas en este punto. Entonces la primera flecha es porque lo llamamos, yo llamo a estos incluir, yo lo llamé incluye antes. Semántica. Puedes hacer ese cambio si quieres o no, pero eso está bien. Todavía vamos a comprobar si es nulo o no. Entonces solo voy a hacer estos cambios al por mayor, ¿verdad? Y entonces en lugar de un para cada bucle, lo que voy a hacer es simplemente decir consulta. Si no es nulo, entonces consultas iguales a incluir, que es no, en realidad un teléfono Sean la indagación. Entonces en otras palabras, va a ver si tengo contenido, entonces aplicaré mis inclusiones a la consulta, y ese es el nuevo valor de la consulta. Entonces eso quita ese bucle foreach y hace que el código se vea mucho más limpio en mi opinión. Y eso es todo realmente por modificar nuestro repositorio genérico y yo repositorio genérico ahora dentro de nuestros controladores donde realmente estamos interrumpiendo con él. Aquí es donde tiene que suceder el cambio mayor. Por lo que este método fue incluyendo país. Entonces voy a quitar eso. Y con qué se va a reemplazar eso. Y sólo voy a nombrar el parámetro. Por lo que sabemos que estamos tratando con el parámetro include. Con lo que eso se reemplaza es una expresión lambda. Y así voy a decir q punto. Y entonces vería incluir, incluir, que es un método. Y luego dentro de ese método hay otra expresión lambda. Pero antes de seguir adelante, necesitamos incluir Entity Framework Core para que podamos seguir adelante y agregar esa referencia bibliotecaria que falta, y luego podemos continuar con nuestra mecanografía con otras expresiones lambda. Entonces míralo de cerca. Q o estoy empezando una expresión lambda no tiene que ser q, e podría ser, yo, podría ser tinta. Realmente no importa. Sabemos que por lo sé, pero apenas estoy iniciando la expresión lambda y luego estoy llamando al método include. Si lo miras, verás que tienes un hueso Jia Trulia de casi todos los métodos disponibles para ti, pero sólo nos estamos centrando en el I incluyo en el incluyo. Por lo que Q dot incluir. Y luego tenemos otra expresión lambda dentro del método include donde veo x dot y luego puedo ver la propiedad navigation relativa a la clase que estamos a punto de consultar. Entonces la importancia aquí una vez más es que si algo cambia a clase de dominio, esto es solo código. Entonces si cambio el nombre de referencia aquí, entonces este país ya no existe. Esa es nuestra línea roja. No va a compilar. Tenemos que arreglarlo antes de que podamos empujarlo a la producción. Y ese es el beneficio de hacer este tipo de cambio escribiendo fuertemente tus inclusiones. Está bien, así que solo voy a seguir adelante y dejarme conseguir el controlador de contrato. Entonces tenemos una situación similar por aquí con nuestros hoteles y será el mismo principio. Por lo que sólo voy a poner en ese parámetro incluir, incluir las referencias faltantes. Y entonces esta vez son hoteles. Entonces es x dot y solo puedo ver hoteles de esa manera. No hay errores tipográficos. Si tengo un error tipográfico, entonces eso es un error. Si pongo algo que no existe, eso es un error, ¿verdad? Por lo tanto, es mejor simplemente usar estos parámetros fuertemente tipados. Se ve un poco más complicado, sí, pero a la larga cumplirá con Mantenimiento mucho más fácil. Solo estoy compilando para asegurarme de que nada más se haya roto con esos datos y tenemos una compilación exitosa. Para que puedas seguir adelante y continuar y verte en la siguiente lección. 16. Configuración de AutoMapper y DTOs: Oigan chicos, bienvenidos de nuevo. Entonces en esta lección vamos a estar configurando nuestros objetos de transferencia de datos y vamos a estar usando la máxima potencia para especie de automatizar el proceso de vincular nuestro detalle a nuestros objetos de dominio. Entonces déjenme dar un poco de fondo en cuanto a lo que D DO son objeto de transferencia de datos es nulo. Realmente es parte de un patrón donde tratamos de desacoplar nuestro objeto de dominio, decir Recuerde que esto está representando una tabla de base de datos. Tratamos de desemparejar esto de la interrupción del usuario. Por lo que querrá que los usuarios estén interactuando directamente con esta clase cuando envíen y reciban información a través de nuestra API. Por lo que tenemos detalles como una especie de capa media que hará cumplir ciertas desviaciones finalmente en la parte frontal. Y podemos hacer bastantes cosas y se extiende la flexibilidad. Entonces podemos usar eso para desinfectar un poco los datos antes de que realmente llegue a nuestra clase de datos y por extensión, nuestra base de datos. No, el otoño superior es una biblioteca que realmente facilitará o creativa o lo llamaremos mappings para decir que este detalle, igual que esta clase de datos, Primero tratamos de configurar nuestros objetos de transferencia de datos. Por lo que en nuestro proyecto voy a crear una nueva carpeta. Y a esta carpeta sólo voy a llamarla modelos. Los detalles son como modelo. Entonces si estás acostumbrado a usar páginas MVC o incluso Ariza o algún otro cuerpo no dominante o estamos familiarizados con la palabra modelo, i d t, o es solo una forma elegante de ver un modelo, pero generalmente se usa en términos de API, ¿verdad? Entonces puedes nombrar a esa carpeta modelos si quieres ponerle un nombre detalles para que sepas exactamente lo que hace, eso está bien, pero me quedaré con los modelos. Ahora en lugar de carpeta Modelos foráneos, generalmente tenemos una serie de clases que representan cada una puede ser variación de una solicitud relativa a cada objeto de dominio. Entonces, empecemos con los países. Por lo que el país tiene tres campos. ¿ Está bien? Entonces voy a crear una herramienta ordenada que nos permitirá interactuar con el contrario o tener otra capa. Entonces lo voy a llamar Country D T O, y esa es mi convención de nomenclatura. Pongo detalle hasta el final del mismo nombre, ¿verdad? Porque no quiero aquí a nuestro coordinador y conjurar allá arriba. ¿ Y hice una modificación a uno? Y luego resulta que siempre es la equivocada. Por lo que al nombrar un detalle, se puede ver claramente cuál no es la DTU en la que uno tiene razón. Así que adelante, crea país dto. Andrei Linde. Verdaderamente el dto necesita lucir herramienta similar, el conocimiento de dominio real que probablemente estés diciendo, acuerdo, entonces ¿por qué la duplicación? Porque acabas de crear otra clase en otra carpeta solo para darte las mismas propiedades. Bueno, en este punto sí dije que podemos agregar validación para que pueda ver que se requiere el nombre, ¿no? Entonces eso significa que cuando un usuario va a interrumpir con el detalle, esta anotación va a decir que no puedes enviarme información para este dto sin este valor. Entonces si no está ahí, la validación cazará. También podemos estipular otras cosas como. El largo de la cuerda. Y entonces podemos decir que la longitud máxima es de 150, o si se trata de un país. Entonces digamos que ningún país debería tener un nombre más largo de 50 caracteres sin embargo. No he hecho mi investigación pero nos deja trabajar con 50, ¿verdad? Y si quería dar un mensaje de error específico, si esto fue violado, no puedo ver mensajes de error iguales al árbol de maíz. El nombre es demasiado largo. Entonces si se viola esta validación para la longitud de cadena para nombre, entonces este es el error falla. Por lo que siempre puedes anotar el azulado de tal manera que cuando el usuario está interactuando con la herramienta, desgaste, manejando ciertas cosas para asegurarnos de que no estamos excediendo van fuera de la banda fuera de lo que queremos que sea nuestra calidad de datos. Después de que hayan pasado con éxito por esta validación. Entonces seguiremos adelante y haremos el mapeo entre el BTO y el país. Entonces el principio es que el usuario no vería nunca país cuando verá la clase de datos y la base de datos nunca vería el detalle. Por lo que los usuarios interrumpen aquí. Y luego en el medio nos trasladamos a d eta de aquí a aquí. Entonces se lo paso a los Beats obesos. Entonces todas las validaciones que podemos agregar y solo agregar eso a nombre corto. Aquí, veré un nombre corto también se requiere en la longitud máxima para el nombre corto sería escribir y mensaje de error nombre corto o nombre de país corto. Y decimos que un nombre corto de país todavía no puede, es demasiado largo, ¿verdad? Siempre podemos hacer mucho sol y GND Zope. Hay otras anotaciones que podemos sumar en el camino, pero estas dos son las que voy a usar racional para el detalle. Ahora también hay una extensión o extensión de esta mantequilla y un poco más donde creamos BTU por operación. Entonces cuando empecemos a desarrollar nuestro controlador, nuestros controladores comenzarán a mirar los diferentes tipos de operaciones en los verbos y en lo que la gente hace o está haciendo. Algunos casos que tienen un detalle por operación. Digamos que tengo un detalle para leer el detalle para crear un detalle para la actualización. Porque la realidad es que hay algunas veces en las que no se necesita proporcionar cierta información. Entonces alguien está creando un país. No necesito que tengan el campo para la identificación, ¿verdad? Entonces el detalle con el que me gustaría que se interrumpieran sería crear herramienta country D. Y no obtendrás esa oportunidad de proporcionar un valor para el ID porque realmente no necesitamos el valor para el ID. Por lo que en términos generales, hay que tener el país o tengo el detalle base. Y luego R14 creado porque una vez más, crea no necesita el ID. De acuerdo, así que 1aquí, haciendo verbos ar, en realidad verás la diferencia entre Hall. Utilizamos cualquiera de los dos. Noto que lo estoy poniendo en el mismo expediente. Aquí las partes de responsabilidad única son y pueden tener precedencia. Y haces cada uno en su propio archivo como lo hicimos para las clases de dominio. O como esta es una aplicación pequeña, solo pondré todos los detalles que están relacionados con un dominio dentro del polvo sucio CM en clases separadas con sus nombres apropiados. Entonces me voy a hacer una pausa aquí y te voy a desafiar para que sigas adelante y hagas lo mismo para hotel, crea el detalle, y seguir adelante y ponerte algunas validaciones para el campo. De acuerdo, entonces espero que hayas asumido ese reto y estoy aquí para mostrarte lo que sí sabía si lo hiciste y no tienes flechas, eso es realmente bueno. Yo lo hice un poco diferente. Entonces solo te voy a guiar por el pensamiento detrás de lo que he hecho aquí por el hotel dto. Entonces volteo el guión en lugar de crear todo el till, el till y luego crear la versión Create, lo que hice fue crear la versión Create y luego dejé que hereda el detalle que BaseOne heredó del Create y lo haré explicar esa decisión. Ahora volviendo a lo que acabamos de hacer con el trato contradictorio, notan que repetimos los campos, ¿no? I ID en una pero no en la otra, pero hubo nombre repetido y en realidad refactorizar este también repetimos nombre en short_name, ¿verdad? Entonces lo que hice fue decir ¿en qué están los campos comunes? Cuáles son los campos únicos de lo contrario. Entonces ID, realmente solo necesito ID cuando voy a hacer una actualización o voy a mirar los detalles o algo que no sea una operación de creación, ¿verdad? Entonces tengo la creatividad para ustedes, que va a tener todos los campos que son absolutamente necesarios para la creación. También son absolutamente necesarias si buscas los detalles o si vas a serlo. ¿ Está bien? Y una vez más tienes variación. Entonces si es que querías un punto dto solo te permite actualizar el nombre. Y eso es lo que quieres explotar el comportamiento de uso para solo actualizar el nombre del país, pero no el meme corto, ya sabes, solo por ejemplo, c_k, entonces podrías crear una necesidad TO que diga actualizar nombre del país, BTO, y todo lo que hace falta poses es el campo de nombre. Por lo que tienes todas esas opciones. No obstante, no le estoy haciendo esa granola. Entonces lo que estoy haciendo es definir uno donde las ideas no las cárceles, y eso es lo que manejaremos. El crear operaciones son las operaciones requeridas no ideales. Y entonces tengo la base que está heredando del que tiene todos los demás campos. Por lo que la base uno tiene ID y está heredando, por lo que automáticamente tiene acceso a todo lo que se definió. De esa manera no necesito repetir mis validaciones porque inicialmente tenía las mismas validaciones dos veces en el archivo. Y por tantos otros detalles como pude haber definido, habría tenido estas validaciones una y otra vez y otra vez. Entonces ese fue mi pensamiento aquí. Por lo que extendí esa ideología. A los detalles del hotel. Entonces el crear detalle total, que tiene sus validaciones para el nombre, ¿no? Y ver que copié y pegué, ni siquiera cambié este mensaje. Entonces ese es el nombre del hotel es demasiado largo, dirección es demasiado larga, y tienes longitud máxima. Podemos agregar cuaresma mínima. Probablemente quieras agregar longitudes mínimas, el nombre corto, porque necesitan proporcionar al menos 11 caracteres o incluso nombre. Un personaje es el que se necesita, ¿verdad? Por lo que volviendo a un hotel dto, tenemos esa validación para el nombre, validación para la dirección, los disturbios. Y déjame solo poner un poco de espacio para que podamos ver donde todo empieza y se detiene. Ahí vamos. Por lo que para la calificación, se requiere. Y establecí nuestro rango de uno a cinco porque están comiendo necesita estar entre una calificación de 1 estrella o una calificación de cinco estrellas. Por supuesto, estamos usando el doble porque tienes 4.54.11.5, etcétera. Entonces el re-ingeniero, Jill ve cualquier valor numérico que haya que haber entre estos números. Y entonces se requiere la identificación contraria. No, no lo que tengo contour ID, pero a diferencia de la clase de dominio, no definí país. Y también falta del creador es el id Así que estos dos faltan porque en la creación todo lo que necesito es el ID. Todo lo que la base de datos va a ver es el id No va a ver la entidad real ni nada que venga de ese campo. Sepan que el campo sí se hace necesario, sin embargo, cuando necesito ver los detalles, así que como describimos en lugar de ir y ejecutar otra consulta para averiguar qué país tiene el id que se proporcionó aquí. Solo puedo hacer un include y conseguir que se incluyan los detalles del país. Entonces por eso en el detalle base, y no me gusta llamar a ésta la base usualmente heredar de la base. Entonces cuando dije BS, sólo me refiero a la que no es necesariamente tan específica para una operación. Entonces lo estoy usando holgazanamente, pero me acaban de explicar para no confundirlos chicos. Por lo que hotel dto está heredando todos los campos que todos estamos alineados en la versión Create de la misma. Pero luego incluye el ID e incluye un objeto de tipo country dto. Por lo que hubiera sido bastante fácil simplemente copiar los campos y no te equivocarías. No es necesario especificar una clave externa en el detalle. Una vez más, eso es enfrentar al cliente. No está centrada en la base de datos, así que realmente no le importa si es una clave externa o no solo decir, Ok, necesito una causa entera me definieron como un int. No obstante, no estaban usando País porque en BTO nunca debería Francia un objeto de dominio directamente. Por lo que Beatles encabezó los detalles. Doumani un objeto pensado a los objetos de dominio, auto mapper es el único puente entre los dos. Por lo que técnicamente hablando, un dto madera ni siquiera sabe que tiene un objeto de dominio. Por lo que no debe haber correlación con los objetos de dominio e id2. Por lo que aquí se define la BTU, y la propiedad aquí también es una DTU. Entonces después de todo esto, sólo voy a hacer una construcción y ver si hay algo fuera de lugar. Y tengo unas construcciones exitosas. Entonces todo parece ser no, parece saber dónde se supone que debe estar. Voy a añadir sólo dos cosas más y luego podemos seguir adelante e instalar y configurar auto mapper. Sepan, cuando buscamos un país, a veces es más fácil buscar el país, o a veces más fácil buscar el país. Y verás los detalles de todos los hoteles que forman parte de este país. Entonces como que hicimos eso vinculando aquí donde se nos permite ver los detalles del país para cualquier hotel dado. Pero entonces cuando conjure, tiene múltiples hoteles, correcto, tenemos que poder decir, buscar el país con el ID uno. Y quiero ver todos los hoteles que hay, lo cual no es raro en cualquier parte de internet. Si buscas, ya sabes, en un sitio web de reservas para mirar Jamaica, por ejemplo. Y te va a mostrar la lista de hoteles. Entonces lo que necesitamos hacer en nuestro objeto de dominio, y estaremos replicando datos a través también. Pero necesitamos tener una propiedad que sea lista virtual pública y otros usen lista Ion porque esa es una extensión del tipo de datos de lista. Y es una lista de tipo hotel. ¿ Todo bien? Y se va a llamar Hoteles. Y llegamos a desarmar esa propiedad. Entonces esta propiedad, cuando no necesitamos hacer una migración para esto, realmente no es a dónde ir a la base de datos. Esto es solo decirle al objeto de dominio que cuando estás obteniendo datos para todos estos, si se solicita, entonces también puedes incluir la lista de hoteles asociados al país. Por lo que recuerda en nuestras unidades de trabajo sí dijimos que puedes hacer un incluye. Por lo que habría incluido los detalles de un país con cualquier hotel dado. O podríamos buscar nuestro país e incluir la lista de hoteles. Entonces eso es lo que esa propiedad está ahí lejos. Ahora lo que voy a hacer es permitir que el detalle realmente tenga ese comportamiento también. Entonces en nuestro país dto, voy a colocar esa dentro de la inespecífica, no Operación Específica VT0. Y una vez más, los detalles velocidad a los detalles. Entonces detalle hotelero, ese es el tipo de datos con el que estamos tratando. Y mapea de vuelta al hotel. Esto no necesita ser virtual. De acuerdo, entonces tenemos un público donde el potencial de mirar a un dto country y obtener la lista de hoteles. Además, los nombres de campo tienen demasiado entre el dto y nuestro objeto de dominio si queríamos que un mapeo funcionara sin problemas. De lo contrario, hay muchas configuraciones. Tengo que ir a ver, oh, este miembro o esta propiedad tanto como este sobre que decía no queremos pasar por todo eso en base a lo que estamos haciendo aquí. Todo debe mapear al otro son dos su contraparte, tranquilo, bueno, bien, bien, así que he estado viendo mapa, mapa, mapa, mapa. Entonces vamos a instalar la parte superior del otoño causa eso es lo que vamos a usar para hacer este mapeo. De acuerdo, así que haga clic derecho en el proyecto, vaya a NYU todavía paquetes. Y luego nos vamos a Burroughs y estamos buscando automapeador. Y lo que realmente estamos queriendo ser en última instancia extensiones de punto superior dot microsoft dot la inyección de dependencia porque esta es específicamente para dominar core que aunque en, no está optimizado para el core .net, ¿verdad? Entonces éste es el que queremos. Podemos simplemente seguir adelante e instalar la parte superior otoñal no es el estándar ahí, aunque herramientas por ahí que hacen cosas similares a la parte superior del otoño, pero ésta es muy popular. Yo usé lotes. No me falló, al menos en tiempos muy recientes no lo ha hecho. Por lo que podemos hacer mucho trabajo con la parte superior otoñal. Entonces ahora que lo hemos instalado, oh, pensé esto en flecha. Ahora todo lo que necesitamos para configurar una inicialización, ¿no? Entonces lo que voy a hacer es simplemente crear una carpeta. Y te das cuenta de que me encanta crear carpetas es un poco segrega lo que está pasando donde alguien es una llamada esta configuración de carpetas, configuraciones xy. Y en esta carpeta voy a crear una clase que es, voy a llamarla inicializador de mapeador. De acuerdo, así que tenemos que crear que la configuración en clase para que ultimo per sepa cómo debe comportarse y verlo debe prestar atención. Así mapeador, inicializador mapeador. Y vamos a heredar de esta clase llamada perfil. Ahora una vez que haga eso, necesito incluir la declaración de uso para auto mapper. Y entonces esto me permite crear lo que necesito para crear un constructor. Entonces una vez que se le llama para deshacer las inicializaciones. Y luego en este constructor, necesito definir todas las mappings, ¿verdad? Entonces, en otras palabras, necesito ver que esta clase de dominio llamada País. Y luego seguimos adelante e incluimos cualquier biblioteca que falte. Su objetivo va a mapear directamente al país el TOO. De acuerdo, adelante e incluye esto. Y luego abrimos y cerramos corsé. Y luego sólo voy a seguir eso con smog de río dot, que también es una función. Entonces esto es decir que el país tenía clase Nieto tiene una correlación directa o los campos en país necesitan una clase como directa, tienen una correlación directa para continuar dto campos y van en cualquier dirección. De acuerdo, entonces voy a querer hacer eso por todos los detalles que tengo. Entonces eso es lo que dije. Se te puede otorgar. Ah, pero una vez que te pones granular, Tienes que asegurarte de que estás cubriendo las mappings potenciales, ¿verdad? Tan contrario a crear y país a país, y luego hotel para sostener el T0. ¿ Está bien? Y luego el mismo comportamiento o tratamiento Cmd para el hotel al crear Toto BGO. De acuerdo, así que ahora que tenemos la configuración del inicializador mapper, necesitamos saber, incluirlo en el inicio de nuestra aplicación. Entonces vamos a startup como de costumbre, y luego vamos a incluir un león y algas incluirlo justo aquí en el bonito el núcleo del anuncio donde fui a ver Servicios, dot add, auto, mapper. Y entonces esto me va a requerir que incluya algo. Déjame terminar de escribirlo sin embargo. En primer lugar. Ahí vamos. Por lo que necesito incluir o tener la declaración de uso para automotriz. Ahí vamos. Por lo que en última instancia subiría y voy a ver tipo apagado. Y voy a pasar en el tipo de datos asociado al per inicializador. Así mapeador __init__ y obtener el láser correcto de ortografía. Y luego una vez más, incluir la referencia faltante, ¿verdad? Incluir la sentencia using. Y luego una vez que haga eso, parte superior otoñal está lista y nos vamos a ir. Entonces cuando realmente estemos desarrollando o finalizando puntos, realidad veremos el polar del operando de otoño sostener los detalles, el trabajo y todo lo relacionado con las clases de datos, pero es bueno que estas configuraciones le dirán a la ola desde temprano, así que uno, estableces el estándar para tu aplicación y para más adelante, no hay tanto retrabajo que se deba hacer porque se ha establecido ese estándar, estás manteniendo ese estándar a medida que tu aplicación se hace más grande. Y todas estas cosas ya están en su lugar. 17. Revisar y añadir cambios a GitHub: Oigan chicos, bienvenidos de nuevo. Por lo que estamos en el segundo check in check point para nuestro proyecto. Entonces después de cada módulo solo revisaremos lo que hemos hecho y luego iremos adelante y actualizaremos nuestro repositorio en consecuencia. Por lo que siempre es bueno mantener a Collins más cortos fuera tus pequeñas victorias para que si tienes frío se corrompa más adelante, siempre puedes volver a la versión de trabajo más reciente de tu aplicación. Entonces en primer lugar, siempre podemos saber los cambios que se han hecho al mirar los archivos son un deque significa que estuvo ahí y no es diferente de lo último que fue pateado. Y un signo más significa que se ha agregado desde el último pollo. Por lo que Git siempre está manteniendo el camión alejado de cómo se ve el archivo y haciéndote saber que no es diferente por puerta en dick te están haciendo saber que esto se ha agregado desde la última vez. Si querías ver lo que sí cambia, realidad puedes hacer clic derecho ir a obtener y puedes ver Ver Historial o comparar. Entonces cuando sí lo comparas a decir, bueno la última versión que tuve son las izquierdas y las páginas sacan bien mis cojinetes? Por lo que la versión de permisos que tuve es a la izquierda y la nueva versión está a la derecha. Por lo que te mostrará que este nueve fue modificado de esa manera. Y en todas partes se ve un verde resaltado significa que algo sucedió. Entonces cuando se trabaja en un entorno de equipo sin embargo, siempre se recomienda que ustedes no trabajen en los archivos de costura para facturar porque entonces si modifican algo en su triste modifiqué ese mismo archivo de mi lado, entonces terminaremos con este aplastante tipo de discutir situación donde dirá, Bueno, las dos líneas están viendo dos cosas completamente diferentes. ¿ Cuál debería usar? No voy a tener que manejar lo que ustedes llaman Conflictos. Te estoy citando por misa Osaka realmente te muestran cualquier conflicto no son No. Pero ojalá ustedes no se codificen en eso. Entonces lo que vamos a hacer es facturar. Entonces para hacer eso, puedo hacer click derecho ir a conseguir que eso es incorrecto. Cambios. Ahí vamos. Así maniobras y voy Visual Studios en diferentes diseños. Simplemente no queremos conseguir cambios. Una vez más, si no estás viendo eso, siempre puedes hacer clic en Ver y podrás ver ese elemento de menú en consecuencia. Por lo que siempre se quiere poner en un mensaje que represente lo que era. Entonces mi mensaje es el medio diciéndole a quien vería al enfermo, yo no base de datos las unidades superiores otoñales fuera para en el trato. Entonces no necesitas serlo, no necesitas escribir un ensayo. Pero al menos déjame tener una idea o quien tenga una idea de lo que has hecho. Después de eso, podemos hacer clic en ese auto él. Entonces decimos comprometer todo y cantar. Por lo que comprometerá los cambios uno, y te solicitará guardar, solo reproducirlo y guardarlo comprometerá los cambios localmente y luego se sincronizará con GitHub. Y en ese punto, si hay cambios esperando del otro lado, lo que significa que tu miembro del equipo hizo algunos cambios y los revisa antes. Cuando digas comprometer todo insumergible empuja hacia arriba tus cambios, consigue los más recientes. Y una vez más, si sí modificas el mismo archivo con contenido diferente, ahí es donde ese conflicto podría surgir suelo. Si no haces eso, entonces este es un proceso realmente sin fisuras. Por lo que aquí te haremos saber que se sincronizó con éxito y puedes pasar a la siguiente tarea. 18. Reseño: configuración de los puntos finales: Bienvenidos de vuelta chicos. En este punto básicamente hemos completado al menos la mayor parte de nuestras configuraciones. A medida que avanzamos, podemos ver la necesidad de incluir otras cosas. Pero ahora mismo queremos empezar realmente a hacer funcionar nuestra API porque fuera de golpear a F5 y ver jadeo y ver los tacos, nada funciona, ¿verdad? Todavía no tenemos una API. Entonces lo que queremos hacer es realmente empezar a configurar nuestros endpoints get. Y voy a explicar exactamente lo que significan los extremos get. Entonces para empezar, sólo vamos a mirar a este controlador de pronósticos meteorológicos que vino con nuestro proyecto. Pero en realidad es solo algún código de muestra que tipo de proporcionar algún contexto cuanto a lo que necesitamos hacer para que nuestro get end point esté funcionando y funcionando. Entonces nuestro controlador, y como dije antes, en realidad controla lo que sucede cuando un usuario solicita inflamación y enseña al controlador. Los puntos finales suelen estar determinados por, son lo que llamaremos axones, que son estas funciones que se van a definir dentro del controlador. Y lo que responde con R cuando el controlador las opciones, es más bien lo hace cómputación y luego responde de una manera que la aplicación de llamada o la aplicación cliente que está tratando de acceder a la API sabrá que esto fue una convocatoria exitosa. A lo mejor. Y en términos generales, cada vez que alguien causa llego a los commodities con el fin de recuperar información, ahí la palabra se pone , están consiguiendo algo, ¿esperan conseguir algo? Entonces dentro del contexto de este controlador de muestras, vemos que nosotros, cuando llamamos a este endpoint, va a devolver datos. Por lo que estamos consiguiendo beta, dado que es datos muy aleatorios. No es nada demasiado grave. Pero la realidad es que es el simple comando el que se está consiguiendo, así que tenemos lo que llamaremos a estos atributos HTTP, ¿verdad? Y es ver, está definiendo el comportamiento de la función. Entonces cuando realmente probamos resultados, y lo podemos hacer aquí mismo en el fútbol, y tú solo tienes que seguir adelante y tirar esto hacia abajo y mostrarnos todos los ejemplos de lo que podríamos llegar a comer. Después haz clic en Intentar a Toyota y haz clic en Ejecutar. Y luego se va a saber mostrar que esta fue la solicitud que se envió. Entonces note que aquí no hay ningún indicador real para decir, oh, este slash llegar allá es conocer a los niños y para ver cuál era el punto final, conocemos el servidor basado en que cuando ejecutamos la aplicación, esa es nuestra dirección del servidor. Y entonces sabemos al controlador que estamos interactuando con pronósticos meteorológicos, ¿verdad? Ese es el nombre de nuestro controlador. Controlador de pronóstico del tiempo es una palabra clave estática jamás controlada y convención de nomenclatura SSI. Pero entonces no sé qué actúa sobre él, it, Entonces lo que realmente pasó es eso, y solo voy a establecer un punto de interrupción aquí para que podamos ver ahora cuando hacemos clic en ejecutar, realidad golpea esos puntos de interrupción. Se está llamando a este método. Y se llama Get. Y cuando presiono F5, sólo regresa con toda la información que se estaba recuperando de eso. Entonces lo que realmente está sucediendo aquí es eso basado en el protocolo y ciertas definiciones que vamos a estar haciendo aquí en cada opción. De la forma en que formulemos nuestras peticiones, lo hará, el control sabrá automáticamente cuál debemos golpear. Y el contexto para esto superado detrás de esto es que no quieres ponerte demasiado granular con tus nombres para tus acciones que no quieres ver y conseguir 4x y conseguir uno, consigue uno por ID, consigue uno por nombre. Puedes llamar, bueno, en realidad puedes llamar al axón, básicamente cualquier cosa que quieras decir. Yo le puedo dar su propio nombre. Por supuesto, hay estándares son dueños de eso. Pero la realidad es que si tienes múltiples se come, nombra a todos para verlo llegar. Pero tú, en base a los datos que se requieren para recuperar la información, puedes estipular a qué get se debe llamar. Entonces todo eso, una vez más, esto es sólo la introducción. Entonces, y en el siguiente video vamos a crear nuestro propio control. Ahora vamos a empezar con los hoteles, lo siento, con los países. Y veremos exactamente cómo va y se quiere recuperar el país es el listado de países desde las necesidades de su a través de una llamada API. 19. Construct GET Endpoint: De acuerdo, entonces ahora estaremos construyendo o primer controlador y nuestras primeras operaciones GET. Entonces voy a hacer clic con el botón derecho en los controladores, ir a Agregar controlador, y luego solo vamos a hacer un controlador vacío API. Por lo que esto elige API a la izquierda y el controlador API dash vacío. Y vamos a dar click en Agregar. No, sólo por algo de claridad. Hemos ido adelante y abstraído muchas de las operaciones de la base de datos en nuestras unidades de trabajo para que no estemos interactuando directamente con nuestra base de datos a través de nuestros controladores, ¿verdad? Si hiciéramos controlador API con acciones usando Entity framework, entonces realmente generaría un controlador que tiene un objeto activo fuera del contexto DB, que es la conexión de base de datos. Y podríamos hacer todo nuestro trabajo de marco de entidad aquí mismo. Ese peligro fuera de que sin embargo, es peligro a la larga, puede llegar a ser menos mantenible como la chica requisitos, porque entonces vas a terminar repitiendo mucho cool, razón por la que fuimos todo el camino hasta R i unidad fuera del trabajo, abstraído. Todo eso lo hizo muy genérico. Para que tengamos una base de código a la que solo estamos haciendo llamadas más dinámicas. Entonces por ahora sólo voy a lidiar con el M21 porque realmente no necesitamos seguir adelante y le rompimos nada. Pero a medida que construimos la aplicación, verán la practicidad de todo lo que hemos hecho. Por lo que un controlador PI dash vacío, adelante y haga clic en add, y luego el nombre. Generalmente quieres, una vez más, el neem hasta que refleje los puntos finales porque al igual que con las previsiones meteorológicas, no tenemos cuidado cuando calentamos URL slash pronósticos meteorológicos. Esperamos lidiar con los pronósticos meteorológicos. Entonces si espero estar con los hoteles, lo siento, empiezo con clincher es que guardo una sola dosis. Entonces vamos a tener país son, dicen países controlador. Está bien. Yo quería decir país. Muy bien, controlador de país. Y luego obtenemos nuestro controlador en blanco. No, miro sobre crecido detrás de lo que estás mirando en este controlador, la raíz. Por lo que tenemos dos mecanismos de enrutamiento que podemos usar en el desarrollo de APA en este desarrollo de API MVC. Uno es el convencido sobre el enrutamiento base, enrutamiento, ¿verdad? Ahí es donde realmente tenemos que ir a la startup. Y lo configuraríamos en los puntos finales de Estados Unidos. Nosotros tipo de configurar nuestras raíces. Por lo que Quincy endpoints, puntos, trapeador, controlador, raíces de controlador. Ahí vamos. Y entonces yo como que definiría la convención de nomenclatura. Entonces podría decir nombre, colon, y sólo diré un defecto. Y entonces la Convención para el ruteo sería el patrón. reloj debería verse así. Y solo te estoy mostrando que esto no es el que vamos a usar. De qué me estoy asegurando de que entiendas exactamente todas las opciones que hay. Entonces tendremos controlador y entonces la muestra sería igual a casa, ¿verdad? Remate de slash. Y por ejemplo, índice. Y luego aguanieve. Cualquier parámetro que se requeriría no está en forma de identificación. De acuerdo, así que esto se debe fomentar también en aparatos ortopédicos. Por lo que esta sería nuestra forma de definir convencido sobre esquema de enrutamiento base. De esa manera, cada vez que lo solicito entra, esa solicitud necesita un Alistair específico que buscamos controlador de disco con ese nombre. Por ejemplo, controlador de pronósticos meteorológicos, o hace un endpoint que esperamos buscar. Pero queremos estas acciones específicas. Entonces sí mencioné que no queremos ponernos demasiado específicos con nuestras acciones. No queremos decir conseguir países, conseguir país, país por nombre, llegar a contour por, ya sabes, sólo los listamos todas 1250 subastas. Y luego el que estabas llamando cliente contra nosotros para recordar el axón que se usaría con cada llamada. Entonces eso es lo que esto nos obligaría a hacer hasta ahora. Y, y eso es, eso probablemente sea más útil para una aplicación web en nuestra aplicación MVC regular. Pero cuando consideramos los estándares de Arresto API, lo que quieren es que el verbo determine qué es lo que vas a estar haciendo. Entonces vamos a estar usando lo que llamaremos atributos rotativos, ¿verdad? Lo cual básicamente sólo va a decir, busca el controlador. Y si quisiéramos modificar la secuencia, digamos controlador de slash api. Entonces lo que sea que pongas aquí, ¿Qué va a venir después de esos nombres de servidor, nombre del servidor siendo localhost, colon, cualquier puerto dos de barra, cualquier ruta que esté aquí, verdad? Entonces si miras hacia atrás, tienes pronósticos meteorológicos, petróleo donde pronostica el tiempo, eso es lo que hay. Por lo que fue que cortó el controlador siendo pronóstico del tiempo. Si miramos nuestro nuevo, vemos que tenemos controlador slash api slash. Entonces los enlaces se verán ligeramente diferentes. Entonces cuando generemos el doc futbolístico, verás que sale a la luz. Pero ahora mismo lo que vamos a estar usando es el enrutamiento basado en atributos. ¿ Está bien? Por lo que nos permite mapear directamente a nuestro controlador y directamente a las acciones en absoluto siendo demasiado específicos sobre cuál exacto. Pero entonces el verbo va a determinar qué puntos finales se deben llamar en base a la solicitud de abajo. Entonces ahora que nos hemos puesto todo iluminado pero crecer y realmente vamos a cablear ofertas y conseguir. Por lo que antes de poder hacer cualquier otra cosa, tenemos que incluir a nuestros privados leer solo i unidad de trabajo para que podamos aprovechar el acceso a la base de datos. Está bien, y sólo voy a llamar a éste a la unidad de trabajo de puntuación. Entonces esta es mi convención de nomenclatura donde uso un guión bajo y verías que es usar un guión bajo para variables privadas. Y ya verás a medida que avanzamos, así que necesitamos eso. Y sólo me voy a poner el maderero. Entonces logger para eso, necesitamos ir y configurar o inyecciones. Entonces solo voy a copiar y pegar rápidamente estos para que no tenga que mecanografiar monetario que hacer. Entonces. Una vez más, la inyección de dependencia significa que una vez que nos hayamos registrado y en esa nota, necesitamos ir al inicio y completar una configuración. Bueno, una vez que has registrado algo en la startup como servicio en el bootstrapper, se pone a disposición de cuatro en inyección de alguna manera la mayoría de los casos, ¿verdad? Por el momento nuestro controlador, podemos inyectar la instancia de la unidad de fork y solo haremos una copia de la misma a uso local extranjero. Entonces eso es lo que esto es cuatro. Y haremos lo mismo por el maderero. De acuerdo, entonces tenemos nuestras copias locales de esas. No, lo que tenemos que hacer en una startup es registrar realmente la unidad de trabajo. Por lo que creamos un intervalo, hicimos un registrarlo en el bootstrapper. Entonces lo voy a dejar y te voy a mostrar el error que obtendrías y entonces podemos resolverlo juntos. De acuerdo, así que adelante, después de hacer esas cosas preliminares para configurar mi constructor, voy a definir que quiero en HTTP. Y se pueden ver todos los verbos potenciales que se listan ahí. Por lo que HTTP Obtener operación. Y para completar esta operación, voy a estar usando público. Sólo voy a ir asíncrono. Por lo que público asíncrono, tarea de tipo axón resultados. De acuerdo, entonces si tú, si hubieras generado el controlador con el, con el Entity Framework, ¿se le agregan? Todos ellos habrían sido colmillo de resultados de acción. Por lo que sólo se llega al código asíncrono del bloque. Por lo que es bueno simplemente empezar a usar lseek desde el, desde el principio ahora mismo puedo nombrar get country. Está bien. Eso está bien. Es decir, bueno, en este caso quiero a todos los países, entonces países porque me estoy poniendo múltiple, ¿no? Una vez más, en base a nuestro enrutamiento, no necesitamos precisar eso. Bueno, eso ya lo ves más adelante. Y entonces nuestra tarea null va a hacer un try catch. Muy bien, entonces vamos a tratar de operar y manejar cualquier error que pudiéramos obtener. Y extenderé esto con x para que realmente estemos captando el objeto de excepción. Y entonces aquí voy a decir países var es igual a o unidad fuera de trabajo para llamar a los países. Y entonces puedo decir, conseguir todo. Está bien, se ve bien. Ahora recuerda con nuestro, nuestro método, podríamos poner y expertos aquí si quisieras agregar un filtro y todas conseguir empresas donde pudiéramos hacer bastantes cosas solo con este método, pero ahora solo necesitamos todas. Muy bien, y luego voy a regresar. Por lo que los tipos de retorno son muy importantes. Se quiere devolver toda la llave cuando todo fue a nuestro, acuerdo, por eso se llama bien. O 200. Por lo que para empezar ese número es 200 y podemos devolver al viejo chico con los datos. De acuerdo, así que eso se ve bien. Por ahora vamos a estar modificándolo hasta poco combustible, pero eso es lo que vamos a intentar y hacer. Y luego si todo sale bien, regresaremos. Está bien, y va a enviar de vuelta al cliente que llama cualquier dato que haya vuelto de esta llamada. Conoce en nuestra captura, en este punto, nuestro registrador se vuelve muy importante. Por lo que logger dot log error. Y entonces puedo ver algo así como signo de dólar. Algo salió mal. Y puedo ver puedo poner más detalles en el y de alguien usar mi interpolación. ¿ Ese dólar firma ahí en caso de que no estés familiarizado con él, no asignes cadena. Hizo los significados para súper imponer cualquier variable en este punto. Entonces solo voy a especificar un poco el nombre fuera del método donde lo que salió mal, de acuerdo. Así que nombre fuera obtener países. Está bien. Y luego voy a jefe en el objeto de excepción. En realidad tengo eso al revés. La excepción debería venir primero en el error de registro, coma de excepción, luego algo salió mal con nuestra excepción, luego nuestro mensaje. Por lo que Asiria log con en realidad sólo umbrales se imprimen todo el rastro de pila. Por lo que se pueden ver todos los detalles de la flecha a partir de la excepción que ha sido cierta. No, si hay un error, no quiero solo tirar lo que quería hacer es alertar al cliente de que algo salió mal, Lee, Así que sí, el logger ver es que es para todo propósito interno. Pero luego quiero devolver algo que el usuario vea, ya sabes, esto es lo que pasa. Por lo que un código de estado 500 es el código universal para ver que había un problema de servidor. De acuerdo, así que esto es decirle al usuario que esto, algo salió mal en todo aparte. No eres tú, soy yo. Está bien. Entonces el código de estado 500 significa Error interno del servidor. Y otros decir por favor inténtalo de nuevo más tarde. De acuerdo, así que eso es lo que son nuestros clientes. Mira puedo y consumir la API veré cuando hay un error. De lo contrario deberían conseguir la lista de países. Entonces probemos esto. De acuerdo, entonces lo primero que notarás es que, no, nuestro nuevo punto final se ha sumado al jadeo. El segundo que notarás es la diferencia entre el bucle de enlaces Holden. Así que slash pronósticos del tiempo para nosotros mismos slash api slash país. Una vez más, eso tiene que ver con la ruta que hemos definido aparece si es controlador api slash o es solo el nombre del controlador. De acuerdo, así es, es dinámico. Entonces en cualquier momento podemos ir y quitar la API si es demasiada molestia, pero la dejaremos por ahora. Entonces vamos a verlo, probarlo, y luego hacemos clic en Ejecutar. ¿ Y qué obtenemos? Entonces en primer lugar, Esa es la URL de solicitud, por lo que el servidor, De acuerdo, slash api slash country. Y estamos recibiendo este error, correcto. Por lo que en realidad está escupiendo Tool o jadear toda la respuesta. El mar incapaz de resolver el punto de servicio activando este punto y se ve que se está levantando 500 error. De acuerdo, así que le dijimos devolver un 500 cada vez que algo malo sucede. Y lo otro a notar sin embargo, es que no estoy especificando el nombre de la función que se está llamando. Entonces antes de arreglar ese error, note no estoy diciendo slash api slash controller slash get countries. Sólo está llamando a slash api slash country. Tú, el usuario no conoce el nombre del método que se llama y siendo, ya sabes, enviando de vuelta la respuesta. Entonces eso es otra cosa que cuando hablamos de la convención de ruteo, porque especificamos que es, lo consigo formado automáticamente. Debería ser un comando Git. Entonces vamos a arreglar la era y luego la voy a volver a probar usando Cartero, que debería proporcionar un poco más de contexto en cuanto a lo que queremos decir por GET versus post, etcétera, etcétera. Entonces para solucionar este error, necesitamos registrar nuestro servicio y supongo que antes en nuestra startup, no cs. Por lo que en la startup, necesitamos decir algo así como Servicios punto y agregar unidades i transitorias o cuatro unidades de trabajo. Por lo que verías que las diferentes opciones escolares son transitorias, agregar ámbito, y agregar el singleton. Sí, a veces me olvido, ¿verdad? Entonces agrega lo que hemos hecho, una señal add TA1 antes, ni tampoco lo hemos hecho. De acuerdo, así que soy trans. Significa que cada vez que se necesita, se crearía una nueva instancia en el ámbito significa que se crea una nueva instancia por un período o por la vida útil de ciertas solicitudes de compensación. Y agregar singleton significa que sólo una instancia donde existan durante toda la duración de la aplicación. Por lo que en función de tus necesidades, podrías terminar haciendo otras diferentes. Entonces agregar transitorio aquí significa que siempre que alguien golpee mi control, siempre voy a crear. Esto siempre va a proporcionar una copia fresca. El IU y está fuera de trabajo. Por lo tanto, permítanme seguir adelante e incluir las referencias que faltan. Y luego intentemos de nuevo esa petición. Por lo que en esta ocasión voy a usar Cartero para manejar esta solicitud. Entonces yo sigo tratando de votar sólo para demostrar eso. De acuerdo, entonces estamos recibiendo un error para el registrador. Y está bien, arreglemos eso. Entonces estos son, es bueno ver estos errores. Dc puede decir por qué. No podemos. Podemos rastrear esos zapato hasta Y donde conseguir esos. Entonces creo que el tema con el logger es que se tiene que inyectar con el contexto de la clase se está inyectando. Por lo que en este caso, sería el controlador. Por lo que sólo cambiaré este Alyssa I un maderero dentro del contexto de este cambio donde vemos clima para conjurar con Schrodinger. Muy bien, y luego probémoslo una vez más. De acuerdo, así que esta vez lo vamos a probar con cartero. Entonces solo voy a ingresar la URL de solicitud, que una vez más es solo el es el colon localhost, el número de puerto que tienes. Y luego slash api slash country. Nadie hablaría de GET versus post versus spots. Boltzmann, en realidad podemos tratar de cambiar el tipo. Entonces recuerda que lo construimos para ser, entiendo que eso es lo que está diseñado para ser. Lo que significa que si intento llamar a este mismo endpoints sin post, me va a dar una no pudo obtener respuesta. Y OK, estoy recibiendo algo por el SSL. Entonces solo puedes seguir adelante y desactivar la verificación SSL y si estás recibiendo ese problema, está bien, ahí vamos. Entonces método Mata carga. Método Mata load significa que envió alguna solicitud y el verbo que se solicitó. Esos frutos secos existen. De acuerdo, así que si hubiera intentado conseguir y luego mandar otra vez nonce, estoy recibiendo un 500 y estoy consiguiendo otra flecha. ¿ Está bien? Oh, estamos recibiendo algún buen error. Entonces este concepto de buenos errores, donde es bueno ver estos errores y entender cómo solucionarlos, ¿verdad? Entonces éste está diciendo que System.Out toma punto JSON está dando una excepción porque un potencial ciclos detectados. Por lo que el dinero crecido a esto es que por la dependencia del hotel, Hotel tiene una dependencia de país sobre país. Tiene esa dependencia buck a Hotel. Una vez que está diciendo es que bueno, estoy consiguiendo hotel que tiene contrario, soy los hoteles de Andrea. Estoy viendo muchos datos cómo va de un lado a otro. Entonces yo, vamos a arreglar este. Ya me he encontrado con éste antes. Entonces, solo sigamos adelante y arreglemos esto. Para ello necesitamos una biblioteca, administrar, hacer obtener paquetes. Y vamos a estar consiguiendo la nueva biblioteca JSON de soft dot, pero no esa que queremos. El Microsoft es b-a. Déjame solo escribir en nuevo giro suave. Ese no es el que queremos. Queremos éste, el que está optimizado. Para nuestro propósito, ¿verdad? Entonces solo voy a seguir adelante e instalar out1. De acuerdo, y una vez que se ha instalado, lo que tenemos que hacer es ir hacia la puesta en marcha. Y vamos a añadir controladores. Vamos a añadir nuevo JSON suave TEN. Ahí vamos y definimos algunas opciones. Entonces todo lambda RO, quiero decir que puedes llamarlo opción si quieres alguno. Tolkien está bien. Lambda R0. Y luego define ese punto OP serializa esos ajustes del serializador. Referencia de puntos, manejo de bucle es igual a dos leones análogos, así que no te alejes demasiado de la pantalla. Por lo que los serializadores configuran el manejo de bucle de referencia de puntos es igual al JSON de punto suave de Newton, no al manejo de bucle de referencia. Y entonces eso es una enumeración, así sucesivamente decir ignorar. Entonces, donde ves eso, básicamente estamos viendo dónde puedes ver un bucle de referencia que ocurre. No lo sé, haz un gran problema con ello, solo ignóralo. Se hizo la vista gorda. Deja que el programa se ejecute. De acuerdo, entonces otra cosa por la que sólo estoy pasando y corrigiendo cualquier pequeño error que se cometa aquí. Estamos llamando a get todo lo que no hice fue esperar una regla cardinal cada vez que estamos llamando a una función asíncrona o algo que sea una tarea, se asegura de que seamos pesos. Muy bien, así que intentemos esto otra vez. De acuerdo, así que volviendo a cartero, vamos a tratar de mandar más. Y esto se ve un poco mejor. Ahí vamos. Estado 200, ¿de acuerdo? De acuerdo, así que una vez más, nuestro status 200 es una arena universal que todo está bien. Y en lugar de que tengamos que decir el código de estado 200, Knidos nos dio un método porque desafortunadamente no tienen un método para el motor FIFO o al menos aún no he visto uno. Entonces por eso este se ve así. Y podemos simplemente decir ok, con los datos a devolver y automáticamente se serializarán en. Ahí vamos. De acuerdo, así que ten en cuenta que tenemos cada propiedad regresando y hoteles que están vacíos, Farnell, ¿verdad? Porque no incluimos a los votantes. De lo que podemos hacer eso más adelante. Entonces así es como manejamos no consigo 7x una modificación más que hacer y eso es hacer el mapeo. Entonces recuerda que no queremos devolver los objetos de dominio reales. Tenía razón, no. Gets todo está regresando país. Y el país es el objeto de la base de datos. Lo que queremos devolver es el dto. Por lo que queremos regresar, aportar trato. Y luego más adelante veremos cómo podemos extender el detalle para ser un poco más, hacer que tenga sentido en cuanto a por qué voy a pasar por toda esta pala porque claramente funcionaba el modelo de datos que el modelo de dominio como tipo de retorno. Pero entonces todavía queremos esa segregación. Entonces sólo voy a decir continuidad o vamos a mapear a ella. Entonces necesitamos a nuestro mapeador de Otoño para poder hacer eso. Y para conseguir el otoño superior, tengo que definir un privado de lectura sólo tipo anulado. Yo soy superior, así que solo seguiré adelante e incluiré eso y luego haré la inyección. De acuerdo, entonces nosotros, después de inyectar, entonces vamos a separar a los sujetos. Entonces vamos a decir que los países var es igual a esa llamada. Y luego salí otra variable bajo eso y lo llamo vía resultados es igual al mapeador de punto al que fui a especificar el tipo de datos al que quiero mapearlo. Entonces quiero mapearlo a nuestra lista de tipo country dto para lo cual tengo que incluir una referencia faltante, ¿de acuerdo? Y revelar que los corchetes angulares. Y el mapeo en tiempo de guerra son los países que ya están regresando como lista. De acuerdo, así que sea cual sea el tipo de datos que sea que seas, estás recuperando para asegurarte mapear a ese tipo de datos apropiado y luego todo eso. Por lo que solo va a tomar todos los objetos de dominio y convertirlos en objetos dto country y almacenados allí. Entonces si no especificara ion-list, obtendría un error porque esta es una lista. Y estoy tratando de, bueno, lo haría, daría un error sin importar, puede que no te dé un error de sintaxis, pero puedes ver que el tipo de datos no es todo lo que estoy esperando porque necesito esa lista, ¿verdad? Entonces solo sé muy explícito en despegar esta sección de mapa. Ese es tu mapeo. Enlista fuera de esto, o estás obteniendo que espero asignarlo a una lista de ese tipo de datos. Y entonces en lugar de regresar, los países devolverán resultados que es del tipo País D TO. Entonces en este punto, si es que queríamos dejar fuera algunos detalles son incluir más detalles. Podríamos haber definido esos campos adicionales aquí, no hagas lo que sea que los cálculos quisieran hacer aquí dentro. Y entonces nunca verían realmente lo que está dentro, lo que viene directamente de la base de datos. En qué lo habríamos desinfectado, transformado, embellecido tanto como queramos antes de devolver los datos. Entonces, solo sigamos adelante y probemos y asegurémonos de que éste funcione y luego terminemos con esto. Por lo que de vuelta al cartero, vamos a decir enviar. Por lo que va a golpear el mismo método. Y bien, no, está trayendo de vuelta. Entonces aquí hay prueba de que está trayendo algo diferente porque recuerden, hoteles estaban en la parte inferior de la lista inicialmente, ningún nombre de hotel ID que nombres cortos. Por lo que sabes que esos datos se reestructuran sólo porque los campos en contradicción estás en un orden diferente al que están en los objetos de dominio. De cualquier manera, podemos ver que sigue funcionando y así es como realmente debería ser. Entonces cuando volvamos vamos vamos a ver cómo podemos conseguir un país específico basado quizá en la identificación. Empecemos con el id. 20. Construct GET por Id Endpoint: Muy bien, así que previamente configuramos nuestro método get, y esto es realmente como get all method, pero no es todo el tiempo que nuestra aplicación cliente quiere conseguir todo. A veces quería obtener datos específicos, bien, así que queremos al menos proporcionarlos en puntos finales donde puedan conseguir país basado en un identificador único en particular. En este caso, el DNI. ¿ Está bien? Y solo por contexto, ya que estamos facturando a API con el contexto de ese cliente. Si veías una lista de países y él quería ver los detalles de uno de estos países y haces clic en ver, entonces lo que pasaría es que volvería a la base de datos y conseguiría que ese país específico mostrara la inflamación específica son detalles de ese país en particular. De acuerdo, entonces eso es lo mismo para lo que queremos proporcionar un endpoint. Para que cuando de su lado, cuando el usuario haga clic en el país, ellos en el propenso a los malos, diremos en qué país se hizo clic aquí, ¿en qué ID hay? Aquí está la API ID. Por favor me pueden dar los detalles? Y luego decimos: OK, haremos la búsqueda. Estos son los detalles para ese país en particular. Entonces sin más demora, vamos a llegar a ella. Entonces en realidad sólo voy a copiar ese get original. De acuerdo, y sólo vamos a hacer algunas modificaciones menores. Por lo que la primera modificación en serían los atributos. Entonces sí, son las dos y se pone, correcto. Pero esto Get en particular necesita saber que puede tomar un parámetro, ¿de acuerdo? Y esto es realmente, hace mucho que ver con la documentación sobre propósitos en su madera para que cuando la gente lo vea, puedan inferir al mismo tiempo watts cómo difiere conforme va. Entonces puedes definir el Git, pero luego abres y cierras corsé, y luego dentro de eso defines la plantilla para el bien. Entonces puedo decir aquí que estoy esperando que algunos entornos se llamen ID y debería ser de tipo int. Entonces si quisiéramos obtener por nombre, podríamos hacer algo así como nombre de tipo string. Está bien, entonces, para que sepas que este get va a tomar este nombre de parámetro. Y los nombres son muy importantes. Y ese tipo de datos, que también es muy importante. A continuación, vamos a tener que renombrar esto. Es decir, conseguir países, esto no es conseguir países, esto es conseguir un país. Y está tomando un ID de parámetro. Entonces como con cualquier otro método en cualquier otro lugar en c-sharp, una vez que están llamando a un método que tiene ambientes están en, que defender departamento que eso es lo que está esperando. Y note que el nombre aquí, mucho es el nombre que está en los atributos. De acuerdo, así que consigue identificación de país, nulo. Tenemos el mismo try-catch. Bueno entonces vamos a cambiar la consulta y los objetos de mapeo. Entonces uno, no estamos consiguiendo países donde conseguir país y trabajar en ello de la misma manera. Se trata de unidades, los cuatro países, lo que estamos llamando el método get. Muy bien, y nuestro getMethod, nota la línea roja, el método get requiere la expresión son la estipulación detrás de lo que exactamente debería estar recibiendo. Entonces tenemos que definir en esta expresión. Entonces recuerda dije que la expresión realmente va a ser una expresiones lambda. Voy a pasar en ese mismo tipo de expresión lambda. Siempre di Tolkien lambda R0. Y entonces qué busco? Q punto. Y luego tengo todos los campos fuera de la mesa. Entonces esto fue diseñado para países, ¿verdad? Entonces, ¿qué es el campo en las mesas del país debería estar buscando? Busco un IB. Y mi condición es que el ID en tabla del país coincida con el ID que entra a través del parámetro. De acuerdo, y luego de la misma manera, puedo incluir, porque solo estoy pensando en ello. Si me preguntas por el país dentro del contexto de esto, alguien hizo clic en un país. Me di cuenta tal vez querrás ver todos los hoteles para ese país en particular. Entonces mientras miraba la lista de países, solo querías ver tal vez la lista de países. No obstante, cuando miras a un país, probablemente quieras ver toda la lotería, ¿verdad? Entonces nuestros hoteles, así que quería decir una nueva lista, Abbas de alguien en una nueva lista de tipo string. Y voy a sumar a ello. Entonces esto es todo lo que inicializamos una lista y una podemos decir que quiero incluir tos enteros. Entonces una vez más, esto ahora se va a repasar, es nuestras unidades fuera de trabajo va a golpear el, déjame encontrar el método que está en el repositorio genérico. Y se va a golpear el get. Entonces esta es la expresión, esta es la Incluye. Entonces se pone todas las tarjetas rojas. Entonces dice, si hay un incluye, adelante e incluye lo que necesites incluir, incluye los hoteles, ¿no? Y luego vamos a buscar en la consulta, despegar el camionaje y devolver el primer default estrella para requerir que tanto es, y por defecto realmente significa afinidad neolítica recién devuelta. Bueno, el primer registro que coincide con esta expresión, por lo que expresan en sería donde q dot id es igual al valor ID. Haremos todo el cómputo y solo regresaremos. Quieren Guardia Roja se llevó país con todos los hoteles que están disponibles. Entonces solo voy a volver a comprobar con mi dominio solo para asegurarme de que la cosa se llama Hoteles causa este sistema mucho de la misma manera en el ETO consciente, se tiene que llamar dedos de los pies. De acuerdo, así que ahora que hemos hecho ese cableado arriba, sólo voy a cambiar mi mapeo. Entonces estoy consiguiendo alrededor de un objeto country, juan objetos. Entonces no voy a subir a nuestra lista. Solo estoy mapeando para aportar azulado. Entonces eso es un mapeo uno a uno. Y me estoy quitando las S y arreglando los plurales y singulares Solo para que un código sea autoexplicativo. No deberíamos estar llamando a estos países cuando sólo estamos consiguiendo uno, ¿verdad? Entonces solo estoy tratando de asegurarme de que sea legible. De acuerdo, y entonces sólo vamos a ver que algo salió mal en nombre de get country. De acuerdo, así que tomemos este para dar una vuelta para que veas que el get es realmente sencillo, ¿verdad? No queríamos ahí y acabamos de tomar la cuota con algunas modificaciones. Potencialmente no lo hagas con él. Entonces veamos. Entonces lo primero que quería llamar su atención es la documentación. Por lo que ves api slash country e idiotez API slash country slash ID. Por lo que esa identificación que se está mostrando ahí es cortesía de nuestra anotación aquí. ¿ Está bien? Y luego si profundizamos en su, verás que en realidad están viendo que se requiere el parámetro ID. No hay dos formas al respecto. Es un requerido. ¿ Está bien? Y si decimos Pruébalo todo, puedes poner en eso. Pero voy a poner, voy a usar a Cartero para probar este. ¿ Todo bien? Entonces cuando digo ponerse bien con cartero y el mismo endpoint y CSS y estoy obteniendo el origen ahora get, que es conseguir la lista. No, cuando modifico este punto final y digo slash uno, de acuerdo, y luego haga clic en enviar, vigile Qué obtengo cuadro, así que estoy obteniendo sólo un resultado. Y esta es la identificación. Y es la lista de hoteles que solo hay un hotel asociado al hotel número uno. Empieza con el país número uno. Sólo hay un hoyo a lo que es esto en IRI. Entonces si hay más de todos ellos se enumerarán bajo esa propiedad o atributo. Y entonces el nombre es ficticio cuenta de short_name es GM. Entonces ves que nuestro segundo Git está funcionando. Entonces déjame solo poner nuestro punto de ruptura. Y seguramente exactamente lo que está pasando cuando cumplimos esa petición. Por lo que poniendo ahí nuestro punto de ruptura y luego haciendo clic en enviar de nuevo, se activa el punto de ruptura. Si miramos en el listado de parámetros, vemos nuestro valor, uno viniendo. ¿ Está bien? Y entonces podemos seguir adelante y voy a usar F diez. Entonces noticias si no entra en todo el método causa que si miro a un objeto country que regresa, verás hoteles y eso es por lo menos con un solo id, el nombre, el nombre corto, y luego hacemos el mapeo. Entonces ningún resultado tiene todos los datos que apenas estaba en país. Y luego va a volver a todos k con resultados se va automáticamente a deserializarlo en serializarlo en diseños JSON. De acuerdo, y ahí mismo, terminamos con nuestro segundo get. Entonces ahora sabemos llegar a todos, y ahora sabemos cómo conseguir por línea de base aparte requisitos particulares. 21. Configurar los puntos final para los hoteles: Muy bien chicos, así que les estoy emitiendo un reto. Yo quiero que pausas el video. Sí, sólo empieza en, pero adelante y pausa. Y quiero que sigas adelante y crees un controlador para los hoteles. Se puede llamar a su controlador de hotel. Y la funcionalidad que acabamos de pasar con nuestro controlador de país. Yo quiero que lo repliquen en el contexto de los hoteles. Por lo que ya lo tengo aquí. Pero quiero que hagan una pausa donde el viento pase por ella juntos. Pero quiero que pausas la actividad a ti mismo. Y luego comparamos notas. De acuerdo, unos Buck y yo soy Sagan buck porque estoy asumiendo que pausas el video y sabes que estás reanudando. Y ahora lo podemos pasar juntos. Entonces aquí tenemos el controlador del hotel y yo pasé por los mismos pasos. Hice clic derecho en los controladores, hice clic en Agregar controlador de datos, controlador API en blanco llamado el controlador total. Seguí adelante e inyecté música bajo los mismos servicios que no estaban en el controlador de contacto e inicializarlos en el constructor? No, todo prácticamente es idéntico. Las únicas cosas que realmente cambiaron donde mis nombres de variables, porque obviamente no voy a llamar a este país si estamos consiguiendo hotel. Así que consigue hoteles en lugar de conseguir países te digan tele, en lugar de conseguir hotel x2 y similitud, te gustaría llegar a un hotel por ID. Otra cosa que me gustaría un punto dicho sería el mapeo donde mapeo para sostener el T0. Y lo último sería que he añadido más atributos. Entonces como vemos ese atributo tipo de Edén, indica el jadeo de Elis. Y quiero decir, sí dicta el comportamiento, pero swagger sí depende de su también saber cómo fórmula LTL esa documentación. Entonces aquí mismo le estoy haciendo saber que este método produce 200. También produce 500 porque si recuerdas, cuando miramos a swagger y él volvió a 500, habrías visto algo viendo indocumentado debajo de ese error 500. Y así queremos simplemente asegurarnos de que swagger contextualmente le diga tanta información al desarrollador como sea posible en cualquier momento dado. Entonces y yo traigo jadeo. Vas a ver el país de segregación diferente al hotel. ¿ Está bien? Espero que estés viendo esto. Y si nos fijamos en hotel o en alguno de estos, que los atributos eran ambos atributos se añadieron. Verías que el 500 no estaba ahí inicialmente y ver el 200 null 500 no estaba ahí inicialmente. Está bien, así que eso sí funciona o para que alguien use a Cartero para hacer algunas pruebas. Por lo que todavía tengo mi prueba desde el momento. Y la cosa es con Bozeman, siempre se puede simplemente iniciar una nueva pestaña, ¿verdad? Entonces en lugar de usar una tina para estar cambiando continuamente, quería tener una para el gueto sin parámetro y distribuye por aquí. Entonces este no es un parámetro que vea si eso funciona. De acuerdo, lo siento, antes no probaron mi código. No, lo escribí y no lo probé y me alegra ver que está funcionando. ¿ Está bien? Y luego el que tiene el parámetro que también funciona. Y por ahora eso es todo lo que hay para configurar nuestros controladores. De acuerdo, así que tantos controladores como pudieras tener, por supuesto, variaciones y en base a contextos, ciertas cosas pueden diferir. Pero tenemos una buena plantilla sobre la que podemos construir nuestras operaciones de Git. De acuerdo, así que puedes seguir adelante y acaba de hacer esto apagado. Y luego cuando regresemos, estaremos empujando nuestros cambios a nuestros repositorios. 22. Toques finales y añadir cambios a GitHub: Muy bien chicos, entonces estamos de vuelta en nuestro proyecto y nuestra tarea hoy es simple. ¿ Dónde hacer cisne para revisar todos nuestros cambios? Por lo que cualquier cosa con nuestro SDK se habría modificado una vez más en el camino, y se agregó cualquier cosa con un signo más verde. Por lo que sólo podemos seguir adelante e ir a conseguir cambios. Y solo voy a refrescar lo que no necesito refrescar, compartir todos mis cambios. Y en cambio, alguien puso en mi mensaje. Y mi mensaje es solo hacer saber a todos que agregué el contorno y el hotel obtener métodos también arreglar las unidades fuera del trabajo DI referencia de inyección de dependencia porque recuerden que hicimos esa modificación en la startup. Para que pueda seguir adelante y comprometer todo y hundirme. Y una vez hecho eso, estamos listos para pasar a nuestro siguiente módulo. 23. Asegurar tu API de iniciación: descripción de la sección: Bienvenidos de vuelta chicos. En esta lección, estaremos haciendo una breve visión general del concepto de seguridad relativo a su API de descanso. Ahora cuando hablamos de seguridad, pesar de que es una especie de autoexplicativa. Cuando hablamos de lo que es la seguridad, como que tenemos que meternos en algunos detalles al discutir agujero, hacemos que una API sea segura. Ahora algunas de estas cosas en realidad ya se toman en consideración y salen de la caja con al menos No.NET Core API. Realmente no puedo transitar por otros marcos de desarrollo de API. Una vez más, el voltaje para la API .net, donde a tipo de hacer cumplir o alentaron fuertemente ciertas consideraciones de seguridad desde el principio de la creación del proyecto. Y luego depende de ti si quieres continuar con eso es realmente y verdaderamente lo hacen tan integrado que lo estás haciendo mañana te das cuenta de que toda la seguridad podría estar fuera de la caja. Por lo que el primero y probablemente más importante sería usar SSL. Por lo que SSO es un SSL estándar, TLS. Hay estándares para la comunicación HTTP y lo que hacen es hacer cumplir cierta cantidad de cifrado en todas las comunicaciones que cruzan la tubería, ¿verdad? Entonces cuando estás creando el proyecto, creo que había una opción ahí para habilitar o deshabilitar SSL y bueno, no le llamé mucha atención. Pero si quieres ver si SSL está habilitado, siempre puedes hacer clic derecho ir al proyecto de réplica de propiedades, muchas propiedades bajan a depurar. Y entonces verías aquí que habilitar SSL está ahí por defecto. Por lo que incluso en modo de depuración, te están alentando a usar SSL. Y por supuesto, cuando sigas adelante y publicas, te animan a usar certificados SSL adecuados de AS. De lo contrario, también tienes acceso a un sistema de autenticación de usuario muy poderoso en forma de núcleo de identidad, que estaremos sentados, lo que te permite autorizar, autenticar, y digamos que sanitizador misiones basadas en sobre quién crees que debería estar accediendo a tu API. Ahora, no siempre necesitas eso para una API. En ocasiones, su API necesita ser accesible públicamente por cualquiera y todos. Y luego hay algunas veces en que el registro de alguien verifica quiénes son antes de poder acceder a información basada en nuestra API y no, cualquiera podría venir un acceso. El listado de hoteles son particular acto hotelero. No hay restricción para autenticar y autorizar a un usuario antes de que les permitiéramos hacer eso, sin embargo, estaremos poniendo cosas en marcha que nos permitirían tipo de control quién obtiene acceso a uno. A pesar de que cosas como lo que exponemos en nuestras URL y cuando decimos URLs, quiero decir como Aquí estamos Recuerda que cuando queremos que llegue a un hotel en particular donde cargar los topos de usuario ese ID, eso no es datos sensibles. No obstante, si era algo así como una contraseña o algo que, ya sabes, no quieres que el mundo vea, entonces definitivamente no quieres ponerla en apartamentos. Y así la forma en que diseñas, tienes una forma defensiva de diseñar tu API que tal que estás asegurando implícitamente ciertas cosas. Por lo que con un diseño deficiente, podrías introducir defectos de seguridad. Entonces por supuesto, lo que permites ser la Pascua como bonita y toma los parámetros de Laura. Qué callas ¿Estás encriptando en el camino todas esas cosas, it, en hacer segura tu aplicación. Ahora con todo eso dicho, a veces pensamos que necesitamos tener algo muy, muy seguro fuera. Tratamos de poner toda forma de seguridad en nuestra API, y eso no es necesariamente cierto, como siempre he dicho, el contexto determina mucho. Entonces te daré un ejemplo de una vez que tuve que desarrollar una API o superior son propiedad de un tercero. Y el concepto era que este servicio de terceros proporcionaba algunos servicios de mensajería que mi empresa habría utilizado para diversas aplicaciones? No. Lo que no queríamos hacer fue integrar el endpoint de terceros en 5-6 obligaciones diferentes. Porque si el vendedor cambiara su diseño o algo así, tendrían cinco o seis puntos de contacto diferentes que tendrían que mantener. En su lugar. Me pusieron a cargo de desarrollar una API que consumiría la API de terceros, y luego las aplicaciones internas consumirían mi API para que si el tercero cambiara su diseño, solo tendríamos el 1 para cambiar porque todo el mundo está consumiendo nuestra API ya interna. Sepa cuándo, cuándo, cuando la empresa mencionó que, por supuesto, la seguridad estaba muy alta en la lista. Y seguí adelante e implementé todo tipo de autenticación en Tolkien. Y estaremos viendo el de Tolkien también a medida que avanzamos. Pero todo tipo de protocolos de seguridad y realmente y verdaderamente fue exagerado porque la API interna era sólo que era interna. Teníamos listas blancas IP y protocolos de protección de red muy fuertes que rodeaban lo que operaba internamente en nuestra red. Por lo que para tener una aplicación interna es necesario verificar quién es para acceder a la otra API interna antes de que salga al tercero. Todo eso fue realmente exagerado. Nos está dando escenario fuera donde yo personalmente, hubiera implementado algo que fuera exagerado. Después de un tiempo, acabamos de construir todo el exceso de cosas y teníamos todos los protocolos de seguridad para defenderse del equilibrio en absoluto. Entonces, una vez más, el contexto determina mucho. No obstante, para esta sección estaremos implementando la autenticación, lo que significa que nuestros clientes deberán registrarse con nuestra aplicación, con nuestra aplicación API. Y tendrían que iniciar sesión pasando el nombre de usuario y la contraseña que habrían utilizado para registrarse. Y luego subsecuente a eso, estaremos asumiendo lo que llamamos JSON. tokens web son tokens portadores los cuales tendrán información que nos informará cada vez que hagan una solicitud de quiénes son para que no tengan seguir iniciando sesión antes de poder hacer cosas que hacen eso una vez, consigue este Tolkien y pasar ese token a lo largo de cada vez para que verifiquemos y aceptemos o nieguemos. Entonces eso es lo que estaremos haciendo en esta sección suficiente de mi monólogo. Siguiente parada, vamos a estar creando nuestro núcleo de identidad están integrando núcleo de identidad en nuestro proyecto. 24. Configura la identidad del usuario: Oigan chicos, bienvenidos de nuevo. Por lo que nuestra primera línea de seguridad será para la autenticación. Y para implementar las características de autenticación en nuestra API, vamos a estar aprovechando las bibliotecas integradas de cuello CT. Entonces vamos a estar haciendo algunas modificaciones en nuestro contexto de base de datos, nuestra startup y otras pequeñas cosas aquí y allá. Entonces, empecemos con nuestros contextos de base de datos donde tenemos que cambiarlo de ser contexto DB a ser null contexto DB identidad. Por lo que esta es sólo otra clase que nos permite aprovechar los servicios de esa entidad. Y cuando hago puntos de control, ves aquí que tienes la opción de instalar una identidad paquete.net si R en diferente núcleo de trabajo. Por lo que solo tienes que seguir adelante y encontrar e instalar la última versión. Y luego una vez hecho eso, necesitamos hacer una modificación más. Tour por la creación de modelos, donde necesito decir punto BCE sobre la creación de modelos. De acuerdo, así que después de llamar a la misma función en la clase base, que es nuestra nueva clase base, simplemente pasaré a lo largo de los objetos del constructor de costura que estamos usando en el contexto actual de DB. Ahora ese es el paso uno hecho. Pasaremos al archivo de inicio y luego empezaremos a hacer modificaciones aquí. Ahora lo que tenemos que hacer es configurar nuestros servicios de identidad para saber qué clase se va a utilizar para inferir las tablas que se generarán. Entonces, antes de seguir adelante, déjame solo retroceder un poco y explicar qué va a pasar. Donde diciéndole a nuestra aplicación desde el principio que queremos utilizar nos deben servicios de identidad. Eso es lo que estamos a punto de hacer. Conocer los servicios de identidad se basarán en una conexión de base de datos a pozo, una conexión a una base de datos que tiene tablas para facilitar cosas relacionadas con la identidad, usa roles de almacenamiento, reclamos de almacenamiento se conocen ambas cosas. Entonces lo que tenemos que hacer es configurar los servicios de identidad para saber qué clase va a informar cómo debe verse la tabla de usuarios. Y si potencialmente hay otro para roles, reglas de titular, veremos, etcétera. Por lo que ya incorporado es usuario llamado nuestra clase llamada Identity user. De acuerdo, déjame solo seguir adelante e incluir, digamos ver que es vidrio legítimo que ya está incorporado, que se puede usar. Nos fijamos en los detalles de identidad usuario. Verías que tiene campos para local y no tienes que venir aquí. Pero si quieres volver a llegar a ese punto, este control haga clic y luego continentes o control haga clic hasta que lleguemos a esa parte. ¿ Está bien? Por lo que tenemos estos campos predeterminados que aparecerán en la base de datos como se puede ver de ID, nombre de usuario, correo electrónico y contraseña, hash de contraseña, ¿verdad? Por lo que esos son campos comunes que cualquier tabla de usuario necesita tener su trato con el hashing automáticamente. Es todo, siempre va a tener todo eso incorporado. No hay problema. No obstante, puede haber momentos en los que necesitamos un poco más de inflamación de nuestros usuarios luego simplemente correo electrónico, contraseña y nombre de usuario potencialmente. Por lo que nos permiten extender la clase de usuario de identidad y poner en otros campos como hicimos lo necesario. Por lo que ya he comenzado un poco ese proceso en datos crea este usuario API de hierba. Puedes seguir adelante, hacer clic con el botón derecho en tu carpeta, ir a agregar nuevo usuario API de clase. Y luego en API user, lo que he hecho es heredar del usuario de identidad. Entonces recuerda una vez que sucede la herencia, lo hicimos con nuestros detalles antes. Entonces lo estamos haciendo no, con los admins, es usuario, va a heredar automáticamente todos estos campos así como cualquier otro campo que vea que necesito. Entonces en este caso solo necesito FirstName, LastName. Podrías querer fechas de nacimiento iguales a un país de nacimiento, código de área, otras cosas, lo que sea que quieras, solo puedes extender esta hierba y añadirlas, pero siempre tendrá estos campos por defecto. Por lo que una vez que tengas esa clase creada, puedes hacer dos cambios. Antes de volver a empezar, quería agregar esa clase como contexto para el contexto DB, mis corchetes angulares y ver el año de contexto DB relativo a API utilizable porque por defecto es bueno usar identidad user. Entonces si no tienes ese requisito donde necesitas más campos, entonces no tienes que dar ese paso extra. No obstante, sería bueno hacer ese paso extra porque más adelante si necesitas extenderlo, puedes hacerlo sin mucho dolor de cabeza o estafado. De acuerdo, así que ese es un cambio más que podemos disfrutar. Contexto Db. No, necesitamos configurar los servicios de identidad. Entonces podría hacer eso desde aquí, pero me voy a llevar otro viaje no, donde no queremos a algunos a veces no quieres seguir poniendo y poniendo y el inicio de las pilas es hincha. Y luego hay que desplazarse por montañas de cotizaciones, una configuración fan one. Entonces lo que vamos a hacer es ir a nuestro proyecto para crear una nueva clase. Si querías ponerlo en una carpeta, eso está bien, pero solo lo dejaré en este nivel. Por lo que quiero llamarlo extensiones de servicio. Y luego dentro de extensiones de servicio, voy a tener vacío público estático. Y voy a llamar a éste configurar identidades. Entonces esta clase va a ser como, bueno es la extensión de servicio, digamos que van a configuración que pasaría a cargar en este ancho de archivo de inicio, podemos abstraerlo a esto y se llama el medo's aparte ME, bueno, ya verás eso. Entonces voy a decir esto como un parámetro, esto, y luego doy servicio de cobranza y lo llamo sus servicios. Incluir cualquier referencia que falte. Había un objetivo y entonces esto no está dispuesto a decir que necesito tener esto como estático. Gus, Ahí vamos. Está bien. Entonces dentro de este método, voy a tener un verbo, lo voy a llamar constructor. Entonces básicamente constructores, va a haber como amalgamación de nosotros edificio de los mismos servicios que habríamos agregado aquí. Entonces de la misma manera que habrías dicho Servicios puntos y agregas esto y aquello. Podemos abstraerlo a este vaso. Y ahora solo lo llamamos, está del otro lado, así que lo verás a su debido tiempo. Entonces vamos a ser i siendo r dot add identity core. Y entonces estamos pasando en la clase de usuarios. Entonces una vez más estamos usando la clase de usuario personalizada API user, API, user, ¿verdad? Y luego abrir y cerrar corsé. Y solo necesito incluir a cualquier faltante o referir su objetivo. Y luego voy a tener mi lambda Tolkien donde se pueden personalizar ciertas cosas sobre lengua santa va, las interacciones del usuario, puedo establecer mis políticas de contraseña escritor. Puedo ver que todos los bussers más dígitos requeridos o tienen una longitud mínima, usan caracteres únicos. Todas esas cosas están ahí mismo, altough los paseos. No obstante, estoy más interesado en solo asegurarme de que mis usuarios, por lo que q-dot usuario y requieren correo electrónico único es cierto. De acuerdo, ese es el uno a uno. De verdad me interesa hacer cumplir la retiniana. No obstante puedes experimentar y puedes agregar los otros que creas que son necesarios. Entonces esa es la primera línea y luego voy a decir constructor es igual a nueva identidad. Por lo que la mayoría de los servicios vendrán con como constructor especial, GAS en Tías, todo eso. Entonces solo voy a decir constructor de densidad e incluir la referencia faltante. Ahí vamos. Tan nuevo constructor de identidades, Dame el constructor, correcto, así que ese es el objeto que acabamos de empezar, ese tipo de usuario. De acuerdo, entonces sea cual sea el tipo que se especificara, ¿Qué está busing ahí adentro, y luego teclear porque quiero usar rollos. Entonces de la misma manera que hay un usuario de identidad incorporado, hay un rol de identidad incorporado. Entonces Roland significa que eres administrador, eres usuario, sea lo que sea, eso es lo que significa el rol, ¿verdad? Y luego después de especificar esa fila debería estar ahí, entonces me pasan a los servicios de cobro de i. Objeto en forma de servicios. Después de todo eso, no voy a decir puntos constructor. Y tenemos que decirle dónde debería estar almacenando son cuáles necesidades son necesidades básicas con las que interrumpir para que los Servicios de Identidad al esposo. Entonces voy a decir el contexto base, ¿no? Entonces el contexto DB que estamos usando como nuestra base de datos, estamos pasando en el objeto coincidente para eso. Y una tierra más a proveedores de tokens por defecto. Yo sí dije que más adelante estaremos usando el libro de Tolkien con oficiales los bits Tolkien. Sólo estoy poniendo todo eso ahí. Entonces solo por contexto, una vez más, este objeto constructor realmente solo está diciendo, estoy construyendo todo lo que hay que hacer top para agregar a los servicios. Eso es más o menos lo que hemos estado haciendo todo este tiempo. Entonces aquí dijimos Servicios, puntos, y sumamos todas estas líneas y opciones en curso no parecen cosa sería una política central y así sucesivamente. Entonces ahora que hemos extraído, extraído todas estas líneas. Entonces este método o para discutir y este método puedo saber en inicio ver Servicios punto en la autenticación porque eso es lo primero que necesito agregar, la autenticación. De acuerdo, hay autenticación en el núcleo también, pero estoy usando en la autenticación de ellos tenía algún problema con ese hasta ahora, así que me quedaré con él. Y luego diré servicios, configurar la identidad. Muy bien, bonito y sencillo. Por lo que los servicios no configuran la identidad es básicamente lo que acabamos de hacer aquí. Para que puedas empezar a mirarlo de esta manera en cualquier momento tengamos que añadir algo a la startup, si no es el único liner como este, tal vez podamos empezar con afín para extraer estas cosas a ese archivo y tener el constructores para enviar sobre el objeto siempre que se le llame. De acuerdo, no es el fin del mundo, pero a diferentes personas les gusta ver cosas diferentes. Por lo que algunas personas, yo incluido, a las que no les gusta ver hinchadas arranca archivos. Y al menos cuando se tiene tanto código, hay que estar desplazando por enemigo un pergamino más allá de la configuración en cinco veces y 40 darse cuenta de que estaba allí. Esas son las cosas pueden ponerse molestas cuando tu, tu aplicación en crece. Entonces solo te estoy mostrando una forma de que puedes obstruir demasiadas líneas de código desde tu sección de configuración y tenerlo en un espacio muy confinado. Entonces ahora hemos hecho todo eso, y hemos hecho toda esa configuración. Lo que queremos hacer es hacer una migración a ninguna parte con AGREGAR las tablas para la identidad, señor. Entonces lo que vamos a hacer es decir Dash Migration. Conocemos esta parte, dicen usuario agregado se agregan identidad. Simplemente lo pone de esa manera agregó identidad. Y una vez que hacemos eso, llegamos a nuestro archivo de migración. Entonces ahora cuando miras a través, ves los diferentes nombres de tabla que tenemos la tabla de intervalos ISBN, tenemos es tabla de usuarios de maní. Y si miras muy de cerca, ves que además de todos los campos por defecto que vimos antes, también tenemos los personalizados que se añadieron al gas. Muy bien, Nombre, Apellido. Por lo que se va a reventar y todavía se va a poner en nuestros campos personalizados. De acuerdo, justo de la misma manera y las reglas. Y si quisiéramos más información sobre filas hechas esto, podríamos haber agregado una clase personalizada, extendido su, y hubiera sido lo mismo. Entonces sigamos adelante y actualicemos nuestras necesidades obesas. Y con todo eso hecho, hemos terminado nuestra configuración para nuestros servicios de identidad. Para que te puedas dar una palmadita en la espalda. No obstante, la mayor parte de lo que hemos hecho está en segundo plano. Si usted en evidencia tangible de que algo se está haciendo, siempre puede revisar su base de datos y verá las tablas que se han generado en consecuencia. De acuerdo, pero nuestro siguiente paso es realmente configurar los endpoints de tal manera que los usuarios puedan hacer posible la inflamación y se registren como usuarios de nuestra API y también para que ellos inicien sesión. Y luego después de eso, hablaremos de cómo seguimos verificando que este usuario debe tener acceso después de que lo hayan amado. 25. Registro de usuarios Endpoint: Porque bienvenido de nuevo. Por lo que vamos a continuar nuestro viaje para configurar nuestra autenticación para nuestra API. Y estaremos configurando este endpoint para el vagabundo del usuario, una distribución y para iniciar sesión y por autenticación de extensión. No, ya tipo de engaño y seguí adelante y configuré el nuevo mando para que puedas pausar y seguir adelante y te pongas al día, ¿verdad? Podrían controladores pero crea un controlador nuevo que está en blanco y lo llaman un controlador contras. Y ya me adelanté y como que empecé a hacer mis inyecciones. Por lo que 2 años familiarizados con usted estaría viendo por primera vez. Entonces ya conoces al logger y al mapeador, así que no necesito explicarlos con ningún gran detalle. No obstante, estarías viendo administrador de usuarios e iniciar sesión potencialmente por primera vez. Estas son dos bibliotecas incorporadas cortesía del núcleo de identidad. Por lo que cuando los escribas, es posible que quieras incluir la referencia que falta y verás que empiezan a aparecer arriba. Ahora nota el contexto para el administrador de usuarios y para el administrador de inicio de sesión es usuario API son cualquiera que sea la clase de usuario personalizada que habrías usado cuando estabas configurando la identidad. Si no usaste uno, entonces continúas usando usos de identidad. Entonces, cualquiera que sea la clase que sea que te sientas como tu contexto en tu configuración, y ese archivo de configuración estaría aquí. Cualquiera que sea la clase que te sientas ahí, sigues usando esa aplicación de garganta. ¿ Está bien? Por lo que user manager nos da acceso a un montón, nuestro conjunto de funciones que nos permite gestionar, iniciar sesión, recuperar la inflamación del usuario, me gustaría usuarios. Por lo que no queremos tener que escribir ningún código personalizado para estar agregando o no tengo que ir y poner en ninguna unidad de funciones de trabajo para usuario, La interacción de la tabla de usuarios son relativamente interacción. Todas esas cosas salen de la caja con el uso del dinero, solo tienes que iniciar sesión gerente y tienes otra llamada Gerente de Reglas. Si necesitamos usarlo, entonces lo haremos. Pero sólo soy el adolescente o la mayoría de esas cosas están encapsuladas en estos servicios los cuales pueden inyectarse fácilmente en nuestra aplicación. Entonces ahora que tenemos configurando nuestro controlador e inyectamos todo lo que necesitamos, necesitamos empezar a escribir nuestros endpoints son primero, endpoint va a ser para el registro. Entonces se va a ver algo así. Público asíncrono, tarea, acción y resultado. Y el nombre es registro. Para el registro, ya que vamos a estar requiriendo datos potencialmente sensibles, no será potencialmente requerir nombre de usuario, contraseña, etcétera. No quiero enviar eso a través de la tubería en el parámetro. Por lo que discutimos eso en el video de visión general donde te veré en eso. Usar el parámetro está bastante bien cuando es algo así, solo una identificación y nada para represar, ¿verdad? Pero luego cuando llegues a pedirle al usuario que se registre y envíe información sensible, no quieres simplemente empezar a ver correos electrónicos de cadena, contraseña de cadena, etcétera. Porque entonces todo se encontraría en realidad en texto plano hacia el punto final. Entonces lo que vamos a querer hacer es hacer de este un post. Entonces nosotros, hemos hecho trabajo con el verbo GET. No hemos hecho mucho trabajo ni ningún trabajo con el puesto. Entonces una publicación, al igual que cuando estás enviando un formulario en internet, cuando haces clic en Enviar para ir a, digamos regístrate en Facebook o regístrate para algo en línea. Si miras en la URL arriba, no ves ninguna de la información que aparece en la lista. Simplemente sabes que tu información dejó una página y supuestamente fue a algún lugar y el pH delta podría representar que es, eso es lo que es la post operación. De acuerdo, entonces el mensaje está encapsulado y algo oculto de miradas indiscretas. Cuando lo hacemos lo recibo se envía a través de cuatro implantes sitio, igual que lo que vimos aquí. Entonces no hay razón para atarlo. Entonces por supuesto cuando India con información sensible, no quieres usar una guitarra, nada que no atara la inflamación que se está enviando a través. Entonces con eso considerado, el parámetro que vamos a utilizar aquí va a ser un costo en uno. Entonces voy a poner una anotación para decir obtener la información del cuerpo. Por lo que el remitente necesita enviarlo en el cuerpo a diferencia de en la URL y el cuerpo de la solicitud. Y luego podemos especificar un tipo de datos que debe tomar la información. Entonces voy a decir que el usuario detallado soberano crea un detalle de usuario hasta el momento, pero sólo voy a decir detalle de usuario. Está bien. Entonces sigamos adelante y crea este usuario dto. Y luego explicaría por qué no puede funcionar así. Por lo que en modelos hacemos clic en Agregar clase. Estamos llamando usuario necesidad TO. Y entonces el detalle del usuario necesita tener como mínimo los mismos campos que necesitamos para volver a nuestro usuario de la EPA. Y dos, necesitamos que el usuario proporcione. Entonces así es como estoy diseñando mis detalles de usuario. Pueden pausar, replicarlo, pero te voy a guiar a través de que es de todos modos, así que FirstName, LastName al registrarse. Sí, la opción de pasar esos dos campos. Aviso dije opción porque estoy sentado ni como se requiere. Tenemos el número telefónico. Entonces si quieres contra industria o número telefónico cuando zona, solo diciendo para la API, una vez más, no se requiere. No obstante, definitivamente se requiere correo electrónico y definitivamente se requiere contraseña. Y luego para el correo electrónico en realidad estará usando esto como el nombre de usuario también. Entonces si tenemos este detalle, como de costumbre, tenemos que asegurarnos de que nuestro mapeador sepa del dto. Entonces inicializador mapper, solo voy a seguir adelante y ver a ese usuario APA. Y el usuario dto necesita conocerse el uno del otro y revertir el mapa, ¿de acuerdo? Y así es lo que haremos. Entonces el propósito del from body aquí es ver que cuando, cuando solicito llegue a este punto final, buscarás en el cuerpo de la solicitud, no mires en la URL. Entonces uno, no estoy requiriendo nada en la URL. Y dos, si el usuario pasa algo en la URL, no me importa. No busco ninguna inflamación en la URL. No obstante, el cuerpo de la solicitud debe contener información con campos que mucho al usuario dto. Por lo que envían más información de la que necesito. Se va a ignorar. Pero como mínimo, deben mandar estos a para que yo lo procese. Entonces eso es así que todo tipo de vinculación cuando hablamos de desinfectar las peticiones y tomar decisiones basadas en lo que viene a través de la tubería. De acuerdo, entonces volvamos a nuestro controlador de conos. Y luego lo que queremos hacer en este punto, y podemos hacer una serie de cosas. Entonces voy a primero, tendencia amó intento de registro NC entró para y me copié en Piazza, eso es un poco repleto de mí mismo. Pero digamos intento de registro para el usuario dto, dot email. De acuerdo, entonces sea cual sea el correo electrónico que haya entrado sobre el usuario dto, eso es lo que estoy poniendo ahí. Entonces también voy a comprobar si el estado válido, si no es un estado válido. Por lo que puedo ver si los modelos. Entonces esto es todo lo que verificamos formularios, ¿no? Si lo haces, si has hecho MVC y mareado o simplemente aprendiendo API, es más o menos el mismo proceso. Estamos buscando ver si el estado de modelos es válido, ¿verdad? Por lo que en este punto probablemente diría si no es válido, entonces fui a devolver una mala solicitud. Entonces eso significa que enviaste una solicitud de registro, pero tu campo de validación,para pero tu campo de validación, que no incluyeras el email que no incluyeron o no cumpliste con los estándares que te hubiera presentado respecto al datos que debiste enviar, ¿verdad? Y entonces puedo devolver el estado modelo para que tipo de informe al remitente lo que salió mal. De acuerdo, entonces si los modelos state no es válido, entonces hacemos eso. De lo contrario, podemos proceder a intentarlo. Tan solo prueba top, top, captura esa excepción. Entonces permítanme que me ocupe de la excepción. Partes de ella donde voy a ver flecha de registro, algo salió mal en esa sección de registro. Y luego en tiempos anteriores, ¿qué hicimos? Regresamos con un código de estado 500. Entonces otro tipo de retorno que puedes hacer cuando hubo un problema es literalmente problema de retorno. Y pones el mismo tipo de mensaje. Para que pudiera poner algo salió mal. Está bien. Y luego dile que tiene un puntaje de estatus de 500. Entonces solo te estoy mostrando que hay diferentes formas, ya sabes, si estás mirando otros recursos, puede que me veas hacerlo de esta manera y alguien más regresando nuestro problema, alguien está devolviendo el código de estado manualmente. Hay diferentes formas de hacer esto, ¿de acuerdo? Pero entonces para los que están incorporados y ya le dieron un metodo lo he generalmente te animo a que solo uses esos. Por lo que nos hemos ocupado de las malas situaciones. Yo sólo quiero decir que si no está bien, haz esto. No, ¿qué hago cuando está bien? Uno, puedo decir que el usuario var es igual a mapper dot mop en usuario API. Y luego estoy mapeando detalle de usuario. Entonces dirá, vale, mucho todos los campos que ya conocemos. Sabemos cómo funciona el mapeador por un nulo. Y luego saber que tengo al usuario. Puedo decir que los resultados var es igual a. Y fui a nuestro peso, nuestra llamada a mis puntos de gestor de usuarios. Y luego aquí está, aquí hay un montón de funciones. Como dije, podemos hacer una serie de cosas. Puedo decir crear una escena. Por lo que el administrador de usuarios crea un fregadero, y luego simplemente pasaré los objetos de usuario. De acuerdo, así que adelante y crea ese usuario. Automáticamente lo llevará a la contraseña, lo hash, lo almacenará, hará todo lo que tenga que hacer. No teníamos que escribir ninguna lógica compleja para realmente facilitar eso, ¿verdad? Pero entonces a veces las cosas fallan. Entonces voy a decir, si no resultado, no tuvo éxito, ¿verdad? Entonces te dirá, ¿tuvo éxito no lo son, entonces también voy a devolver una mala petición. Entonces voy a decir que algo salió mal. Esta vez. No son las modelos, la cosa. Probablemente sea solo una flecha. Entonces la cosa es que el objeto resultado realmente te da las flechas. Si realmente necesitas enumerarlos todos, probablemente puedas ponerlos en un bucle, listarlos, ponerlos en una cadena y devolverlos si quieres, si quieres darle al usuario ese detalle. Pero a veces esos detalles pueden ser demasiado sensibles, así que hay que tener cuidado con qué información estás enviando herramienta de Bach, los clientes que llaman, ¿verdad? Por lo que en este punto, sólo voy a ahorrar las solicitudes de batería. Era un 400. Y es porque el usuario o distribución en campo, eso es todo lo que necesitas saber. Así que inténtalo de nuevo más tarde porque esto podría haber sido culpa mía. De lo contrario, si se quiere, como algo serio les habría dado un 500s y todo. Es de nuestro lado donde está el problema, y si es que envías datos incorrectos, entonces te estoy diciendo lo que es incorrecto porque un lema afirma enumerará que grita. De acuerdo, y eso es más o menos para el padrón. Ahora como hemos hecho el registro, creo que bien podríamos hacer el login porque aunque no hay forma real de probar nuestro registro de inicio de sesión estadístico. Entonces, en realidad solo voy a copiar y pegar este código justo debajo. Pero lo que tenemos que hacer es cambiar el nombre de la acción. Por lo que esta es una acción de inicio de sesión. Estamos usando el mismo usuario necesidad TO fueron tomados de la misma URL, del mismo cuerpo, lo siento, ignorando cualquier cosa que venga en la URL. Y entonces lo que vamos a hacer es decir intento de inicio de sesión para este usuario. Si no es válido, una vez más, restricciones de validación, correo electrónico, contraseña. No. Algo que quizá queramos considerar es, ¿necesitamos el mismo dto o debemos usar el CMB TO para iniciar sesión y registrarnos? Mismo principio con los demás detalles, ¿verdad? Porque para un login no necesito tu nombre, apellido, número de teléfono. Solo quiero tu email y contraseña. Entonces lo que voy a hacer aquí es rápidamente sólo hacer clase para decir login ETO. Y fui a tomar estos dos campos, poner sólo el login porque es absolutamente necesario Far login stuff. Pero entonces dejo que esto herede de los inicios de sesión. Por lo que los campos se comparten a través del tablero independientemente. De acuerdo, así que no debería llamarlo usuario de inicio de sesión. Ahí vamos. Deja saber a mi mapeador que es una ola y el mapeador, No, realmente no necesito dejar que el mapeador sea conocible este porque la operación va a ser ligeramente diferente. Entonces dejaré detalle de usuario en el Mapper, pero no pondré éste y te explicaré por qué. Por lo que iniciar sesión detalle de usuario. Entonces, una vez más, esta es otra parte de la seguridad cuando desinfectamos exactamente lo que queremos. Porque si el usuario pudo haber incluido malicioso, lo siento, el cliente no se le grita al usuario enviando la solicitud. El cliente que envía las solicitudes podría haber incluido inflamación maliciosa en el cuerpo de la solicitud. Al hacer esta parte aquí, estoy diciendo que solo busco campos que coincidan con lo que todos tengo alineados en este dto, diga esto Y más información de la que necesito. Se va a ignorar de todos modos. Entonces esa es otra parte de las consideraciones de seguridad a la hora de crear API. Por lo que obtenemos el usuario de inicio de sesión dto. Y luego para el login, está bien, bueno, lo validamos. Está bien, bien. Entonces revisamos el estado de los modelos y luego lo que voy a probar. Entonces nada mucho más que cambiar aquí excepto tal vez los mensajes de registro como para asegurarnos de que estamos representando con precisión donde vio Twin erróneamente. De acuerdo, así que bajo el trie, lo que vamos a hacer, no necesito hacer ningún mapeo, así que déjame solo quitar lo que está en intento y empezar de cero. Voy a decir que el resultado var es igual a, y aquí es donde usamos las contraseñas de punto de inicio de sesión firmando un fregadero. Entonces lo ves e incluso puedes hacer un cheque. Se puede comprobar para ver si la contraseña se cargaría las ráfagas Australopithecine y por supuesto que eso dirá sostuvo la situación en este punto. Porque en realidad queremos firmar, ¿verdad? Por lo que el inicio de sesión es ver toma dos sobrecargas. Podemos pasar en todo el objeto de usuario. Acabo de tomar todo el mapeo y la contraseña. O podemos elegir simplemente poner el nombre de usuario y la contraseña, que es la que voy a usar. Entonces ya ves que soy las dos opciones. Entonces si los manteníamos levantando pasará en todo el objeto de usuario así como la contraseña. En este caso, eso es wiki sin embargo. Entonces solo diré usuario dto dot, y estamos usando la dirección de correo electrónico como nombre de usuario y contraseña de usuario dto dot. Y entonces es por ayuda. Entonces leamos lo que es la persistencia. Dice bandera que indica si la cookie de firma debe persistir después del cierre del navegador. No. Yo esto es una API. No sé a qué tipo de aplicación está llamando. El API podría ser cartero. Podría ser el navegador, podría ser una APP móvil. No necesito persistir nada, así que voy a decir falso. De acuerdo, y luego la última, la falla de Lacan, no quiero encerrar a nadie cuando no logren iniciar sesión sería demasiado de una sobrecarga administrativa. Una vez más, el contexto lo es todo, pero esto es lo que nuestro código de inicio de sesión bucles luz, ni el resultado va a ser un objeto similar al intento de registro. Por lo que solo podemos decir si los resultados lo lamentan, si no, resultan no exitosos o lo lamentan, esto es asíncrono. Entonces cuando no logramos poner en la espera, entonces el resultado de que vamos a sacar estas tareas de tipo, no del tipo que estamos esperando. Entonces déjame asegurarme de ponerme Dewitt. Y entonces cuando haga eso, verán que el intellisense me da lo que yo esperaría. Entonces si no tiene éxito, permítanme solo revisar dos veces lo que hicimos cuando no tuvo éxito aquí. Entonces decimos, decimos mala petición en la parte superior. Pero si no tiene éxito, intento de inicio de sesión, no es necesariamente una mala respuesta fue yo sólo diría que son mala solicitud o el hotel diría que no está autorizado. Correcto. Que es un para 01 si no me equivoco, correcto, no autorizado. Y probablemente pueda simplemente devolver el detalle del usuario para ver esto es lo que intentaron usar. No está autorizado, lo siento. Está bien. De lo contrario, si se pone este fuego, eso significa que todo está bien. Por lo que sólo regresaremos. Podría regresar. Está bien. He usado aceptado en el pasado, cierto. Entonces cualquier cosa con un 200 en el rango 200 sería visto como un bien. Respuesta. Entonces OK. Al igual que 200 has creado cuál es yo creo herramienta para sí, he aceptado lo que se piensa etcétera. No tienes que preocuparte por memorizar estos códigos necesariamente. ¿ Sabe que en situaciones particulares se quiere utilizar este o no tratado. ¿ Está bien? Entonces así será nuestra función de inicio de sesión. Y está bien, he hecho un cambio. Esto no arte. Entonces vamos a todos, el padrón está viendo que no todos los caminos de cotización, retorno de o.Es por eso que lamento tanto haberme perdido este nodo uno. Entonces recuerda que siempre tienes que tener un fan otros retornos. Entonces de la misma manera que dijimos que te quedas en Windows, este lo que regresará aceptado después, después de hacer eso aquí. Entonces puse retorno aceptado arriba arriba también, ¿verdad? He aceptado su intento de registro y entonces eso se hace. No. Antes de pasar a las pruebas, quería traer algo muy importante a su atención y esas son las consideraciones rutinarias para este endpoint donde establecía que la regla sería el controlador api slash, en este caso, conos de slash API. En tiempos anteriores que dicen el controlador del hotel, habríamos determinado que no podemos tener dos operaciones de get idénticas. El nombre de la acción es irrelevante, pero no puedo tener dos operaciones. Cómo ser verbos idénticos, el verbo puede ser el mismo, pero entonces debe haber algún matiz a una implementación del verbo del otro. En esta situación, tengo ambos como post. Ambos son post. Una vez más, el nombre aquí no importa lo que sean ambos posts también, lo que significa que si intento hacer alguna operación post va a dessaber cuál usar. Ambos son un poco idénticos en cuanto a lo que esperan. El único modo en que realmente puedo diferenciar entre estos dos es darles sus propias raíces, ¿verdad? Por lo que puedo decir que la raíz para el registro es el registro. ¿ Está bien? Y entonces el camino para un login es login. Para que nosotros, en este punto, la única forma de golpear el registro es decir servidor slash api slash slash slash register. A modo de solicitud de post. A pesar de que sí hit login es ver cualquier slash api slash o colon slash login. Por lo que estoy especificando que una ruta para este endpoint es login y este es registrar. Ahora nosotros, ellos pueden tener verbos idénticos, pero debido a que hay diferentes ubicaciones, no se interferirán entre sí. De acuerdo, así que esto fue, eso es tratar de registrar a un usuario muy rápido. Entonces, ¿qué comprobamos viejo, qué jadeo ha generado para nosotros no anexa nada a su convocatoria de identificación aquí y necesito allá. Ellos lo son. No post, no consigue, correcto. Y luego si me expando, me mostrarán lo que necesita el objeto. El look como nuestro Chan parecía cuando se está viniendo a través de la tubería. De acuerdo, solo para los mismos para iniciar sesión. Entonces se ve la diferencia. Recuerda que tenemos dos detalles diferentes. Este tiene contraseña de correo electrónico y los campos personalizados. Este. Se necesita correo electrónico y contraseña. Entonces eso es lo que estaba diciendo, que cuando en una situación en la que no se necesita toda la información que se crea, necesito ceder para limitar exactamente lo que se necesita en esa situación. De acuerdo, así que intentemos con el intento de registro. Entonces voy a dejar ese correo electrónico. Voy a poner en alguna palabra de autobús que tenga personajes y un número. Y fui a dejar todo está en blanco porque todo lo que realmente necesito nuestro email y contraseña, sin embargo, dejar estos como están, literalmente van a ir por encima como String, String y número de teléfono. Entonces veamos qué pasa cuando hacemos clic en Ejecutar. Es, este intento me está dando un error 500. Por lo que esta hubiera sido una de esas exenciones atrapadas en él diciendo que no puede resolver un servicio en particular para el monitor de inicio de sesión. ¿ Está bien? De acuerdo, entonces el encargado de inicio de sesión está renunciando a problema y me gustaría entrar y solucionar problemas. Pero cuando estoy pensando es realmente no necesito el administrador de inicio de sesión para esta API. Y te voy a explicar. Entonces cuando puse san en manager y lo inyecté y todas estas cosas, fue porque eso es como una reacción de rodillas tirón. Siempre que tengamos autenticación que hacer, queremos todas las bibliotecas que puedan ayudar con la autenticación. ¿ Está bien? No obstante, en el caso de una aplicación web donde alguien enviaría un intento de inicio de sesión a través de un formulario, haga clic en Enviar, y luego se les diga que se les permite entrar a través de algún mensaje o alguna indicación que diga hola nombre de usuario. Eso es realmente el San in manager creando algo así como una sesión o una cookie basada en la configuración para administrar esa sesión de usuario. En cuanto a una API, no estamos dispuestos a estar manteniendo una sesión para nuevo usuario. Sí, su padrón, ¿qué? No sabemos cuándo vas a estar llamando a la API pulmón entero. Y no es como si fueras a ser un persistente dentro de la API para 1R pocos causa el eBay va a aceptar tu solicitud, da tu respuesta sobre ser terminado. Por eso estamos usando el de Tolkien. Entonces no quiero ponerme demasiado, una vez me pegue y empiezo a discutir el de Tolkien. Pero debido a los Tolkien's, realmente no necesitamos al gerente de inicio de sesión en el sentido tradicional de lo que hace el gerente de Sign In. Por lo que voy a eliminar todas las referencias al gestor de Sign In realmente. Y voy a comentar el endpoint de inicio de sesión para no. Entonces eso es control, casey, sólo un comentario. De acuerdo, así que realmente no necesito todo esto solo para que lleguemos. Pero sólo tengo que irme y me disculpo a veces estas cosas suceden. Pero oye, sólo vamos a comentar el código y luego lo revisaremos más adelante. Conoce como se relaciona con algunos de los mensajes de error que queremos enviar un Bock. Lo que voy a hacer aquí es especie de que tenía todo el lado de flecha de resultado. Verías podrías encontrar la manera de poner las flechas de resultados en un paquete y enviar a alguien a decir por cada error en resultados, errores. No dije que no pudiera ser información sensible. Entonces estoy aceptando ese riesgo. Pero voy a decir modelos estados punto y puedo decir agregar flecha modal, que luego me va a pedir nuestra llave. No tengo que poner la llave. Y luego voy a ver el error. Dots, lo siento, error siendo el mensaje que regresa del código de intento de resultado. Entonces esto es lo que hago. Pongo el código como la llave, ¿verdad? Y así la llave ahí o bien significa cuál es el nombre de la flecha. Y entonces la descripción básica estaría ahí mismo. ¿ Verdad? Entonces podemos ver mal intento de usuario de solicitud fallido o se sentarán el estado modelo porque ya es obvio que falló. Entonces así procederemos con los mensajes de error para nuestro registro en él. Por lo que vamos a probar esto una vez más. De acuerdo, así que usa swagger de piel de buey con todo el login y puntos. Pero vamos a intentar volver a poner mi complicada contraseña una vez más y luego se ejecuta. Está bien, y esto se ve un poco mejor. De acuerdo, así que primero no se estaban recibiendo ninguna queja sobre ningún gestor de usuarios o un servicio de TI que no se estuviera registrando. Eso es 12. Ver aquí ahora estamos recuperando un 400 y estamos recuperando algunos detalles ya que el reloj está equivocado. Por lo que en nombre de usuario válido, nombre de usuario, en blanco, en blanco no es válido y solo puede contener letras o dígitos. De acuerdo, entonces eso es porque hicimos un mapeo, pero sólo estamos pidiendo correo electrónico. El usuario de identidad real tiene que tener un valor de nombre de usuario también. Entonces lo que necesito hacer aquí es especificar el nombre de usuario puntos es igual a la dirección de correo electrónico, por lo que la dirección de correo electrónico es el campo requerido. usuario es un campo obligatorio y contraseña. Todos son campos obligatorios por el usuario de identidad. Por lo que iba a proporcionar correo electrónico y contraseña. Simplemente voy a seguir adelante y proporcionar el nombre de usuario. También, ¿qué es lo mismo que la dirección de correo electrónico? Está bien, así que intentemos eso una vez más. Muy bien, y cuando hago eso, y pongo los mismos detalles usuario en el ejemplo y contraseña uno, cuídense mientras obtenemos, obtenemos una respuesta 200. Está bien. Y simplemente nos estaba impresionando. Todo está bien para ir. Por lo que no ha fallado. No hay error de validación ni nada por el estilo. Noto que dice on documentado para la herramienta a la glucosa, no dejamos que el controlador ni dejamos saber swagger esa herramienta a es un tipo de retorno potencial. Entonces recuerda que lo hicimos con los otros controladores donde enumeramos todos los tipos de retorno potenciales. Por lo que puedes seguir adelante y replicar eso en el controlador de casa del Reino Unido, lo extranjero siempre Singapur, una distribución en proceso. Ya sabes, podrías estar decepcionado. No están llegando a probar el login uno todavía, pero realmente no es un login. Es más va a ser más como un d a menudo, una autorización para ver, vale, tú sobre Tolkien y es válido, sí, puedes acceder al recurso que quieras. Porque una vez más, un login realmente es crear una sesión y permitir el acceso de alguien por un periodo. tanto que lo que tomé con una API, no sabemos para qué periodo puede necesitar acceso. No necesitamos facilitarnos por un periodo más largo del que se necesita para tramitar su solicitud y darle su respuesta. Entonces solo queremos saber que eres inaceptable, accessor, valida eso, dale lo que quieres y luego terminamos contigo. Por eso estaremos haciendo los kits de herramientas. Por lo que cuando lleguemos, vamos a seguir adelante y hosho más pasillo restringir el acceso. 26. IMPORTancia: registro de usuarios Endpoint Fix: Hey chicos, un adenda rápida a lo que se hizo en la actividad anterior, sentados sobre un punto final de distribución y todo lo que funcionó. No obstante, cuando me di cuenta de que mi usuario no tenía contraseña y eso se debe a que no me puse esta pipa. Entonces si miras la función de usuario crea, tiene dos sobrecargas. Uno donde simplemente crea al usuario y otro donde te pide que el usuario y el pastor vayan con ellos. Entonces no estoy del todo seguro por qué sienten la necesidad de conocer a dos, porque para mí un usuario tiene que tener un bots de analizador, supongo que para diferentes situaciones, puede que necesite almacenar algo o no las otras. Entonces coma de usuario y luego del usuario necesita teal, tomamos la contraseña para que podamos asegurarnos de que cuando el administrador de usuarios cree ese usuario, esa contraseña también va a ser hashed y almacenada en su registro. 27. Añade rolos de usuario: Oigan chicos, bienvenidos de nuevo. Por lo que una parte muy importante del usuario autoriza a Sean es saber qué papel tiene este usuario en un pontón. No, no hemos hecho nada asociado a roles, estábamos más ocupados con obtener la información del usuario, validarla y si creamos el usuario no lo son. Ahora cuando se trata de roles, los roles que se les permite existir en el sistema previo a que se utilice el sistema. Por lo que de la misma manera que habríamos configurado estas operaciones de siembra para hoteles en países de los mismos, menos importancia realmente que los roles serían así para asegurarnos de que el lado rural ahí desde el principio para que cuando los usuarios comiencen registrándose, las reglas ya están ahí. Entonces lo que queremos hacer es verlos, pero en cambio los sembraré de la manera en que vemos ese país y hotel. Te voy a mostrar una forma en que podemos abstraer esa operación desde contextos o dB y mantener los contextos DB lo más livianos posible, similar a Hollywood te ha demostrado hacer eso con nuestros servicios que estamos instalando. Entonces lo que voy a hacer es configurar una carpeta nueva, tener configuraciones están en m Solo voy a seguir adelante y agregar otra carpeta dentro de eso y voy a llamarla es entidades. Entonces configuraciones para cualquier cosa que esté relacionada con su entidad. Y luego voy a añadir una clase. Y luego quería llamar a esta configuración de rol de clase. Adelante y agréguelo. Y luego esta regla clases de configuración heredan de I configuración de tipo entidad. Y será del tipo, luego EL papel. Muy bien, sigamos adelante e incluimos cualquier referencia que falte. Por lo que no golpea la configuración rural o que haya sido para asociarse con ese tipo de configuración. Y por supuesto tenemos que seguir adelante e implementar lo que sea que esto esté viendo necesita ser implementado, que es nuestra función de configuración. Está bien, así que también hay una vez que tienes que entrar en posible o el constructor de costura que está en uso en la creación de modelado. Entonces podemos realmente replicar el código que tenemos donde decimos punto constructor tiene datos. Y entonces en lugar de Builder dot tiene datos, podemos seguir adelante y crear nuevos roles, objetos neuronales. Por lo tanto, permítanme sólo seleccionar todas estas comillas. Muy bien, así que nueva regla de identidad. Y sólo vamos a inicializar este objeto. No le voy a dar una identificación, identificación zona asombrada, el nombre que se llama a este usuario. Y tenemos que dar su nombre no normalizado, que en realidad es sólo versión en mayúscula de eso. Fuera del nombre realmente. Y luego. También le voy a dar administrador administrador, eso es administrador construido. Y entonces lo normalizado es todo CHEOPS, versión de ministerio, puerta, agregar ministerio. Siempre es mesure los giros derechos de gastado agradable depuración pero hechizos, así que no me lleven. Está bien. Entonces no es que tengamos este método de configuración y tantas filas como creas que puedas necesitar, puedes seguir adelante y configurarlas. Pero las partes más importantes de todo eso es cuando estamos listos para ponerlo en el sistema, sólo necesitamos decir constructor, puntos, aplicar. Lo sentimos, construir dir dot, configuración de mosca. Y entonces sólo voy a decir una nueva configuración de roles. Y luego incluir la tienda de refrencia faltante sabía que Lee creó. Y ahí vamos. Entonces ves que a mí me parece mucho, eso se ve mucho más ordenado que tener todo esto. Recuerda que la razón por la que lo movimos desde arriba aquí arriba la lista fue que era tan enorme una función porque un seguir estas líneas. Si lo desea, puede hacer una pausa, saber bien, e intentar construir otros archivos de configuración para country y hotel. De acuerdo, así que espero que realmente lo hayas intentado porque yo lo hice. Está bien. Entonces no te voy a pedir que hagas nada. Yo no voy a hacer. Entonces por si acaso necesitas alguna orientación. Seguimos adelante y creamos archivos de configuración por tipo. De acuerdo, entonces tenemos a Holton, soy DE país y donde sea todo Así creamos, rodamos juntos. Yo sí país, mismo nombre básicamente podría copiar y pegar código y asume partes esenciales configuración contra que yo entidad tipo configuración relativa al país, el contexto. Y luego el mismo código que estaba ahí para crear los países que acabo de cortar y pegar. De acuerdo, lo único es que en la anterior teníamos constructor punto en t, algo así y me quité esa parte de entidad. Por lo que dice construir sus puntos tiene datos para que puedas seguir adelante y replicar eso tanto en el país como en el hotel. Y si estás haciendo lo tuyo a través de cualquier otro y no, estás en la construcción de modelos. Se ve mucho más limpio. Está bien. Y creo que sólo voy a poner este. Yo realmente no conseguí mucho como donde en cuanto a la orden barcos fuera de nosotros lo pone al fondo. Y ya que ese es el orden en el que todo se estaba creando de todos modos, así país, después hotel, entonces tenemos las reglas. Una vez más, estos dos son realmente opcionales en cuanto lo que realmente se necesita para poner en marcha una aplicación, ¿verdad? Entonces ahora que tenemos la configuración de rol están sembrando, podemos simplemente agregar migración y decir reglas por defecto agregadas. Y, y archivo de migración resultante tiene dos entradas en nuestro archivo de reglas. Por lo que ves generado su propio ID. Por eso no quise modificar eso. Pero luego conseguimos usuario y obtenemos al administrador. Por lo que cuando hagamos actualizar base de datos, va a seguir adelante y hacer el inserto. Entonces una vez hecho eso, tenemos otros dos cambios que hacer. Entonces uno está en el detalle del usuario. He introducido esta colección de tipo string y estoy llamando a sus roles, ¿verdad? Entonces le estamos dando al usuario la oportunidad de decir qué rol o roles debe tener esta persona, ¿verdad? Y luego en el controlador del cono, justo después de haber comprobado si el intento de registro fue exitoso o no, son la operación de creación del usuario fue exitosa o no. Recuerda si va más allá de eso es afirmación, significa que fue exitoso. Después hicimos el paso extra de decir usuario manager dot, dot, add roles async. Y estamos agregando al usuario que acaba de crear, el rol que entró, nuestros roles que entraron. Entonces si miras esto, tiene algunas anulaciones. One over ad permite o no solapar sobrecarga, lo siento. Por lo que el único overlord te permite simplemente pasar en una lista de roles. Y eso es todo. Simplemente lo reproduciremos y lo agregaremos a este usuario. Entonces una vez que todos existen, entonces se asociará con el usuario en el back-end. Una vez más, función incorporada, no se necesita mucho código o esfuerzo en nuestras partes. Tomemos esto por nuestra velocidad. Entonces en swagger, ves que están modificando los valores potenciales, ¿verdad? Para que lo estén mostrando. Puedo pasar en una matriz llamada reglas. Entonces la ironía son los corchetes, mientras que un objeto es la llave rizada, ¿verdad? Entonces vamos a probarlo. Y voy a dejar a este mismo usuario no parece usarlo fuera. Tenemos éxito con la última vez. Muy bien, entonces eso significa que debería obtener algún mensaje de validación para ver que no debería funcionar lo que voy a pasar en el rol de usuario y cuándo ejecutar. Y entonces esto es lo que estoy obteniendo. Entonces el resultado es que tengo una solicitud 400 mala. El correo electrónico duplicado es el problema. Ya se toma para que la validación esté funcionando. Entonces vamos a ver. Usuario en hoteles. Hotel listing.com hace algo diferente. Y ese es el usuario. Entonces seguiré adelante y ejecutaré. Y lo que estoy obteniendo no es una mala respuesta. Está bien, eso se ve bien. Entonces veamos qué pasó en la base de datos después de esas operaciones. Entonces voy a matar la ejecución, entrar al Administrador de servidores. Y En primer lugar, quiero buscar en la sesión de tabla de usuarios de al menos dos usos basados en mis pruebas hasta el momento. Y ahí vamos. Tenemos USA, listado total y usuario a ejemplo. De acuerdo, así que eso está bien. El siguiente serían los roles. Por lo que acabo de andamiar las reglas yo mismo. Yo sólo veo entonces la regla está dentro. Entonces estas son las reglas que hemos creado. No obstante, la asociación de roles de usuario se almacena aquí porque es un muchos-a-muchos. Entonces están viendo que muchos usuarios podrían tener muchos roles, ¿verdad? Entonces por eso cargamos un aria, porque tal vez un usuario podría ser administrador y usuario, tal vez un supervisor, etcétera, etcétera, basado en un sistema. Todo son contextos, ¿verdad? No obstante, en esta tabla, cuando vemos los datos, entonces deberíamos ver el ID de usuario asociado al ID de rol. De acuerdo, así que si solo volviéramos y revisáramos dos veces, ya ves que este es el ID de usuario. Ahí vamos. Y el ocho, f, siete. Entonces si miro ese mismo ID de usuario y siendo si siete y el rol 755. Por lo que hay que ir a este para ver cuál es el 755, cuál es el usuario. Entonces es todo lo que empezamos a integrar la autorización basada en reglas en nuestros sistemas y en todos nuestros usuarios. Cuando se registren, nos registraremos con sus roles apropiados. 28. Explora JSON Web de Token de JSON® (JWT): Oigan chicos, bienvenidos de nuevo. Entonces Randall, Queremos empezar a discutir nuestros tokens web JSON, pero antes de seguir adelante e implementarlos y estamos en montañas de hermoso código. Para ello, quiero vender una comprensión completa del propósito que sirven en todo el flujo de trabajo, la seguridad de la API y todo. Por lo que hay una autoridad líder, al menos en mi libro, son autoridad líder en forma de auth 0. Si no me equivoco, probablemente haya pioneros para este tipo de protocolo. Pero puedes ir a JWT dot IO y aterrizas en la CMP es que tengo aquí donde te exhiben algún puesto Tolkien y tipo de mostrarte el desglose. Entonces vamos a discutir exactamente por qué los de Tolkien son innecesarios y qué exactamente dicen básicamente cuándo, cuándo están siendo decodificados. Entonces veamos. Una vez más, la persona intenta iniciar sesión en nuestra API, o intenta acceder a nuestro recurso desde nuestra API. Contamos con acceso restringido. Entonces les estamos diciendo que necesitamos saber quién eres y qué eres capaz de hacer. Pero entonces necesito asegurarme de que seas alguien que debería poder acceder a mi sistema para empezar, ¿no? Por lo que nuestro Tolkien aquí más o menos se les emitiría después de un exitoso intento de inicio de sesión. Por lo que pasarían por encima de su nombre de usuario y contraseña que ya tenemos almacenado en nuestro sistema porque están registrados. Una vez que verifiquemos que son, quiénes dicen que les vamos a dar un token con información que tenemos sobre ellos para que cuando estén haciendo solicitudes subsiguientes, puedan usar este token en lugar de intentar iniciar sesión cada vez. Por lo que este Tolkien representaría un silbido son algunas representación codificada de toda la información que tenemos para ellos que podría incluir su nombre de usuario, su contraseña, su contraseña, apologista, mcdr, su nombre de usuario, su dirección de correo electrónico, si son diferentes. Durante todo el tiempo les estamos permitiendo usar este token para acceder al sistema, qué papel tienen. Y este otro llamado reclamos, lo que significa que usted es capaz de hacer este lo que comienza en vibrar. Entonces esas son las cosas que codificamos en esta enorme cadena y les enviamos de vuelta después de que hayan iniciado sesión con éxito. O los beneficios de esto es que de su lado, no tienen que seguir llamando al inicio de sesión porque recuerden que no estamos manteniendo decisión de saber si se iniciaron previamente o no. Entonces en lugar de que tengan que intentar iniciar sesión cada vez que van a hacer una llamada API. Los de inicio de sesión obtienen este token y luego lo hacen más bien llamar con este token adjunto a sus solicitudes. De lado, cuando obtenemos la solicitud, entonces vemos que hay un Tolkien, lo decodificamos, valida que vino de nosotros y luego los redireccionamos en consecuencia o proporcionamos la respuesta en consecuencia. Entonces eso es lo que la seguridad JWT es todo un barco. Y verás que esta cadena es en realidad rojo codificado por colores. Creo que eso va a decir amor vendedor y sopló, ¿verdad? Y más o menos comer seis x1 es el explicado o aquí. Entonces esta es la sección de encabezado que contiene qué algoritmo de hashing se utilizó, así como el tipo de Tolkien, que en este caso es JWT. El apartado medio tiene la carga útil o los datos. Entonces la carga útil es realmente ver toda esta información es lo que sé de este usuario. Entonces, cuanto más información empacemos en ella, más grande será la sección. De acuerdo, y arriba a la derecha ven aquí te están mostrando es exactamente lo que está incluido en esta carga útil. Por lo que la carga útil puede haber led fecha de caducidad de la hora Tolkien o dayton, porque generalmente se emite un token por un periodo finito de tiempo. Entonces, mientras este token sea válido, entonces no quieren difícil volver a iniciar sesión, ¿verdad? Tan pronto como no sea válido, entonces pueden querer iniciar sesión y obtener nuestro token fresco y luego continúa. Entonces eso es lo que deja el propósito que uno sirve. Y entonces los piratas lo saben con la firma. Por lo general, el servidor utiliza la parte de firma para verificar si el Tolkien contiene una información válida o no. Entonces si emitimos el token y quisiéramos verificar que vino de nosotros porque cualquiera realmente puede codificar este tipo de datos. De lo que querían asegurarse de que tienen, no escuchen codificado relativo a nuestra clave emisora para asegurarse de que realmente vino de nosotros y es válido en nuestro sistema. Entonces espero que eso aclaró algunas de las, digamos que las zonas grises son lo que JWT no es consciente de usarlo. Cuando regresemos, comenzaremos a cambiar o configuraciones en nuestra API para facilitar su uso. 29. Implementar la autenticación de JWT: Muy bien chicos, regresaremos. Por lo que vamos a saltar directo configurar nuestras configuraciones para nuestro JWT. Por lo que voy a crear una nueva sección en nuestro archivo de configuración. Yo lo voy a llamar JWT. Y básicamente sólo vamos a codificar duro algunos valores que sabemos que necesitaremos en el camino a la hora de emitir y validar. Está bien, así que voy a decir emisor. Y esto significa que yo soy la autoridad emisora. Para que puedas poner tu nombre de aplicación o tu nombre de dominio, sea lo que sea. Sólo voy a decir la mayúscula en nombre aquí, OTA listado PA. Entonces eso significa sólo cuando un JWC JRR Tolkien entra con este tema o voy a prestar atención? De qué vas a ver más a eso más adelante. Y hay otras cosas que puedes poner aquí. Se puede poner en como los presets tiempo de caducidad. En realidad se puede poner una llave aquí porque hay un valor clave que se va a utilizar para liquidar a los Tolkien. No obstante, en términos generales, no quieres poner esa clave en el archivo de configuración de la aplicación por razones de seguridad, ¿verdad? Entonces si lo pones ahí, entonces alguien puede ver el archivo de configuración de la aplicación y luego averiguar la clave que se está usando. Yo estoy, estoy poniendo en un valle GUID aquí, pero esto fácilmente podría ser tu nombre o lo que sea. Entonces es algo que necesitas que quieres usar para verificar nuestro enero la clave. De acuerdo, así que alternativamente, en lugar de poner algo que es sensible dentro del archivo de configuración de la aplicación, porque no quieres demasiada información sensible en este archivo. Lo que podrías hacer es crear una variable de entorno. Ahora por supuesto, si crea su propia máquina de desarrollo, entonces hay que asegurarse de que creó también en el servidor cuando se despliega. Por lo que una forma rápida de traer el entorno o configuraciones o la variable de entorno es abrir un símbolo del sistema, medir el modo de administrador de orina. Entonces si es que esto ha sucedido en una máquina en el trabajo donde no tienes privilegios administrativos, entonces tienes que asegurarte de incluir esto en tus notas de la versión para que los administradores del sistema sean ingenieros de DevOps, quien esté haciendo el despliegue sabe qué hacer. Entonces voy a decir set x. Y una vez más, esta es una variable de entorno así que se divulga sobre el nivel de ventanas. Entonces, a menos que fuera un hacker, alguien malicioso fue capaz de acceder al real y entrar a la máquina que probablemente nunca verá este valor son el arte del esquí. Entonces voy a llamar a esta clave, darle el valor. Entonces, una vez más, esto simplemente no es bueno. Eso es lo que yo generé. Ya es bastante complicado. No necesariamente tiene que ser así de complicado. Pero una vez más, es un contexto lo es todo, ¿de acuerdo? Entonces, sea cual sea el valor que pongas ahí, solo asegúrate de envolverlo entre comillas. Déjame hacer eso. Por lo que clave abierta comillas el valor cerrar cotizacion barra m y m, básicamente diciendo que debe ser una variable de sistema y no una variable local. Entonces por eso lo necesitas. Asegúrate de que tu administrador, para que veas que se guardó. De acuerdo, alma y todo eso. Tenemos esa puesta en marcha. Podemos seguir adelante y crear nuestra extensión de servicio porque necesitamos extender nuestra startup. Entonces una vez más, en lugar de hacerlo aquí, simplemente pasaremos a las extensiones de servicio y crearemos un nuevo método. Este vamos a tener vacío público estático. Entonces voy a copiar esto sobre dos, a pesar de este bart y decir configurado dW t. Y entonces estamos tomando los mismos parámetros de los servicios. Pero entonces también estamos tomando configuración I. Es la configuración que nos da acceso a las configuraciones de ajustes de la aplicación todavía para Fred, para un pequeño contexto de eso. Cuando nosotros, déjame ver. Entonces ven aquí dijimos configuración, obtener cadena de conexión, hi configuración, ¿verdad? Entonces a eso estamos referenciando por aquí. He estado figurando mostrado. Entonces adelante y en fluido todo lo que falte. Y luego dentro de este archivo es donde va a suceder bits fuera de la magia. Entonces vamos a decir var configuración JWT es igual a. Y luego voy a llamar a la sección de configuración dot get. Y la sección que vamos a estar recibiendo son las plantaciones JWT. De acuerdo, entonces eso es lo que me deja sólo verificar eso. Ah, son apologistas de JWT. Yo lo llamo JWT. Está bien. Esto es dar una flecha y creo que es porque incluí alrededor con bibliotecas para que maduren, eso es Nuevamente I configuración. No quiero extensiones que configure y no la persona definitiva. Déjame intentarlo otra vez. Y ahí vamos. Sin flechas, todos los derechos. Entonces la clave secreta, no, diré var Ki es igual a y luego puedo llamar a un punto de entorno, obtener una variable de entorno. Y recuerden que pusimos el nombre de esta variable de entorno, solo sepan que están trayendo abrochado mi símbolo del sistema. Yo lo puse en C0. Entonces lo que sea que vaya a usar ahí es el nombre de su variable de entorno. Entonces t A continuación, queremos decir un punto de servicios agregar autenticación. Entonces voy a agregar una opciones de autenticación con opciones. Perdón, déjame sólo conseguir esto. Entonces dicen OPT o simplemente dices todo menos la lambda. Y entonces sólo voy a abrir y cerrar corsé porque tenemos bastantes configuraciones que íbamos a entrar aquí. Es en cualquier momento que tengas múltiples líneas, agendas abren la llave rizada y luego cada línea termina con un punto y coma, alguien para decir todo esquema de autenticación por defecto de punto x0 igual a. Y luego tienen los impagos de cerveza JWT, soul, lo que no está aquí. Y creo que necesito algunas bibliotecas o canción de. De New gets. Entonces déjame solo revisar barriles de así que ahí está. Necesidad de incluir el Microsoft está siendo en la autenticación central, el JWT Bureau. Entonces vamos adelante y conseguimos eso. Sepa que está incluido JWT Birra predeterminado esquema de autenticación de puntos. Entonces esto es básicamente decir que estoy agregando autenticación a la aplicación. Y el esquema por defecto que quiero es el JWT. De acuerdo, así que fuera del pero alguien intenta autenticarse, comprueba si hay una ficha al portador. Eso es básicamente lo que eso está diciendo. Y entonces esquema de desafío por defecto es lo mismo. De acuerdo, así que comprueba eso para autenticación y desafío. Sea lo que sea, sea cual sea la información que se encuentre, desafíelo en base al estándar JWT. Y consciente extender es que solo voy a quitar el punto y coma por un rato. Por lo que quería ver en la siguiente línea punto agregar portador JWT. Y entonces esta otra vez va a tener opciones. Entonces voy a hacer mi tolkien lambda y luego abrir y cerrar corsé rizado. Y la imagen se fija la sangría, ¿no? Entonces decimos todos los parámetros de validación de punto Tolkien. Por lo que hay bastantes parámetros que puedes configurar en el camino. Cada persona podría ser diferente. Una vez más, la institución podría ser diferente. Entonces lo que estoy haciendo son esas educativas, pero en su entorno empresarial, puede que tengan otras necesidades que las que voy a retratar aquí. Entonces si esa resulta ser tu situación, entonces sólo actúas en consecuencia, ¿verdad? Por lo que un nuevo parámetros de validación Tolkien. Y luego vamos a saber que todos esbozan algunos de los parámetros que vamos a querer utilizar para validar que este Tolkien, ya sabes, debería otorgar acceso a alguien. Entonces aquí podemos ver, ¿queremos validar quién emitió el Tolkien? Esa es generalmente una buena idea. Considerando que pasamos por toda la molestia de decir aquí es el emisor. Entonces eso significa que si alguien pone algún otro valor ahí, entonces estamos diciendo, bueno, si conozco los valores ahí, entonces debería ser inválido. Booleano quería validar la vida, ¿verdad? Entonces de esta manera, rechazaremos el Tolkien si es si está caducado, automáticamente rechazará. Entonces, ¿quieres hacer eso? Sí. Y luego otra que probablemente queramos hacer es validar el problema isu o clave de firma. Y ya establecimos que este era el valor clave aquí arriba, ¿verdad? Entonces para asegurarte de que siempre sea la clave de firma correcta. Y luego seguimos. Y luego fui a ver a un emisor válido. O el emisor válido para cualquier Tolkien dado sería la configuración de JW, la configuración JWT, que es una sección de convictos. Obtener sección, todo eso. Y entonces sería emisor, ¿no? Por lo que su valor se establece para el emisor. Yo quiero ese valor de punto, su objetivo. Y luego veamos que la clave de firma del emisor es igual a una nueva simétrica. Entonces no, vamos a ser hashing. Y así, y por eso dije que puede ser un Valle complicado, no necesariamente tiene que ser porque cuando se va a configurar, se va a, vamos a estar hash de todos modos. Entonces dices nueva simetría, clave de seguridad simétrica. Y luego codificamos. Entonces ya ves, incluso con mi muy, muy complicado que se basaba en un vacío, estamos codificando esto y luego vamos a hachearlo de nuevo después. Muy bien, así como dije que no necesariamente tiene que ser tan complicado tanto codificar W2 si conseguir por su o dividirlo en bytes. Y luego pasamos en el valor clave que obtuvimos del medio ambiente. Entonces las partes más importantes de lo que es la clave, no la pongas en la configuración de la app, ¿verdad? Está tirada, podría haber ido allí. Pero, ya sabes, ser mucha abundancia de cautela. Lo pones en las variables de entorno. Yo Alf lo pone en la configuración de la aplicación antes, pero entonces eso era mucho aplicación muy interna y no necesaria al público frente o y así solo vamos a seguir adelante e incluir cualquier referencia faltante allí. Y entonces creo que eso es solo para parámetros de validación bullet una vez más, en base a tu situación, puede que necesites más validaciones de las que estoy poniendo aquí, ¿verdad? Entonces esto es todo lo que voy a usar, punto y coma, punto y coma, y entonces eso es todo para nuestras extensiones. Entonces no, podemos pasar al inicio y podemos llamar a nuestros servicios JWT configurados dot JWT. Y tenemos ese objeto de configuración siendo pasado por la línea, ¿verdad? Y entonces un poco detenemos la factura solo para asegurarnos de que todo sea más suave, exitosa construcción podemos continuar con nuestras tareas. Entonces lo siguiente que quería hacer es crear alguna funcionalidad para la validación y la emisión del Tolkien, ¿verdad? Entonces voy a subir, quiero decir, simplemente colapsar todo en el proyecto están a. Y luego en nuestro pozo, yo repositorio y repositorios. Entonces lo que voy a hacer es crear otra carpeta llamada servicios. Yo sólo quería asegurarme de que todo está bien, segrega sus relojes inconscientes. Entonces los servicios serían para extensiones, ¿verdad? Fui a añadir una nueva clase. En realidad, lo siento. Debí haber nombrado a este gestor de ojo fuera. Por lo que agrego una nueva clase lo llamó fuera de gerente. Terminas haciendo exactamente lo que Adidas renombró el archivo y automáticamente, automáticamente se renombró eso. Pero luego lo siento, no es una clase, es una interfaz. Ahí vamos. Entonces en esta interfaz, quería tener una tarea que va a devolver Boolean. Y quería llamarlo validar usuario. Y entonces esto se va a llevar el usuario de inicio de sesión dto revelación. Es el usuario Nietzsche. Ah, bueno, propósitos de uniformidad. Y seguiremos adelante e incluiremos cualquier referencia que falte como de costumbre. Y entonces voy a tener algo más que va a crear y devolver el Tolkien, recuerdo de alguien que crea Tolkien. De acuerdo, así que necesito una clase para consumir esa lectura. Alguien va a seguir adelante y no quiero llamar a este de mánager. Esta es en realidad una clase que va a heredar de su nombre de interfaz, que luego va a ver estos implementos, los métodos que me dijiste que debería tener. Antes de seguir adelante, tenemos que asegurarnos de que registramos nuestro servicio en nuestro trapper botas aquí en el archivo style.css. Por lo que sólo vamos a decir un servicios las probabilidades captadas y tener el ojo fuera gerente mapeado a fuera Gerente. Y una vez más estamos sumando en esculpir. Entonces eso es muy importante. Entonces vamos a crear este Tolkien. Por lo que dentro de fuera Gerente, voy a estar poniendo esos dos. Voy a estar inyectando cosas de herramientas. Entonces necesito mi, En primer lugar, necesito el administrador de usuarios, que puedo obtener fácilmente de conos, mi dirección. Necesito esa instancia exacta de administrador de usuarios, ¿verdad? Y sólo tienes que seguir adelante e incluir la referencia faltante. Y también necesitaré inyectar una instancia del Configuration Manager. Así que solo sigue adelante y haz sus presentaciones para esos y luego termina la inyección. Y una vez hecho eso, podemos continuar. Entonces, empecemos con la validación del usuario. Esa es una fruta colgada más baja. Entonces, solo tratemos con ese 1 primero, ¿verdad? Entonces cuando queremos validar, el usuario básicamente diría, queríamos seguir diciendo Aquellos que este USA existe en el sistema y ¿se adquiere el analizador? Ahí hay. Por lo que puedo decir var usuario Z igual a espera, gestor de usuarios punto encontrar por nombre un fregadero. Y luego recuerda que para esta multa por nombre básicamente significa fan por EU en India lo es, es pedir el nombre de usuario. Estaba usando la dirección de correo electrónico como nombre de usuario. Entonces solo estamos pidiendo dirección de correo electrónico en dto, pero en todo el sistema es donde la historia que tiene un nombre de usuario también, ¿verdad? Entonces solo puedo seguir adelante y hacer eso. Y esto está diciendo, oh, entonces o, significa que necesito mi asincrona, correcto. Así que cada vez que molestas, lees una perfecta declaración oh, espera y sigues metiendo en la línea roja. Tan solo doble comprobación. Si tienes la asíncrona, tiende a recortar. Con la práctica se vuelve permanente. Entonces después comprobamos si tenemos teléfono este usuario, por lo que este está dispuesto a regresar a los usuarios objeto en almacenamiento aquí. Entonces voy a ver, y sólo voy a, en lugar de escribir una declaración if, sólo voy a escribir como un operador ternario para decir usuario no igual a nulo. Y así solo doble comprobación. Este no es el esquema de Turner y esto es sólo una declaración lógica. Por lo tanto, devuelve si el usuario no es igual a nulo. Administrador de usuarios punto comprobar contraseña asíncrona. Siempre digo usuario dot password. Lo sentimos, no usuario, detalle de usuario. Porque no conocemos el hash de contraseña. Por lo que el usuario dto dot contraseñas, así que esto es automático. Tienes que entrar para ver si esta contraseña es válida para el usuario que se está revisando. Entonces si regresamos a alguien con nombre de usuario y la contraseña es válida, esto va a devolver verdadero o falso basado en el viejo peine, todo eso. Y lo que nos falta aquí es todo lo que necesitamos para usar nuestros objetos. Por lo que necesito usuario como, usuario necesita ceder hasta zumbador, vaya. Por lo que va a revisar la contraseña, ver si es válida y desordenada. Tendrías algo si ese nombre de usuario existiera y entonces sabríamos que es un ítem de usuario válido. Expliquemos lo que sucede en la operación crear Tolkien. Por lo que aquí queremos crear un objeto para asignar credenciales. Y voy a seguir por lo que llamaremos reclamos. Y creo que necesito incluir a sus amigas. De acuerdo, así sucesivamente, crea porción Tolkien o queremos hacer algunas cosas en para crear algunas credenciales de firma en para obtener reclamos, y luego queremos agregarlos a la opción de token. Entonces sólo voy a escribirlos línea por línea. Consigue el fichaje, consigue las credenciales de lijado, consigue canadienses, y luego crea opciones de Tolkien, bien, donde voy a estar, tenemos que crear estos métodos tan adorables hay tierras, ¿no? No. Pero luego al final de la operación, voy a decir volver nueva seguridad JWT. Y más que esto necesita algo así lo hizo OUT security token handler, eso es, así que tenemos que incluir este modelo de identidad, punto JWT de Tolkien, esto, y eso es un método o una clase o no. ¿ Verdad? Tolkien, que también es un método, pero toma las opciones de token. Entonces lo que sea que lleguemos aquí está basado en lo que conseguimos de vuelta aquí y BSL llegaría pero allá. Está bien, así que empecemos con este. Entonces solo voy a pasar el rato sobre él y generar el método para ello. Y puede ser privado por lo que no lo necesitas para tener ninguna operación pública. Por lo que estamos consiguiendo las credenciales de lijado. Entonces lo primero que tengo que hacer es conseguir la llave. ¿ Todo bien? Y vamos a hacer una operación similar a lo que hicimos en las extensiones de servicio para obtener la clave. Por lo que sólo pasó y copió y pegó esas dos líneas. El clave get, se obtiene de la variable de entorno y luego codificamos para obtener secretos. Y luego lo siguiente que vamos a hacer es simplemente devolver nuevas credenciales de firma cuerdo. Y eso va a tener los secretos. Tan secreto aquí sería la versión codificada o su coma secreta. Y luego le dejamos saber que el algoritmo de seguridad utilizado para esto fue el diente de sierra H M 5-6. Está bien, ahí vamos. Entonces eso es cuidar las credenciales descendentes, ¿verdad? No, vamos a hacer los reclamos de get. Entonces solo voy a pasar el rato sobre ese, hacer lo mismo genera stub de método para ello. ¿ Está bien? Y luego, acabo de notar que esto es de tipo objeto, así que voy a hacer muy explícito que está firmando credenciales. Ese es el tipo de retorno de esto, ¿verdad? Estoy seguro de que el objeto hubiera funcionado lo que me gustaría asegurarme de que todo esté fuertemente escrito. Entonces éste, déjame solo seguir adelante y convertirlo en un fregadero. Y tiene que ser una tarea que vaya a devolver una lista de reclamos. De acuerdo, entonces la razón por la que tenemos que pasar por todo esto es nuestro reclamo más bien no reclamos. Hay un que tenemos que pasar por todo esto. El demandado tipos que dijimos var para arriba explícito aquí arriba, entonces habría inferido lo que devuelven tipos los puertos, barcos. Porque dijimos var, no lo sabe, así que es sólo ser muy vago. De acuerdo, así que sigamos adelante y saquemos los reclamos. Por lo que voy a declarar una nueva lista. Var reclamos es igual a una nueva lista de tipo reclamo. Y vamos a añadir un nuevo nombre. Y entonces lo que aseveraría es que estos, estos son los trozos y pedazos de información que realmente dicen quiénes son lo que puedes hacer, ¿verdad? Por lo que afirmo ser esto se afirma poder hacer eso. Entonces esas son las cosas que queremos asegurarnos de que estén incluidas en nuestra aplicación o en nuestro kit de herramientas. Entonces el primer tema que quería agregar es el punto de tipos de reclamo. Fui a buscar, hay un montón de 0s y estoy así que estos son todos tipos de reclamo que están ahí. Ver rol está ahí puedes agregar múltiples reglas, correo electrónico, todas esas cosas maravillosas, ¿verdad? Alguien para ver a Nim. Nim generalmente significa nombre de usuario, correo electrónico, autoexplicativo, etc. Así que si dije que quería que ya sea limpiar nombre de tipo, el nombre del usuario que acaba de validarse cuál alguien está fuera a cambiar algo aquí. Entonces me estoy quedando con los locales de usuario de validez, lo que significa entonces tendría que tratar de pasar eso. Entonces lo que voy a hacer aquí, crear otra variable aquí de tipo usuario APA, y lo voy a llamar usuario. Y luego en lugar de localizar usuario en invalidado, sólo voy a hacer eso así sucesivamente. Donde en el contexto de esta clase, tendremos acceso a los datos del usuario. Esa es su idea, ¿verdad? Entonces sigamos. Entonces nombre es Lynn para venir del usuario dot y solo usaremos, bueno, podemos usar nombre de usuario, ¿verdad? Al igual que por falta. Entonces en una situación en la que no estarías usando el correo como nombre de usuario, entonces tienes el nombre de usuario para usar como un nombre limpio y mínimo. Te gustaría tener eso, ¿verdad? Entonces podemos decir filas var. Y entonces podemos nuestros pesos. Y usa user manager para obtener los roles para los usuarios. Por lo que hay get's rolls un fregadero. Ahí vamos. Simplemente pasaría a US AS automáticamente va a ir a buscar todas las reglas para este usuario y devolverlas en forma de lista. Ahí vamos y listamos. Y luego para cada uno de los que quieren agregar, entonces, por lo que para cada regla en roles, queremos agregar ese reclamo. Para que pueda ver reclamos punto. Y entonces sólo diré nuevo reclamo de la misma manera que lo hicimos aquí. Y sólo decir afirmaciones que agregan nuevo limpio pero luego tipo de clic sería rol. Y entonces la regla de volver a orden o a añadirse se descartaría desde nuestro bucle. Está bien, y luego después de todo eso, y lo construimos y una vez más, en base a las afirmaciones que desea poner en, se pueden ver todas las reclamaciones potenciales aquí. Puedes meter todas las que quieras, ¿verdad? Una vez que se hayan hecho eso solo puedes devolver reclamos. Entonces eso es Troodon y uno más para ir, ¿verdad? Entonces solo voy a generar este método, aún sé cuál va a combinar las credenciales de lijado y afirmaciones y crear el Tolkien real para que se emita al usuario. Está bien, entonces aquí el tipo de devolución sería de seguridad tipo JWT. Tolkien escribe, JWT seguridad Tolkien, sin embargo, para que seamos muy explícitos en cuanto a lo que debería ser. Ahora en lugar de este método. Vamos a estar viendo esa var. Entonces tengo que conseguir las sesiones. La configuración de Var JWT es igual a, y realmente no quiero volver a escribir esto. Déjame ver si sólo puedo conseguir el rápido aquí. Podría haberme retentivo, pero eso está bien. Configuración de Var es que aunque decimos opciones var son opciones Tolkien es igual a nueva seguridad JWT Tolkien. Y entonces tenemos que usar este constructor. Por lo que se le amaneció a uno por supuesto. Entonces vamos a llenar ciertos parámetros. Por lo que fui a precisar que el emisor que quiero viene de la sección JWT Settings para la válida te alivias tu al igual que lo que teníamos aquí, ese es el tema que queremos. Entonces ponemos eso como un tema. ¿ Están ahí el siguiente serían los reclamos. Y entonces los reclamos vendrían de nuestra lista. Reclamaciones, retiros, préstamo jefe en los parámetros aquí, ¿verdad? Y luego queremos poner la caducidad en. Digamos que la caducidad siempre es buena para sentarse. Entonces es realmente te pide un valor expira. Ahora podrías fijar 15, incluir set diez, mg, y podría hacer eso. O simplemente puedes modificar el archivo de configuración y establecer el valor ahí, correcto, así que como ahí es donde van todos mis valores codificados, solo voy a mantenerlo uniforme. Y así voy a decir sólo que obtenga ese valor del archivo de configuración. Está en la sección llamada life. Entonces eso significa que este valor, este Tolkien una vez, una vez creado, sólo tendrá validez por 15 minutos. Eso es correcto. Y entonces estarían aquí las credenciales de lijado, que pusimos ya o en realidad pasadas. Ahora una vez hecho todo eso, vamos adelante y regresamos. Nuestras opciones son, déjenme nombrar esto más, más apropiadamente. Esta es la ficha porque esta es la creación de los Tolkien o devueltos a Tolkien. Y entonces ese es Tolkien, ¿verdad? Entonces lo serializamos en una cadena y devolvemos esa cadena nulo. Ya hemos hecho un poco de trabajo aquí. Y lo único que probablemente necesitamos hacer después es asegurarnos de que nosotros y lo siento, solo estoy viendo un error aquí con la configuración. Era su propia. Y sólo asegúrate de tener la blob correcta construida. Entonces diré y que hemos hecho bastante aquí para poner en marcha nuestras cosas de Tolkien. Entonces lo que queremos hacer es, lo siento, así que esto es bueno. Entonces por su propia configuración, no estaba viendo que esta flecha expira debería ser. Yo lo hice. Y solo pongo 15 minutos. Entonces déjame, déjame rehacer que alguien para guardar var experiencia SHA-1 es igual a, no veo debería realmente suceder es decimos datetime dots null. Cuando se pidió un Tolkien, sumemos unos minutos. Entonces sea lo que sea, sea cual sea el umbral que quieras. Entonces si es de minutos en absoluto, ¿ fue que acabas de decir agregar que los apropiados, son minutos impares. Y entonces pondríamos en el valor. Y el valor aquí es string. Entonces eso significa que necesito hacer algo así como una herramienta int convierte puntos. Y como dije en 32, o esto, ¿requiere de doble? Creo que eso requiere doble. Entonces déjame hacer me convertiré a w en vez de línea de freno y cerraré eso. Entonces me iba minutos convertidos a Bobo. Lo siento. Sí. Ahí vamos. Entonces hacemos que convierte un caduca de doble final es obtener el valor de la exploración, ¿no? Entonces en ese punto, sabemos cuando el Tolkien ya no sería válido y me falta un punto y coma aquí y déjame hacer una construcción. Y no tenemos flechas. Entonces cantaré cuando regresemos, exploraremos toda la autenticación. En realidad nuestra autorización realmente ganada impide el acceso a nuestros recursos y luego a cómo realmente configuramos el endpoint para autenticar al usuario y fácil de hablar y en consecuencia. 30. Proteger los puntos finales: Muy bien chicos, pavos de bienvenida. Por lo que salir de los talones de configurar nuestro gestor de autenticación para emitir genera un problema. Los tokens, lo que queremos hacer es en realidad terminar nuestros puntos finales de inicio de sesión al to y donde realmente validamos el Tolkien y permitimos o denegamos el acceso a cualquiera que pase en este token, ¿no? Entonces lo primero que queríamos hacer es inyectar nuestro recién creado servicio off Manager para que sepamos hacer las áreas de inyección. Simplemente pueden seguir adelante y golpear pausa y seguir adelante y completar este operador de inyección. Entonces una vez que hayas agregado las nuevas tres líneas, una para la propiedad privada, otra en el constructor y hasta la inicialización. Entonces podemos ir a crear o iniciar sesión endpoint. Por lo que ya habrías comentado en el endpoint de inicio de sesión. Puedes descomentarlo y ya tendré la versión revisada del mismo en pantalla. Entonces, solo pasemos por ello juntos. Entonces lo que queremos hacer es iniciar sesión para validar nuestros solicitados o los datos que vienen en detalle. Entonces voy a decir que si el off manager valida usuario, si no hilo, por lo que podría leer fácilmente, dice que es igual a falso en caso, necesitas C agudo. Si no, solo pones el sensor de exclamación. Esto significa que si no es un usuario válido que volver sobre Autor como porque, bueno, si intentas iniciar sesión y no eres un usuario válido, entonces no estás autorizado para ir más allá, ¿verdad? De lo contrario, vamos a regresar aceptados están bien. Sea lo que sea, estoy viendo aceptado, aceptado, nuevo y un nuevo objeto con, con una expresión llamada Tolkien. Y tomará el valor del token que se crea. Por lo que decimos un peso en el marcador off manager puntos crean Tolkien. Entonces recuerda eso, eso es lo que habríamos configurado en nuestro gestor de Auth. Simplemente null create Tolkien pasa, genera todos estos bits y piezas de datos, y luego devuelve el Tolkien. Entonces eso es lo que tendrá esa carga útil, así sucesivamente para seguir adelante y probar esa funcionalidad. Entonces volvamos a visitar nuestro endpoint de inicio de sesión. Yo sólo voy a usar el futbol para estas partes de su son lo striatal lo y poner en un usuario que no, yo creé y ya está registrado. Y luego voy a dar clic en Ejecutar. Y veamos qué pasa. O lo es, y estamos recibiendo una respuesta token. Entonces ves esta gran cuerda, tolkien, eso es en virtud de los expertos y vamos a poner en un objeto personalizado. Y el valor que se pasa es el token que está aquí. Entonces si yo, si hice este token y voy a nuestra página web, mira lo que hay en tokens. Pega. Entonces veremos aquí que tenemos el algoritmo, tenemos Traviata example.com. Esa es la reclamación para el usuario. Bueno, el papel. Muy bien, y tenemos el tiempo de caducidad. Y si pasas el mouse, te mostrará exactamente el tiempo desde el que se emite y el emisor. Está bien. Y luego si quisiéramos llegar tan lejos como su amiga engañando, así podríamos hacer eso, pero para ya tener el mecanismo para hacerlo internamente, así que no necesitamos hacer eso aquí. Entonces ahora lo que quiero hacer es experimentar con realmente impedir que alguien acceda a nuestros puntos finales. Entonces voy a usar nuestro hotel. A contralor para ese ejercicio. Entonces digamos que la capacidad de conseguir la lista de hoteles, todo el mundo debería poder hacer eso. Deberíamos poder llamarlo sin autenticarse, que es lo que hemos estado haciendo hasta en nulo. No obstante, queremos agregar una inundación autorizada o anotaciones a la llamada para llegar a uno detalles de hoteles. Por lo que acabamos de poner en Autorizar. Y en realidad podrías extender el, la anotación aquí para el HTTP GET y agregar autorizar ahí mismo. De acuerdo, para que lo pudieras hacer de cualquier manera. Entonces si tienes éste, no necesitas éste. personal, me gusta separarlos. Por lo que del HTTP GET autorice y en realidad me gusta o prefiere ponerlo en la parte superior. Entonces según lo veo, sé que es un punto final autorizado. De acuerdo, entonces lo que queremos hacer es poner a prueba nuestra llamada. Por lo que este endpoint no autorizado y autorizar. Entonces este objetivo. Y para esta actividad voy a usar cartero, alguien ha tenido primero probar la que no hemos autorizado sólo para asegurarnos de que siga funcionando. Está bien. Hay una lista de fotos, tres hoteles. Bien. Ahora voy a probar el que tiene el punto final que requiere un valor id, ¿no? Entonces cuando haga clic en enviar, va a decir 401 no autorizado. No es decir 401 on Author como porque no inicié sesión o lo que sea porque quiero decir, esto ya está autorizado y recientemente el esquema por defecto a C, necesito ver un Tolkien para autorizar no son sólidos. Eso está sucediendo automáticamente. Si tenemos un viejo Tolkien ahí dentro, cosa que sí, esta es una ficha que se emitió hace más de 15 minutos. Entonces automáticamente también denegará el acceso. Entonces cuando se emite un Tolkien, y luego se necesita spires, son los dueños del cliente llamando a la aplicación y lamento ir a buscar un nuevo kit de herramientas, significa que pasa por el proceso de inicio de sesión otra vez, obtiene un nuevo token y luego regresa e intenta acceder a estos endpoints. ¿ Está bien? Entonces en Cartero, lo que queremos hacer es entrar en autorización y elegir token portador de esta lista desplegable. Entonces proporcionamos el token que tenemos, que es el Tolkien fresco. Y luego cuando hacemos eso, y sigo recibiendo un 401 no autorizado, así que eso significa que hay alguna configuración que falta. Y déjame ir más que probable que esté en el startup dot cs. Y creo que dejé uno de los middleware, así que necesito sumar. Usa la autenticación aquí mismo. ¿ Está bien? Así que asegúrate de tener esto. Usar autenticación y asuntos de orden en estas situaciones, autenticación, luego autorización y todo eso antes de que estén en marcha, no NVC. Las diferentes versiones .net Core pueden tener diferentes middlewares siendo incluidos. Por lo que mientras consigas ese tema general, deberías ser bueno. Entonces intentemos otra vez esa misma petición. Y estamos teniendo mucho mejor éxito. Está bien, entonces nos estamos consiguiendo Status 200 OK. y estamos viendo el único hotel que solicitamos. Entonces sepan que acabamos de proteger nuestro endpoint porque si elimino esto y digo En todo off e intereses y otra vez, obtengo un 401 no autorizado una vez que incluyo a la Birra Tolkien, obtengo el estatus 200. Si modifico este espíritu, Tolkien, entonces está no autorizado porque el Tolkien no pudo ser validado contra la inflamación fue codificado y puesto originalmente. Entonces así es como puedes seguir adelante y endurecer tu API. Y una vez más, esto, este método JWT es muy seguro porque esta carga útil, sí, se puede decodificar, pero quería no debe contener ninguna información que sea demasiado sensible y la información que es lo que contiene debe ser información de que si lo ves, está apagado. No hay consecuencia importante para API y la infraestructura subyacente. No obstante, me basta verificar quién eres tú y que yo soy quien te dio acceso al sistema. 31. Revisar y añadir cambios a GitHub: Bienvenidos de vuelta chicos, donde es otro punto de control significativo. Y cada vez que llegamos a puntos de control significativos, seguimos adelante y revisamos nuestro código para que solo puedas seguir adelante y escribir tu mensaje de check in y luego comprometer todo y sincronizar. Y una vez que eso se complete, entonces pasaremos a nuestra siguiente excitante actividad. 32. Construct POST Endpoint Endpoint: Bienvenidos de vuelta chicos. En esta lección, estaremos tratando con el método de publicación HTTP o verbo que nos permite crear recursos o nuevos registros en nuestra base de datos. A pesar de que hemos trabajado con post previamente cuando estábamos sentados nuestra funcionalidad de inicio de sesión en nuestro controlador, hicimos tipo de experimento con el post y exploramos el hecho de que realmente podemos pasar datos en forma del cuerpo, son un objeto adyacente que se deserializarían en cualquier objeto que nos hayamos conformado por él. Y de esa manera, ninguna información sensible necesita atravesar de una manera visible de ARN URL. Entonces lo que vamos a estar haciendo es configurar la funcionalidad de post para nuestro hotel. Para que cuando estamos creando un hotel, podamos pedirle al usuario que envíe todos los detalles suelo Hotel en forma de un objeto JSON y luego lo pasamos a la base de datos. Por lo que ya he preparado los métodos, la web o verbo HTTP post. Y estaremos devolviendo el estado 400 herramienta de estado uno así como el estado 500. Ahora note esto es 2l uno y no 200 porque 2-1 significa creado. Por lo que estaremos indicando dos, la aplicación de llamada o el cliente que sí, lo que se te solicite para que se cree se ha creado. Entonces empecemos y ahora lo primero que me gustaría hacer antes de seguir adelante y crear cualquier cosa o traer cualquier dato a mi base de datos es comprobar si los datos que vienen son válidos. Entonces lo que quería hacer es poner en una declaración if aquí para decir si no, estado modelo es válido. Entonces hicimos algo así. Creo que cuando estamos haciendo el login donde dijimos, es válido el estado modelo, significa que se requiere todo lo que he dicho. ¿ Está ahí? De no ser así, devolvimos el giro de la mantequilla. Entonces sólo vamos a hacer lo mismo, replicar ese paso aquí. Pero estoy viendo si no es válido, entonces te vas a encantar el aire y decir que hubo un intento de post inválido en ese método, ¿verdad? Y regresamos la mala petición. De lo contrario queremos probar y operaciones. Por lo que tenemos nuestro try catch. Y la uniformidad de nuestro código es tal que en realidad podemos tomar estos viejos. Entonces empiezas a ver que estamos una especie de repetición de certeza es porque todas estas cosas, ¿y si quisiéramos cambiar un mensaje? Tendrían que cambiarlo aquí, cambiado en este método de nivel GnG. Y luego a medida que nos expandimos, tenemos que tener más puntos de contacto. Por lo que más adelante veremos en todo el fin de semana, abstraer toda esta repetición. Pero en este momento sólo quiero asegurarme de que entendemos los conceptos de cronometrado. De acuerdo, así que solo vamos a seguir adelante y modificar el mensaje de error y sabremos que puedes intentarlo u operarlo. Ahora, ¿qué vamos a probar? Lo primero que me gustaría hacer es tomar este dto. Y si solo revisamos este detalle, tiene nombre, dirección, disturbios, y es espera una identificación contraria. Y luego tenemos hotel dto, que tiene DNI y country. Entonces, una vez más, la razón por la que no estamos usando el detalle del hotel es que no necesitamos que el valor ID se cruce con el intento de creación. Por eso solo tenemos los campos para los que absolutamente necesitamos valores delineados dentro de la versión Create de este dto. Ahora una vez que tenga el detalle, lo que quiero hacer es mapearlo. Alguien acaba de decir var hotel es igual al mapeador dot map en un objeto de tipo hotel, que es un objeto de datos, y mapeando el contenido del hotel. El t o.Siguiente parada, vamos a llamar a nuestra unidad fuera del trabajo. Por lo que voy a ver subrayado unidad de trabajo, puntos, Hoteles, punto. Y entonces tengo en cert lo que sea insertando mi objeto de tipo hotel. Porque para cuando llegue aquí, cualesquiera que sean las validaciones que necesites poner, puedes poner. Entonces aquí solo estoy validando una molécula estados si tenías otras cosas que necesitabas para asegurarte que están en su lugar antes de que nos haga fuego como tratando de insertarlo, asegúrate de hacer todos esos cheques y equilibrios y devolver la batería quest o lo que sea, Aristóteles, todavía un cliente antes de que realmente empieces en inserto. E incluso al hacer el inserto, si hay una excepción, todavía vamos a devolver algo excepto que será FIFO cientos ya que probablemente la zona esté de nuestro lado. Entonces después de llamar al inserto, lo siguiente que tenemos que hacer es llamar al guardar. Aviso. Cuando apenas estábamos recuperando, sólo podíamos hacer una espera que llegar no hay salvamento. No obstante, en esta ocasión estamos alterando la base de datos por lo que tenemos que comprometer el cambio que estamos haciendo después. Entonces por eso tenemos que llamar al guardar. Ahora después de todo eso, necesitamos devolver algo bonito. Entonces, ¿a qué estoy regresando? Ness, voy a decir crear, Ted, No, ya he creado suficiente, creado en acción justo ahí, realidad sin crear en la raíz también. Por lo que todos devolvieron el 201. Es solo que cuando dices creado, es solo 201. Es, sin embargo puedes decir Creado out to route y que llame al endpoint, le diga A con el ID requerido, digamos realmente devuelve, crearon objetos al cliente, lo cual creo que es útil. Entonces voy a ir con creado en raíz. Entonces tengo que especificar el nombre de la ruta. Entonces en este caso, sí dije que quería ir a buscar Hotel. Y luego después de eso, tengo que especificar qué valores de parámetro podría necesitar este endpoint. Entonces si miro hacia atrás, llego a casa A TI necesita una ID más suave especificar un nuevo objeto. Y va a tener un campo llamado ID, y va a ser igual al hotel dot id. Aviso hotel ahora total dto, hotel ETO no tiene un valor id. No obstante, después de esta operación, este objeto se actualizará con su ID. Y entonces eso es lo que pasaremos. Entonces tomemos este para dar una vuelta. Pero justo antes de que hagamos eso, antes de que llegue a marcharme, necesitamos dejar que esta regla ni que tenga este nombre, ¿verdad? Entonces a pesar de que tiene el nombre, necesitamos hacerle saber que obtiene operación que va por ese nombre, no necesariamente arraiga libro por ese nombre, correcto. Puedo simplemente anexar aquí y decir Nombre es igual. Entonces esto es como una pequeña nota interna de apodo para ver. Este es tu nombre siempre que alguien en tus hermanos, hermano siendo otro axón llame. Por lo que intentemos eso es otra vez. Muy bien, entonces vamos a probar este en Cartero. Y ya tengo un objeto aquí, así que en realidad copié este objeto de nuestro GetText anterior. Por lo que ya establecimos que no se requiere el DNI. No obstante, sólo yendo a slugger, solo para mostrarte qué swagger va a curar un barco. Cuando miramos el poste para hotel, nos está mostrando que esto es todo lo que va a ser terrible. Por lo que aunque enviemos más información extra, será ignorada. De acuerdo, así es como debe verse nuestro objeto para poder entrar en nuestros puestos. Entonces usando cartero, en realidad lo voy a probar con el DNI y vamos a ver qué pasa. Por lo que voy a dar click enviarme. Este axón está en poste. Contamos con nuestro endpoint y luego haga clic en enviar. Y estamos consiguiendo esta era tanto sistema de operación inválida Nauru, mucho se suministra valores. Entonces eso significa que necesitamos reestructurar el código o en un CreateDat r2. Entonces volviendo al código, déjame solo ver qué hay sobrecargas ahí. Y tenemos el nombre raíz de cadena donde el valor objetivo, creo que me falta el objeto real. Ahí vamos. Por lo que coma y hoteles o pasando sobre el id y el objeto real a mostrar. Entonces intentemos eso otra vez. Entonces las mismas pruebas que sí dan un error, voy a intentarlo de nuevo. Y ahí vamos. Entonces mira la diferencia entre las dos cargas útiles, donde recuperar nuestro objeto de hotel con el valor de identificación de seis o x, incluso el cinco es 5 aquí, son cinco aquí, ¿verdad? Entonces solo para mostrarles que esto no se hizo cono para nada, gracias a nosotros no permitiéndoles presentar esos datos. Entonces esa es otra razón. Es una buena idea usar detalles para cantos desinfectar lo que puede entrar en tu API. Ahora además de mostrar lo recién creado requirió otra ventaja, los que usan creado en Rutan apuntando al punto final sería que en los encabezados realmente regresamos la ubicación donde pueden ir y buscar este registro. Entonces ya ves, sí tenía un cierto propósito si yo tuviera justo, ya sabes, el cliente, si miran en los encabezados y simplemente obtienen ubicación después de haber devuelto los datos que en realidad pueden simplemente usar eso y hacer un get operación y recuperar su registro. Pero claro que no estoy autorizando. Entonces ya sabes, todo ese shebang ya que tienen que pasar y hacer todo eso. Ahora a punto de ser autorizado, no creo que sea dañino permitir que alguien recupere un hotel por identificación, ¿verdad? Entonces sí lo autorizamos inicialmente porque estábamos probando. No obstante, en practicidad, no creo que tengamos que autorizar, que se le diga A. Si les permitimos conseguir que el oyente debería. Uno, sin embargo, sí creo que sería bueno autorizar a quién puede crear. De acuerdo, así que depende de ti con reglas de negocio y tus necesidades determinarán dónde pones al autor como seguridad domiciliaria, haces cumplir nuestros propios puntos finales y operaciones de año. Entonces en esta situación, voy a autorizar crea hoteles por lo que tienes que estar autorizado. Y para mí es mucho peor, si no estás en el papel de admin, entonces no deberías poder hacer esto. Entonces para hacer cumplir la autorización basada en reglas, puedo ver roles iguales y luego enumerar tantas reglas como quiero apoyar. Entonces si digo autorizar Reglas, administrador, eso significa que si estás autorizando, lo consigue Tolkien, pero eres usuario, no administrador, entonces no puedes llevar a cabo nada que aún no estás autorizado. No obstante, si eres administrador, entonces puedes seguir adelante. Entonces eso es todo esto una vez más, puedes ir a hacer cumplir uno. ¿ Qué punto final expones a John public versus a un autor, usuario autenticado? Y luego por extensión, ¿cómo se extienden estas funcionalidades a las que grupo autorizado de usuarios que pueden autorizar con base en políticas, reglas. Y hay bastantes opciones disponibles para ti. Si presiona coma, verás que tienes el esquema de autenticación. Podríamos hacer una JWT, otra una contraseña fuera, etcétera, etcétera. Se puede hacer cumplir una política y se puede limitar por roles. Por lo que hay bastantes opciones para eso. Entonces, correcto, no, te voy a retar una vez más lo que acabamos de hacer con crear hotel. Te animo a que lo intentes y lo hagas con el país. Asegúrate de probarlo y de que recuperes tu país con éxito. Y vamos a comparar notas. Y estamos de vuelta. Espero que hayas pausado y lo hayas intentado. Si no, entonces adelante y pausa. No, pero te voy a guiar por lo que hice. Y realmente y verdaderamente notarás que el código es casi idéntico. Uno donde en el controlador del país tenemos las mismas medidas de autorización. Una vez más, tu contexto puede ser diferente al mío, pero solo queremos asegurarnos de que aseguramos los extremos en consecuencia. Estamos haciendo una publicación HTTP tendrá tipos de devolución similares a lo que hicimos con el hotel, excepto por la acción lo voy a llamar Crear contorno pasando en el dto apropiado. Validamos el estado modelo en primer lugar. Y luego seguimos adelante y agregamos justo de la misma manera. Y entonces creamos en la raíz conseguir contrario posible el objeto. Y nos aseguramos de agregar ese nombre aquí. Entonces ya ves, una vez que consigues el ahorcamiento de esto, a menos que tengas algunas circunstancias extremas, tenemos que hacer cálculos y cálculos extra. E incluso entonces, sólo sería cuestión de mapear sobre r Bueno, sí, probablemente no obtendrías los valores calculados a través del detalle. Por lo que lo mapearás al tipo de objeto. Y luego haces todos tus cálculos, y luego insertas y guardas. Por lo que realmente no hay mucho para crear recursos en tu API. 33. Construct PUT Endpoint: Bienvenidos de vuelta chicos. Continuamos con nuestro viaje de desarrollo de API y estaremos explorando el PUT Verbo. Esta llanta. Ahora, put es similar a la publicación, excepto que se utiliza principalmente para o creativo no existe, o actualizar si no existe. Entonces, empecemos. Y cuando te probamos, eso te tendrá un poco más de sentido. Entonces lo primero que me gustaría hacer es replicar el tipo de restricción en cuanto a quién puede acceder al put para mí. Si no puedes crear el nicho no debería poder actualizarse, ¿verdad? Una vez más, contextos, reglas, pero sólo voy a autorizar. Y yo sólo voy a autorizar. Ni siquiera voy a hacerlo basado en reglas. Correcto. Por lo que el administrador puede crear más de una vez que estén autorizados. Puedes seguir adelante y crear un puedes seguir adelante y actualizar, lo siento, respecto a la regla de autocuidado. De acuerdo, entonces el siguiente sería el puerto HTTP, y ese es nuestro nuevo verbo. Y más o menos van a tener los mismos códigos de retorno excepto POR hacer algo diferente para éste. Entonces déjame solo comentar este uno nodos y cuando lleguemos y luego lo ajustaremos. Entonces tenemos el trabajo de nuestro método. Y yo sólo voy a copiar. Por lo que se puede mover rápidamente con la preparación de este método stub, ¿verdad? Y este será hotel de actualización. Ahora en cuanto al detalle que se utilizará para actualizaciones hotel. Bueno, en primer lugar, necesitamos el parámetro para el ID. Ya sabes, hay dos escuelas de pensamiento, o tal vez tres escuelas de pensamientos sobre este asunto. Pero digamos dos escuela de pensamiento. número uno es que necesito tener el DNI en la URL, igual que todo lo que teníamos era que se pusieran bien. Por lo que necesito, necesito que pases el ID con la URL. Pero entonces una escuela de pensamiento diría que el detalle también necesita tener el DNI. Por lo que eso significa que el cliente necesita pasar en el ID con la URL y positivo en el cuerpo de datos a actualizar. Ahora, ese es un punto de validación potencial donde se comprueba si el id que se envió en la URL coincide con el ID central en el que la carga útil o el dto. Y si hay un desajuste, entonces me devuelves la solicitud de mantequilla. De acuerdo, así que ese es un método para hacerlo y solo estoy hablando a través de él antes de que realmente lo haga. El otro sería que el detalle no necesita tener el ID porque el id va a estar en la URL. Por lo que espero pasar por encima de la URL con el ID del registro que desea actualizar. Y luego me pasas la información actualizada y la aplico en consecuencia. Ahora, eso también es una silla aceptable suficientes pensamientos, ambos son aceptables. Una vez más, el contexto gobierna. Por lo que algunos de ustedes se sentirán más cómodos con la doble comprobación, teniendo el ID en la URL y el cuerpo. Y luego revisas, y luego si no coinciden, entonces tu rechaza el intento. A algunas personas no les importa tenerlo un solo lugar subrayando junto con la operación. Entonces vamos a tomar el enfoque donde lo tengamos un solo lugar y no en el dto. Ahora por eso, podría. Utilice el crea hotel dto. Pero entonces para mí eso sería una especie de violar la regla de responsabilidad única que he estado promoviendo. Porque cuando dices crear Hotel De Jiao, le dice a cualquiera que lea el código que esto es para la creación. ¿ Por qué está en la actualización? Y ahora tienes dos opciones. Nuevamente, podrías cambiar el nombre de esto a tal vez algo así como upsert, donde este detalle sirve un doble propósito fuera crear y actualizar nuestra inserción y actualización, ahí el portmanteau upsert, ¿verdad? Pero entonces una vez más, la responsabilidad única depende de lo estricto que quieras ser. También podrías darte cuenta de que podrías tener campos variables en las ofertas 2D porque lo que aceptarías para la creación, podrías no exponer todo eso para potencial de la misma. Por lo que quieres considerar todas esas cosas. Entonces lo que haría en realidad es crear un segundo detalle. Por lo que creé otro, lo llamo actualizar hotel VT0. En este contexto, todo lo que está aquí para la creación es juego justo para actualizaciones. De acuerdo, así que no voy a seguir adelante y crear otra en absoluto. Yo lo hice fue sólo heredar. Entonces solo estoy haciendo esto por el concepto de responsabilidad única que tengo en mente. HACO Asuán para asegurarme de que cuando veas Actualizar detalle total, ya sabes lo que está lejos. No obstante lo contrario, lo que probablemente quieras hacer es simplemente ser más particular con los campos que expones en la actualización dto. Y ya hemos visto donde eso puede ayudar con algún control ya. Entonces sólo voy a seguir adelante con ese nivel de herencia. Una vez más, eso depende de ti. Y solo queríamos escribir código limpio y asegurarnos de que sea legible al final del día, ¿verdad? Entonces estoy tomando la ID en el parámetro y luego estoy tomando los campos para la actualización en el cuerpo de la solicitud. Entonces voy a empezar con mis comprobaciones de validación y cuándo decir si no estados modelo, el punto es válido, si no es válido, o si el valor id enviado es menor a uno, ¿me refiero a que debería ser al menos uno. Escribirlo para ser 0 son negativos. Entonces en cualquiera de las situaciones, solo quiero registrar y devolver las solicitudes de batería de que algo anda mal en tu intento. ¿ Está bien? Y entonces podemos pasar a nuestro try y catch. Y luego sabemos que para la sección de niños, vamos a estar registrando el error además de devolver el estado 500. De acuerdo, así que veamos qué vamos a intentar. Para intentarlo, necesito el registro original que necesita ser actualizado. Entonces lo que tengo que hacer es realmente guardar var hotel es igual a esperar Unidad 04, Tomates dot, tráeme. Tarjetas Directas, pone en mi filtro donde el ID es equivalente al ID que entra a través del parámetro, ¿verdad? Entonces puedo hacer otro cheque. Puedo ver si Hotel es equivalente a null. Entonces no pude haber hecho una búsqueda. A lo mejor ese Boston, la ID diez nuestras vidas, seis hoteles y un pase en diez con algo que actualizar. Voy a intentarlo y encontrarlo, pero necesito asegurarme de que realmente lo encontré bien. Entonces probablemente lo haría. Bud solicita. Entonces digamos, yo hago lo mismo aquí, pero en la sección de misiones de mantequilla. Y vamos a ver presentado sí es inválido. De acuerdo, así que no hay estado de modelo, así que algo fuera de registro con esa ID Xist no lo son. Y en realidad podrías incluso simplemente extender la unidad de trabajo para hacer lo existente. Pero lo que estoy haciendo es sólo conseguirlo una vez. Si es nula, entonces lo terminamos. No obstante, si no es nulo, entonces podemos seguir adelante y tratar de hacer nuestro granito de arena. Ahora voy rápidamente a especie de equiparar la herramienta sería usar el mapeador dot mob. Y entonces puedo ver en este punto cuál es la fuente, por lo que la fuente serie Hotel. Y luego voy a decir, quiero que sea norma, siento, la fuente sería el agua dto. Mis disculpas. Por lo que un hotel dto es la nueva fuente porque hotel dto cuenta con la última información. Y luego voy a ver Hotel a la derecha. Entonces si nos fijamos en esta sobrecarga de mapeador, se necesitan dos cosas, la fuente y un destino. Y entonces lo que va a hacer es simplemente fregar lo que hay en la fuente al destino existente. Por lo que efectivamente acabamos de decir lo que sea en esto, ponerlo en que si hay dos campos que no son iguales, entonces por favor actualicen esto todo con los campos que vienen del detalle, ¿verdad? Y entonces podemos saber ver Unidad 04. No un problema es que no hicimos ningún seguimiento. Entonces si estuviéramos haciendo camionetas, podríamos haber dicho apenas guardar botes. No estamos camionando cosas para ver actualizaciones. Y luego pasar en hotel. ¿ Verdad? Y luego nosotros, ya sabes, son los cuatro salvos. Entonces sólo una línea extra de código, no tan mal. Entonces la cosa es, recuerdo me explicaron que con el método de actualización, lo que hicimos fue ver, por favor preste atención a cualquier entidad aquí, tocarlo y cambiar su estado para modificarlo para que sea un modificado. Entonces cuando ahorremos, será especie de en el padrón para guardarse o actualizarse, ¿no? Si no tuviéramos r Si hubiéramos hecho opcional el seguimiento, entonces no habríamos tenido que dar ese paso extra de decir actualizaciones. Podríamos haber hecho el cambio y ver si el porque el camionaje es en realidad por defecto. Entonces solo estoy explicando ese poquito demasiado porque no lo mencioné. Entonces, después de guardar, podemos devolver contenido nulo. Entonces un contenido viejo parece un aplicar mantequilla, pero realmente es una herramienta para la cual es cualquier cosa en 200, lo cual es bueno, ¿verdad? Entonces eso es bueno porque no quiero tener nada que decirte como, vale, enviaste una actualización. Ok, no hay nada más que hacer. Estás bien para irte, ¿verdad? Entonces eso es lo que el no contenido está realmente lejos. Por lo que volviendo al que lo comentamos enseñaba, dirán estatus a los cuatro. Probemos eso. Entonces solo para llamar tu atención sobre lo que está haciendo el swagger, verás que cada tipo está bien codificado por colores. Entonces si la palabra no fue suficiente, entonces se ve el código de color puesto está muy bien dicho ahí. Y ahí está nuestro dto con los campos, y está esperando un valor id en los parámetros. De acuerdo, así que usemos cartero. Y voy a subir justo hasta el último total que creamos. Entonces este fue nuestro exitoso intento post y lo recuperamos. Por lo que el valor de ID es de seis. Entonces voy a decir Put es mi verbo y estoy pasando en busca como el valor ID, y luego voy a poner una coma. Esto fue mal escrito. Es un diminuto cambiarla, pero como veremos, la suscripción de coma no es realmente cinco, pero son 4.84 pilotos de luna Jamaica grand resort. Y mientras que los países Jamaica. Entonces dejemos eso. Entonces sigamos adelante y mandemos a ver qué pasa. Correcto. Método no permitido. Y oh, creo que sé por qué no pusimos el parámetro solo respuesta en el puerto. Entonces de la misma manera que tenemos esto en el HTTP GET después de especificar en el puesto, que debería tomar ese parámetro. Entonces los negocios estaban en eso. Y intentemos esto otra vez. Por lo que cartero de piel de buey, creo que eso debería conseguir el 401, este dímero. Eso es mejor. Por lo que el método 405 no permitido significa que o tienes algo mal con su solicitud o tu punto final necesita ser arreglado demasiado. Holder Quest debe mirar. Entonces solo sepan que eso es con lo que nos encontramos. Teníamos la solicitud correctamente, pero luego faltaba el endpoint. De acuerdo, entonces es bueno ver estas cositas en el camino para que cuando sucedan puedas tomar el control de la situación. Entonces lo que tenemos que hacer es conseguir un Tolkien. Y creo que todavía tengo mi solicitud de usuario por aquí. Por lo que es realmente genial con ambos el dinero siempre puede volver atrás y obtener solicitudes previas. Entonces déjame solo agarrar mi Tolkien, volver aquí, agregarla al encabezado de autorización, y luego intentarlo de nuevo. Y está golpeando a mis sentados un punto de ruptura ahí. Está bien, así que sigamos. Y ahí hay herramienta para ningún contenido, lo que ha procesado con éxito las solicitudes. ¿ Qué no está devolviendo ningún contenido? Bueno, sin contenido, pero una vez más, una herramienta para es un buen tipo de retorno. Entonces pasemos ahora a nuestro Git anterior y veamos qué pasa. A Tolkien. Así que déjame seguir adelante y poner este Tolkien aquí y hacer el get. Y luego veremos que hay coma R y hay 18 posibilidades para 4.8. Por lo que a nosotros respecta, ¿el put funciona? No, sólo construir en lo que sí poner hace y no lo hace. Do. ¿Ves si te pierdes algo? A ver. Tienes algunos campos que no son obligatorios. ¿ Todo bien? Correcto. No, es difícil probar lo que voy a seguir adelante y modificar este dto. Entonces déjame ir para crear las necesidades, y voy a decir que no se requiere el campo de dirección. Está bien. Fui a reiniciar. Entonces por qué este reinicio y déjame solo explicar qué es wearable hacer. El put siempre va a reemplazar los datos. Lo único que hace es que reemplaza prácticamente la identificación ¿verdad? Entonces cada vez que vas a hacer un puesto, tienes que tener en cuenta que cualquiera que sea la información que haya ahí, lo va a usar para reemplazar, digamos que si no proporciono una dirección, digamos que abordemos toda esta carga útil, ya no se requiere. No proporciono dirección. ¿ Qué estoy haciendo el puesto estoy haciendo la actualización, verdad? Mismo hotel y estoy haciendo la actualización que envío. De acuerdo, así que estoy consiguiendo una herramienta para ningún contenido, pero mira lo que pasa con mis datos. Por lo que note que teníamos volumen no abordado. Ninguna dirección es nula, digamos la mitad. Tener cuidado siempre que estés usando este tipo de objetos son al menos para poner porque siempre lo va a reemplazar con los datos que obtuvo. Por lo que es en ti asegurarte de que tus validaciones representen la calidad de los datos que realmente quieres de tu aplicación cliente, ya sea que estés construyendo una planta o sea un tercero el que está construyendo el cliente. El API es tuyo y tienes que establecer ese estándar porque no se requiere, cargo un valor nulo para estar ahí. Sepa una vez más, eso podría ser bueno o malo en función de su situación, pero así es como funcionará el put. Entonces voy a animar a tu retiniana a pausar, replicar el endpoint de puesta para el controlador del país. Y luego vamos a ver algo más como necesita al puesto y cómo podemos entrar un poco más necesidades de enero solos ahora mismo. Está bien. Entonces estamos de vuelta y espero que hayas hecho una pausa e intentarlo tú mismo, pero ya hice el país de actualización y solo te guiaré rápidamente. Aquí no hay nada, eso es todo. Está fuera de lo común en comparación con los hoteles. Todo es bastante estándar. Tenemos el detalle crear contrario el cual necesito actualizar. Ahí vamos. Es bueno que esté haciendo esta revisión. De acuerdo, así que actualizamos contradicen para contradecirte. Y todo lo demás simplemente se ve de la misma manera. No. Algo que quiero señalar con la actualización contradicen a ustedes es que he incluido esta propiedad la cual es una lista de hoteles. De acuerdo, así que sí, posiblemente, podría ponerlo aquí y luego quitarlo de éste y luego dejar que el país dto herede de la actualización contradiga A sensibilizar a todos estos y a la lista. Por lo que esto conseguiría todo. Podrías hacer eso. Pero entonces esto es solo conducir a casa el punto de que realmente quieres especie de mantener tus detalles lo más únicos posible. Porque entonces, ya sabes, puede que hayas compartido se siente orilla, pero entonces es posible que tengas campos únicos también en el camino. Ahora la relevancia de esta lista de hoteles es que en realidad puedo usar mi puesto para actualizar, acompañar y también insertar nuevos hoteles son hoteles relacionados porque recuerda que los hoteles, Esto significa que un país tiene una lista de hoteles, ¿no? Uno contrasta muchos hoteles, razón por la cual podemos referirlos por lista aquí. De acuerdo, así que vamos a explorar cómo sería eso. Entonces si voy a mi documentación de swagger y luego miro la carga útil potencial que ves aquí donde me están mostrando que puedo poner en el nombre, el nombre corto, y luego una variedad de hoteles. Y entonces puedo poner en detalles para el hotel. Y por supuesto el hotel tiene, pero entonces deberá detalles para el país. Y esto es lo que realmente querían decir cuando dijeron que podría volverse cíclico porque es sólo una gran cosa tras otra, tras otra. No obstante, vamos a probar esto. Vamos a insertar un nuevo hotel. Lo sentimos, un nuevo país con unos nuevos hoteles. Entonces solo voy a duplicar esta camarilla postsecundaria, digamos Duplicar pestaña, ya que ya la tengo ahí. Antes de hacer eso, déjame ver todos los países que albergo. Realmente no tengo pruebas con country. Entonces déjame conseguir todos mis países para poder ver mis opciones. Entonces tengo jamaica, Bahamas, e Islas Caimán y ver si necesitamos actualizar Islas Caimán por culpa de Isla Caimán, deberían ser cosméticos Island Zoo, pero sigamos adelante y actualicemos eso. Entonces voy a dejarme sólo coger mis cojinetes. Entonces voy a tomar la carga útil de la muestra son de nuestro jadeo. Y luego el país lo lamenta, la identificación del país que lo quiero. Sólo estoy tratando de encontrar donde estaba la identificación consciente es tres. Por lo que el nombre será Islas Caimán. El con, el punto final sería country slash tres. De acuerdo, el nombre corto sigue siendo CI. Por lo que una vez más, hay que proporcionar el valor que esperas tener su después. Está bien. Y luego voy a ir al interior de la sección del hotel, quitarme cualquier cosa que realmente no quiera. De acuerdo, como casi todo hecho, déjame volver al detalle. Acabo de notar que estoy listando viejo hotel dto aquí, así que no dije lo que podría consolidar materiales son buena razón por la que no me estoy consolidando. Dije Hotel dto. Hotel dto luego pone en el id. Pero si estoy haciendo un inserto actualizando Islas Caimán mientras quiero insertar un nuevo hotel automáticamente, lo que significa que no necesito el valor ID. Por lo que este detalle es en realidad incorrecto. Lo que debo tener aquí es crear. Hotel VT0, que es una mejor representación de los datos que deseo recabar. Y eso también eliminaría el exceso se siente como el país y la lista ampliada de fotos. Entonces intentemos eso otra vez. Está bien, así que ahora cuando miro en swagger y miro el esquema que se ve mucho mejor. Por lo que puedes ver los detalles son muy importantes. ¿ Qué requiere de su usuario? Se asegura de exponer sólo eso. Entonces voy a tomar esta carga útil corregida, volver a Cartero y esto va a ser mucho menos confuso para mí, ¿verdad? Entonces intentemos esto otra vez. Esto va a ser Islas Caimán con i capital I, ¿verdad? El nombre corto sigue siendo CI tengo que proporcionar eso. Y luego en la sección de hoteles, realidad puedo enumerar todos los hoteles son objetos de hotel. Por lo que este corchete cuadrado significa área. Entonces la llave rizada encapsula todas las propiedades del objeto de las que puedo decir coma y enumerar segunda coma OSU y seguir poniéndolas, ¿verdad? Entonces aquí voy a poner el Ritz-Carlton y sus direcciones, Grand Cayman, tiene una calificación de 4.5 y no en el hotel local. Entonces estos son en realidad sostener los en grand Kim y él puede, si quieres verificar eso, sin embargo, no voy a especificar el identificador del contenedor. De acuerdo, así que en realidad voy a quitar la identificación de clincher, pero luego sí lo tengo como se requiere, así que lo voy a quitar en la carga útil. Y lo que voy a hacer es a mí el cambio en el código mismo para el dto. Vamos a ir allá y hacer que no se requiera estos sólo para este experimento. Y probemos eso. Por lo que cambio medio tendría la lista de fotos. momento no están haciendo referencia a ningún país. No obstante, están por debajo de la carga útil del país donde las ideas contrarias tres, así que enviemos. Y estoy consiguiendo una herramienta para ningún contenido. Entonces déjame ir a revisar. Entonces déjame conseguir la lista de hoteles y el ver qué bicho Kim. De acuerdo, aquí vamos. Por lo que tenemos el hotel local regresando con un Sullivan ideal y el Ritz-Carlton regresando con una identificación de ocho. Y ambos son partes del país tres son clave en mente. Entonces ya ves, así es como en realidad puedes usar el put. Entonces, ya veremos, ¿existe esta cosa? Si no, lo crearé. Y la única forma en que sabe que existe es si se proporciona el valor id. Entonces cuando no hay valor ID, se va a decir, esto no tiene identificación. Entonces seguiré adelante y lo crearé. No obstante, debido a nuestras restricciones que ponemos en nuestro punto final, no estamos permitiendo que la gente simplemente use el put para crear porque sí verificamos que un valor id debe estar presente, son un valor ID sensato debe estar presente antes de movernos el. Entonces esas son las dos restricciones que puedes usar para asegurarte de que el put opere como lo quieres a quien sea que sea operación global es muy versátil. 34. Construct DELETE Endpoint: Bienvenidos de vuelta chicos. En esta lección, estaremos explorando cómo eliminamos datos a través de nuestra API. Por lo que en realidad ya he creado esta acción. Si quieres de nuevo, pausa y activa. Entonces te estoy dando una vista previa a escondidas todavía tiene lo que necesita ser, al menos inicialmente, el verbo es HTTP delete. Tenemos que hacerle saber que debe esperar algún parámetro en forma de ideas y entero lo autorizamos. Este es otro que probablemente quieras hacer cumplir un rol para administrador porque estamos borrando. De lo contrario puedes simplemente dejarlo como autorizar. Y sabemos que los códigos de respuesta aquí serían 4024500. Para que puedas hacer una pausa e intentarlo y luego podemos comparar notas. Entonces lo que tengo en este delete hotel axon es una validación para asegurarme de que el valor ID tenga sentido. Ese es el número uno. Entonces lo hacemos y luego rechazamos hace una solicitud de batería. Si no tiene sentido, entonces voy a tratar de atrapar su arte en registro y devolvernos el código de estado, lo siento, de 500. Pero entonces cuando intenta operar, lo que hace es reintentar el hotel con el id que fue pasado. Verificamos si ese es hotel existe. De lo contrario volvemos a ver mala solicitud y registramos el error. De lo contrario, vamos a eliminar el hotel y guardar nuestros cambios, luego devolver ningún contenido. Entonces ya ves que en realidad no había mucho para eliminar el hotel. Por lo que lo mismo vale para el país. Es más o menos el mismo método que tenemos el país delete, tenemos el mismo estatus es si quieres extender los mismos permisos en consecuencia. Y pasamos, obtenemos la identificación, verificamos que el volumen tiene sentido. Y luego intentamos la operación, consiguiendo el país, validando que no es un número falso. Y luego adelante y borrándolo, si llega tan lejos, regresamos un contenido nulo de dos o cuatro. Entonces lo que queremos hacer es probar eliminar un hotel versus probar eliminar un contrato. Y vas a ver por qué estoy poniendo énfasis en esas dos pruebas. Entonces con la introducción del endpoint delete, fútbol se llena un poco más de bobina. Ves borrar ser promovido aquí. Y lo que vamos a hacer es usar cartero e intentar nuestra eliminación. Entonces tienes el punto final. Ya sabes, necesitamos el volumen ID en la URL. Vamos a elegir nuestro verbo como borrar. ¿ Todo bien? Y lo que voy a hacer es elegir una foto que realmente no quiero, ¿verdad? Entonces creo que éste, éste fue sólo un test aleatorio. Ya ves que sigue diciendo cadena, cadena acaba de guiar los valores por defecto están ahí en el ejemplo de carga útil. Entonces voy a borrar hotel con el DNI número cinco. Entonces en mi borrar. Solicito Pongo en la barra URL x5 y luego envío. Por supuesto que necesito autorizar. Entonces déjame retroceder un poco y tendencia conseguir Tolkien su gol. De acuerdo, aquí hay un Tolkien. Agarra la plática y el jersey John, ficha al portador de autorización. Ahí vamos. Y obtenemos nuestro no contenido. Entonces si miro hacia atrás a la lista, no debería ver el hotel con identificación cinco. Ahí está. Va cuatro luego seis. Entonces cinco se ha ido. Ahora eso es hoyo. Eliminaríamos un hotel. No, la cosa con los países que el país tiene hoteles. Entonces es un poco más arriesgado cuando eliminamos un país que en realidad vamos a tener que quitar los hoteles también. Entonces vamos a ver cómo se ve eso. Entonces voy a decir País. Y mirando hacia atrás, veo que tenemos que en Cayman tener V1 en Bahamas. Entonces intentemos borrar lo contrario de Bahamas. Sólo tiene un hotel, así que lo haremos sólo, por el boletín hizo un sacrificio de punto E1 o E2. Siempre lo podemos sumar más adelante. Entonces lo que voy a hacer es ver país con el ID3 e ir por aquí. Ponga eso ahí. De acuerdo, yo e3 y luego mandar. Y vemos de dónde conseguir un alma sin contenido. Si miro la lista de países que miramos la lista de países no debería ver. Ah, borré K menor. Eso está bien. Entonces no necesitaba ese Kamen, así que vamos a NF2 países 12, pensé House borrando Bahamas, disculpas. Entonces eso significa que ninguno de los hoteles que tienen ID value tres debería estar ahí para que enviemos, y ahí está. Por lo que tenemos un contrato con el DNI un país con ID dos, país con id1, uno, etcétera. Por lo que no queda ningún país con ID3. Y eso es porque en nuestra migración cuando creamos la base de datos. que puedas ir al primer archivo de migración, yo lo llamo la base de datos creada. Verás en la configuración que la restricción en la clave externa fue que decía referida subasta punto cascada. Entonces cascada significa que si haces algún cambio al padre, decir país, suelo, tienes contrario siendo el padre y los hoteles son lo suficientemente conscientes. Por lo que ahí están los niños en guardias. Si realizas algún cambio al acuerdo contrario, se pasaría en el del hotel. Entonces en este caso, los genes que estamos haciendo es que estamos eliminando al padre requerido. Entonces en borrar, quiero hacer cascada, es decir, lo que sea que le hagas al padre, replicar esa acción a través del niño. Por lo que esto realmente se puede cambiar. Bueno entonces tendrías que cumplir con la modificación en el archivo de contexto y luego ejecutar otra migración para que sepa que quieres conocer las artes de subasta o restringir. Significado. Y usualmente lo hago restrinjo porque si hay registros de niños, no quiero borrar a los padres. Entonces eso significa que una vez que son hoteles asociados a este país, no se puede eliminar. El país, no ha restringido la madera. No obstante, escribe notas en Cascade, y como ves cuando haces ese peer in record, se va a hacer cascada a través de todos los hoteles. Entonces hay que tener cuidado con eso. Asegúrate de que si esa configuración obtiene en tu API, es deliberada, así es como quieres que funcione. Pero esto es algo que puede causar una pérdida masiva de datos si lo es, si se va sin ataduras. 35. Revisar y añadir cambios a GitHub: Muy bien chicos, así que estamos una vez más, ese es otro hito mientras vamos a hacer es sacudirse en nuestros cambios. Por lo que agregamos todos los endpoints faltantes para el post PUT y eliminamos solicitudes tanto para hoteles como para países. Y los conceptos que has aprendido a lo largo del camino se pueden aplicar Bueno tantas veces como los necesites, tantos endpoints como necesites para facilitar, puedes aplicarlos también. Por lo que sólo vamos adelante y vamos a conseguir cambios, agrega nuestro mensaje. Y entonces lo que voy a hacer es simplemente comprometerme todo y hundirme. Y una vez que eso se complete, entonces puedes quedarte para la próxima aventura. 36. Funciones de valor de valor que se incluyen en la sección: Hola chicos. Por lo que estaremos iniciando una nueva sección de nuestro desarrollo de API. Y realmente en realidad esto es sólo una bala características de valor agregado. Hemos hecho bastante trabajo. Ya tenemos una API en funcionamiento con una arquitectura limpia agradable que se puede extender fácilmente. No obstante, hay ciertas cosas que queremos aprovechar a la hora de dominar el núcleo. Y estas características son, estas asignaciones nos permitirán reducir parte del código repetido que tenemos a lo largo de nuestra aplicación. Entonces digamos por instancia, uno, seguimos repitiendo, intentamos, atrapar. Cada vez que hacemos una operación, tenemos el triciclo todavía, así que estaremos buscando poner código para reducir eso y manejar flechas de manera global. Ya que realmente hacemos lo mismo casi cada vez, todo lo que estaría mirando será reducir nuestra necesidad de verificar ciertos, hacer ciertas comprobaciones antes de que completemos una operación. Por lo que poner en acción filtros también será poner mecanismos para ayudar a acelerar la recuperación en el procesamiento de datos como el almacenamiento en caché, la paginación. Entonces estaremos viendo todas estas cosas y empezaremos con la implementación de la paginación. Entonces mantente atentos. 37. Implemente de Page: Está bien, así que empecemos a buscar paginación en esta lección. Nulo. Un pequeño bache nos gimió para caminar paging es, y por qué lo necesitamos. Paging pláticas de ambos segmentar los datos que se están devolviendo. Entonces ahora mismo lo que estamos haciendo es que estamos haciendo un BigQuery, obteniendo todos los valores en una tabla determinada todos a la vez. Y si bien puede verse bien porque sólo tenemos tres países y cinco hoteles. Cuando implementa esta API para uso internacional. Y realmente estás almacenando hoteles en 200 países de todo el mundo, te darás cuenta de que tus datos van a crecer exponencialmente. Y entonces definitivamente necesitas un predictor tú mismo en tu sistema de demasiadas solicitudes y la carga de servir esa cantidad de datos todos a la vez a potencialmente muchos clientes, además de proteger a los clientes de tener que desarrollar formas internamente de segmentar los datos porque están consiguiendo demasiado todos a la vez. Por lo que la paginación es una forma agradable, efectiva, y eficiente de segmentar los datos, permitiendo que el cliente vea, me gustaría que estos muchos registros. Y entonces sólo regresamos de acuerdo a lo que pidieron. Empezó con Boltzmann en la pantalla porque lo que queremos de nuestro cliente es que cuando están haciendo esa llamada de servicio, pasarían en parámetros para decir algo así como el tamaño de página que quisieran. Entonces page dice significaría cuántos registros. Entonces digamos que dicen diez. Y entonces dirían y me gustaría el número de página. Entonces ese es un número de página. Entonces puedo teclear fingiendo las órdenes de enlace, ponerlo aquí abajo en los params El número de página Chanzeaux sería igual a algo así como uno o dos. Por lo que necesitamos saber implementar código para decir que si piden un tamaño de página de diez, eso significa que querían diez registros. De lo que piden la página tres o algo que no sea la página uno. Eso significa que le gustaría que el 30 requerido hasta requerido 40. Correcto. Algo así. Para que nosotros, si están exhibiendo diez hoteles en ese momento en sus doctorados, cuando ellos, cuando vayan a la página siguiente, en la página siguiente, simplemente incrementarían esto y no saben que vamos a conseguir 40 a 50, luego 50 a 60, etc. Entonces si tenemos 500 hoteles, en ningún momento nadie estaría consiguiendo los 500, no estarían sacando trozos de 50 o lo que sea que estén pidiendo. Por supuesto, podemos limitar el máximo. Entonces lo que tenemos que hacer es empezar creando un nuevo modelo, alguien que llame a esta solicitud de modelo. Params es sólo una clase y sólo será un modelo o forro. Las restricciones son los nombres de parámetros que hay mucha pasión, ¿no? Entonces antes de hacer algo quería iniciar o declarar la pizza máxima es de 50, por lo que nadie puede solicitar más de 50 registros en su momento. Por supuesto, esto es mío o tuyo. Entonces si quieres limitarlo a diez, quieres abrir a un 100. Eso depende enteramente de ti. Haz lo que sea mejor para tu sistema. Entonces estamos ajustando eso a 50, escribe nulo. Y luego tenemos otra propiedad que lo vamos a llamar número de página. Y otro, éste es privado que vamos a llamarlo beats lados. De acuerdo, entonces el, estos son sólo por defecto. Entonces estoy viendo que se especificó el caso de numeración de páginas por defecto nano. El número de página predeterminado será uno y el tamaño de página predeterminado será diez, ¿verdad? Pero luego voy a hacer el tamaño de página de la versión pública del tamaño de página, donde voy a decir manualmente git. Y aquí voy a devolver subrayado tamaño de página. Pero entonces también podemos establecer el valor para que el tamaño de página sea igual a. Y quería decir que el volumen era mayor que el tamaño máximo de la puja. Entonces esta es una pregunta. Simplemente usaría un operador ternario para ver si es mayor que el tamaño máximo de la puja, entonces enviamos el tamaño del cordón. Entonces por eso necesitaría ahí, correcto. Entonces si solicitaron más de diez, más de 50 registros, entonces el default es de diez, ¿verdad? Ahí, solicitaron más de 50, luego solo enviamos de vuelta 50. De lo contrario, enviamos valores. Entonces valor aquí es una palabra clave como ves, resaltada en azul, al igual que lo es para retorno. Por lo que el valor sería cualquier valor donde sentado aquí. De acuerdo, así que aquí sólo tenemos un default se pone nuestro inicializándolo en uno. Por lo que no hay restricciones reales están en esto porque no sabemos en qué página están. No obstante, o lo que éste donde ver siempre devolver el tamaño de periodo. Entonces cuando obtienes el retorno, lo que eso hace es sin embargo, al sentarlo, si el tamaño de página solicitado es mayor a 50 o el valor que pongas ahí, entonces regresamos ese máximo. De lo contrario, entonces podemos seguir adelante y devolver ese valor. Ahora lo siguiente que quiero hacer es modificar el controlador. Entonces en este punto, voy a simplemente modificar ponerme consciente porque ese tipo dijo que no quiero ese punto. Alguien poder simplemente conseguir todos los registros a la vez, eso sería problemático para mi asistencia. Entonces lo que haré es modificar, conseguir países. Por lo que este endpoint ya no es lo hace todos los países. Lo que ahora vamos a ver desde Query. Entonces, ¿verán desde cuerpo la entrada aquí? Creo que cuando estamos haciendo el post, lo verías desde cuerpo. Para que las solicitudes tuvieran los datos en el cuerpo, ¿no? Entonces lo habríamos hecho. Déjame ver si puedo encontrar alguno de esos con el cuerpo. Ahí vamos. Entonces ese es el de cuerpo que se lo toma de ese quienquiera De consulta. Miraremos dentro de la cadena de consulta que está siendo posible para los params. Entonces por eso lo llamé para solicitar piratas son parámetros, ¿no? Entonces desde Params donde busca campos que coincidan con los nombres como se describe en nuestro RequestModel. De acuerdo, entonces es el mismo tipo de concepto que el dto write solicita armas de fuego. Entonces solo voy a llamar a estas peticiones armas armas de fuego Award params, esa es una palabra clave. Por lo que en ninguna parte buscamos nuestra consulta. Cadena de consulta, lo siento, que tendremos en campos para el tamaño de las pujas y el número de página. Por lo que ahora el próximo desarrollo estará implicando pasar esa información. No consigas todos los comandos. Entonces recuerda que es en nuestras unidades son tenedor o guitarra que ves, oh, solo devolvérselo todo de todos modos, ¿verdad? Entonces lo que voy a hacer es pausar los parámetros de consulta no a los saltos y por supuesto eso va a requerir una anulación. Está bien. No quiero deshacerme del origen. Voy a llegar a ella puede servir algún propósito de lo contrario. Entonces solo voy a crear otra, ¿verdad? Entonces volvamos a nuestras unidades de Unidad 04 sobre especie del repositorio genérico y tenemos consigue todo Como es. Entonces lo que voy a hacer es crear nueva declaración. Noto tengo este nuevo datatype aquí tengo ph list. Verás más sobre eso en un combustible. Por lo que tengo tarea se pone todo y solo estoy consiguiendo los incluyes así como los parámetros de solicitud. Entonces ni siquiera voy a permitir que hagan el filtrado y todas esas cosas porque realmente no estamos interesados en eso ahora mismo lo que estamos consiguiendo todo, pero queremos facilitar la PGA. Entonces permítanme simplemente seguir adelante e incluir lo que puedo incluir a quien haya declarado este tipo de datos aún, para que podamos dejar eso en paz. Y como eso es conocer la interfaz, necesito ir a actualizar el repositorio genérico para que pueda implementarlo. De acuerdo, entonces ahora que está ahí, ¿qué acorde pongo? Entonces lee Andrew ellos haciendo todo lo que estoy haciendo aquí. Bueno, tal vez no todas las cosas porque OrderBy anormal, pero sólo voy a tomar ese código, pegarlo, no escuches y el retorno. De acuerdo, así que sólo voy a despacio para que podamos ver exactamente lo que está pasando. Entonces no hay expresión. Puedo tomar toda la expresión. tenemos facilidades para el incluir, pero no tenemos ningún pedido POR así que tomaré ese apuntes. Sé que lo que necesito agregar es una facilidad para realmente bien filtrar nuestro pico exactamente lo que quiero de la consulta porque esto todavía está devolviendo todo. Entonces en este punto solo voy a seguir adelante y ocuparme de este error, que es la lista de borde IP. Y si miras las sugerencias, la biblioteca que quiero no está ahí. Entonces voy a ir a New gets y conseguir su dinero o estos. Por lo tanto administrar nuevos paquetes Y OBTENER. Boroughs de Gautam. Y luego voy a buscar huevos dot listas paginadas. Por lo que esta es una biblioteca muy prominente que ayuda con la paginación. Entonces solo diremos expansionista, núcleo MVC. Adelante e instala eso y sabe que está instalado. Podemos volver atrás y tratar de cuidar esos errores. Por lo que este es repositorio genérico. No, puedo decir usando listas de páginas x-dot, así que seguiré adelante y haré eso. Entonces hacer el negocio esto es muy posible. Pero entonces, ¿por qué hacer todo eso cuando hay biblioteca, no? Entonces ve al genérico. Incluyamos todas las referencias faltantes. De acuerdo, y entonces lo genial aunque es que no escuchan, es quejarse porque tenemos IP es esto sí regresa pestaña o haciendo para listar aquí. Por lo que la lista de páginas nos da la función de extensión que nos permite decir a la lista de páginas se hunde. Y entonces el nista de dos páginas tomará dos parámetros. Quiere un número de página y el tamaño de página. De dónde vamos a sacar eso de nuestros params de solicitud, de acuerdo, así que en realidad fui hasta a tomar el nulo de esto, y francamente me voy a quitar los intrusos. Déjame solo hacer un pequeño refactor porque ahora estoy pensando en su siempre que llegue toda la noche en Pij es cuando están paginando los datos, probablemente no necesiten incluir nada sobre el país ni nada más, ¿verdad? Porque solo están listando adultos cuando cuando obtienes los detalles de algo, entonces probablemente quieras incluir. Entonces quiero decir, eso depende de ti. A lo mejor dejaré el incluye porque pude ver valor en su temprana de la incluye balas y solicitar armas de fuego. Definitivamente queremos que eso sea obligatorio para esta versión. Entonces déjame poner esto al frente. Creo que por eso está ahí esa línea roja. Porque cada vez que tengas el departamento, hace este estudio, tienes que tener el nullable quiere hasta el final. Entonces ahí vamos. Por lo que solicita params. Pero a la tarea que está en los puntos de consulta como sin seguimiento No.2 ph nist y estaban pasando los params de consulta punto en el que se sientan primero el número de pH. Por lo que es importante mirar siempre todos los requisitos y asegurarte de que estás pasando el volumen correcto y luego querían tamaño de página y sí, sí tengo algún lugar donde puedes conseguir eso. Está bien. Y entonces creo que estas áreas ahí porque necesitamos ser un C. Ahí vamos. Entonces no, podemos obtener una lista de páginas de cualquier cosa que tengamos en nuestra base de datos y necesito ir y corregir mi repositorio donde pueda esto no anulable. Y claro que necesito moverlo al frente. ¿ Está bien? Por lo que ves a medida que construyes sobre tu EPA, diminuto G y diseño hecho en el camino, en realidad se requieren pero, ya sabes, una vez que sabes lo que estás haciendo sí, cerca te pones encima de ello. Entonces déjame solo hacer una construcción y asegurarme de que no me he perdido nada más que veo aquí. De acuerdo, entonces están viendo que eso se pone todo. No hay ninguno. Ok, entonces este error es porque sigo usando la función get Dawes. Entonces bien sabe que tenemos que bajarnos de funciones para distinguir entre las dos de ellas. Lo que me encanta hacer es pasar exactamente los parámetros que el 1e No, quiero necesidades, ¿verdad? Entonces, bueno en realidad eso no está funcionando porque aunque uno todavía toma más de uno, así que sigue confundido en cuanto a cuál es el que estoy tratando. Entonces lo que voy a hacer probablemente debería haber hecho esto desde el principio. Sólo voy a cambiar el nombre y. Haz uno nuevo o que algún día trataron de ser genérico. Janet Mock incendios. Entonces déjame solo llamar a esto se paginen. Por lo menos. Creo que ya está bastante claro. Entonces me gustaría repositorio genérico, lo hacemos en un repositorio genérico. Hicimos ese cambio en cuanto me entere que es ahí vamos, y ahí vamos. Entonces tomemos este giro forestal. Por lo que sólo hicieron esto los países. Y el hecho es que lo hemos hecho en un solo lugar y es así de fácil ir a cualquier otro controlador e hizo ese cambio porque el duro trabajo ya estaba hecho. De acuerdo, así que esa es una de las ventajas de bombear Clean Architecture y tener un error aquí y no nos surgieron locos, pero también lo hace arreglado. De acuerdo, así que intentemos eso otra vez. Y cuando lleguemos a este punto y tratemos de traer de vuelta los colon true con el tamaño de la puja 50 y, y la página número cinco, en realidad voy a establecer un punto de ruptura aquí para que podamos ver los parámetros entrando o tal vez extremidad y sólo apaga y 39. De acuerdo, intentemos eso. Entonces manda, está bien, así que está calentando los puntos de rotura. Por lo que eso significa que se reconoció la solicitud. Ver para conseguir las solicitudes params ahí obtenemos 515. Está bien. Y continuarán. Y sabemos que vamos a conseguir bicho todos nuestros países. El pedido es para un PID dice un abismal, pero eso no existe sólo de dos hoteles. Tan bien a los países, lo siento, para que uno sea el primer indicio de que esto está funcionando. Entonces intentemos esto otra vez. Quiero página número uno con P, su tamaño dos. Tendré dos países corriendo por uno borrado, ¿verdad? Probemos eso. Entonces cuando enviamos, solo obtenemos la herramienta, correcto. Si solicité la página uno con sólo uno que sólo estoy recuperando uno si solicitaba pH diez, lo que significa saltar a los décimos registros. Entonces lo que hizo nuestra lista de expedientes bibliotecarios fue que modificó automáticamente la consulta con take and skip. Déjame saltar por ahí. Entonces en link o Entity Framework más bien, en realidad puedes decir algo así como consulta. Y puedes hacer una garrapata. Por lo que se toma este número, a la derecha, devuelve un número especificado de elementos contiguos, y luego se puede ver dónde, donde dice bypass un número. Entonces eso es realmente lo que está haciendo. Entonces cuando enviamos el tamaño de la puja o digamos una página número diez, significa saltar diez, saltar diez registros o a nuestro salte diez veces este número, ofreciendo tarjetas y luego traemos de vuelta estos mini, algo así, ¿verdad? Entonces todo eso, sonaba confuso, realmente no es tan difícil de escribir. Yo probablemente soy yo odia UNO más difícil de lo que realmente es lo que las realidades que ni siquiera teníamos que hacer todo eso por que nuestra biblioteca lo hiciera por nosotros. Words is 2pi se enumera, hace eso automáticamente, y es por eso que toma parámetros de consulta tal vez. De acuerdo, como que entro a esa clase detrás de ella. Entonces eso está bien. Entonces sí, así es como implementamos la paginación. Entonces obviamente sí, probablemente no estés viendo todo el poder de la misma porque solo tengo muy pocos registros. No obstante, si vemos que tal vez 50 hoteles en esta base de datos y entonces dijimos queremos página cinco y solo diez registros. Entonces diría Dame eso. Creo que mis matemáticas están ahí fuera, pero espero que consigas lo esencial. Entonces correcto, y todo lo que tenemos habilitada la paginación en nuestra API. Y una vez más, se trata tanto de usted como de la solicitud solicitante. Y si no se proporcionaron estos parámetros, entonces por defecto, le hemos dicho a la clase de params de solicitud que devalúa por defecto a la página número uno y un máximo de 50. 38. Gestión de errores global: Oigan chicos, bienvenidos de nuevo. Entonces en esta lección vamos a estar hablando de manejo global de errores. Entonces estoy empezando en el controlador para los países. Y ya habíamos mencionado antes que quisiéramos reducir la necesidad de repetir este try-catch. Por lo que cada vez ponible para hacer una operación mientras es muy esencial, se vuelve repetitivo con el tiempo porque tenemos cuatro funciones donde seguimos escribiendo try catch, try, holandés try-catch. Y para todos los demás teléfonos en él sería importante. En. Entonces lo que queremos hacer es implementar forma global de manejar excepciones y reducir la necesidad de las declaraciones repetitivas try-catch. Entonces lo que queremos hacer es estandarizar lo que sucede cuando captamos un error. Porque cuando nos agarramos, en realidad hacemos lo mismo. Lo único que es una especie de dinámica sería el, la parte donde vemos la ubicación, que para mí es en realidad algo opcional y probablemente no necesariamente tienen que hacer la chispa. Pero el punto es que el mensaje es relativamente el mismo y siempre damos ese código de respuesta 500. Entonces lo que queremos hacer es tener una forma estándar de representar un aerosol y modelos. Simplemente voy a crear una nueva clase y la voy a llamar. Y luego en error vamos a tener tres campos. Entonces vamos a tener código de estado. Vamos a tener mensaje I. Entonces vamos a tener un tercero donde estamos proporcionando el mensaje como objetos JSON serializados. Entonces para este tendremos Newton JSON, neutrón suave, lo siento, dot JSON. Entonces esa es toda su clase o error se encargará de eso. Lo que quería hacer es extender nuestra tubería de inicio, pero voy a usar las extensiones de servicio como lo que hemos estado haciendo durante las últimas veces. Y voy a tener un nuevo, y estamos llamando a esta nueva función configure controlador de excepciones. Y esta vez está consiguiendo el ducto de middleware. Por lo que originalmente habría meterse en los servicios esta hora se mete en constructor de aplicaciones. Está bien. Entonces en esto, vamos adelante y decimos punto arriba, Usar manejador de excepciones. Muy bien, así que el punto make core aplicación dentro y fuera tiene su propia excepción allí. Entonces estamos haciendo como una anulación para ver que realmente así es como queremos que operes. Entonces use manejador de excepciones y que necesitamos a nuestro pequeño Tolkien o lambda buscando Tolkien. Y luego aquí dentro abrimos y cerramos llaves punto y coma al final. Entonces dentro de este bloque, y cuando decir doctrinas de error tenían esto no soy yo agregando el middleware costal llamado null. Y voy a ver asíncrono y mis conocimientos expertos Tolkien sobre cuándo llamar contexto y luego mi lambda R1. Entonces otra vez, para otro objeto, está bien, entonces lo que hago es cada vez que voy a hacer uno de estos bordes, me muestra tanto el punto y coma al final de los escritos son, los paréntesis están ahí fuera, así que no lo olvido más adelante. Está bien. Entonces vamos a ver, poner algunos. Alguna constante. Estoy configurando el código context dot response.status para que sea igual a los códigos de estado dot 500. Entonces los mismos 500 que regresamos cada vez que hay un error, solo estamos configurando eso como una constante para que no tengamos que escribirlo una y otra vez. Entonces, ¿dónde estaba yo lo siento. Por lo que el estado cotiza punto estado 500 Error interno del servidor. Y luego estoy configurando el tipo de contenido para que sea la aplicación JSON. Entonces voy a decir que la característica de contexto var es igual a dos contextos características de punto obtener la característica de controlador de excepciones que puede necesitar importar ¿Me falta el tipo de datos para este, lo que puede seguir adelante y hacer eso. Entonces lo que vamos a decir que no es si la característica de contexto no es igual a null, entonces queremos decir Log dot y luego error de inicio de sesión. Entonces recuerda que cada vez que algo falla, en realidad hacemos eso. Tenemos nuestro registrador y luego iniciamos sesión error donde pasamos en lo que está mal, ¿verdad? Entonces voy a decir que si algo salió mal, solo copiaré estos conceptos básicos por aquí, algo salió mal. Pero en lugar de nombre, a menudo obtienen países. Esto voy a decir context feature dot error. Entonces eso nos dará una indicación de lo que salió mal, ¿verdad? Entonces no error, contexto, error de punto de característica. Entonces vamos a decir, esperaré, contextos nos está trayendo notas de programación asíncronas MCT es que esta pequeña flecha aquí es verde en la escena que estamos viendo un símbolo alguna vez esperó algo. Entonces cuando lo digo nosotros, eso es, no está todo satisfecho al n igual o a o lo siento, la palabra clave asíncrona no está todo satisfecha. Se va el terreno. Entonces voy a decir esperar respuesta de punto contexto. Entonces vamos a decir enviar de vuelta una respuesta a los contextos de llamada del contexto aquí realmente representa al controlador que está pasando la información. ¿ Está bien? Lucio, eso funciona en unos pocos. Entonces escribe asíncrono, ¿de acuerdo? Y luego queremos decir que queremos un nuevo error. Tan nuevo error, y solo seguiré adelante e inicializaré este modelo. Ahí vamos. Entonces queremos un nuevo error donde nuestro código de status vaya a ser igual al status quo que acabamos de decir aquí arriba. Entonces quiero decir, podríamos haber dicho fácilmente que aquí, está bien. Pero eso queremos. Y también queremos que nuestro mensaje sea igual a algo consistente. Entonces creo que aquí acabamos de decir Servidor Interno. Estos dragón, creo que eso es lo que decíamos cada vez. Entonces sólo el mensaje siendo igual a ese mensaje muy consistente. Y luego todo esto queremos convertir a cadena. Entonces tenemos un punto y coma. Está bien, así que repasemos un poco esto. Entonces estamos viendo que queremos anular nuestro manejador de excepciones predeterminado. Y la forma en que queremos que se produzca el manejo de excepciones es tal que cuando uno sucede, escribimos el registro y luego generamos un modelo de error con el código de estado y el mensaje. Está bien, así que eso eliminaría nuestra necesidad de hacer eso manualmente cada vez. Ahora después de escribir ese código de middleware de disfraces, lo que tenemos que hacer es ir a la startup y voy a poner ese justo debajo del jadeo. Entonces lo vamos a decir arriba, dot configure controlador de excepciones, y eso debería ser todo. Entonces lo que voy a hacer como prueba de concepto se retira la bandeja porque tratar realmente significa hacer esto. Entonces con todas las tríadas dispuestas a intentar hacerlo, el único propósito real son los aspectos cambiantes del juego del try catch es que vea, intente esta operación y maneje las flechas que ocurren. Entonces si tengo manejo global de errores, entonces no necesito seguir adelante y poner nada para manejarlo manualmente cuando algo sí ocurre. Entonces voy a tratar de conseguir identificación de contrabando. Eso está bien. Entonces vamos a hacer algunas pruebas con esto como prueba de concepto. Y lo que también voy a hacer es, vale, sólo vamos a ver cómo funciona. Entonces voy a empezar y voy a ejecutar nuestra solicitud de API slash countries slash uno. Y entonces estamos consiguiendo el país número uno, que es Jamaica con el hotel. Entonces todo está funcionando bien. Eso es lo que esperaríamos. ¿ Está bien? No, me cuesta introducir un error de otra manera. Entonces lo que haré es introducir el dinero. Bueno aquí en el código lo que haré es lanzar una nueva excepción porque la captura está ahí para atrapar una excepción. Entonces si yo mismo lanzo una excepción, entonces lo que pasaría es que el código en realidad dejaría de ejecutarse en este punto. Nunca llego ahí abajo. Ahora quiero ver qué respuesta obtendría cuando se lanza esa excepción. Entonces vamos a seguir adelante y ejecutar esas mismas solicitudes de Cartero que sólo fue exitosa y voy a introducir la excepción de tiro. Y cuando hacemos eso, vemos que estamos recibiendo código de estado de buck y mensaje. Y esos dos campos son los mismos dos campos que acabamos de definir en nuestro modelo de errores. De acuerdo, entonces lo que está sucediendo aquí es que el manejador de excepciones en realidad está observando globalmente cuando se detecta una excepción, entonces está haciendo lo que le pedimos que haga, que es registrar el error y decir que algo salió mal aquí. Entonces veamos qué hay en el registro y el log m viendo mi excepción aquí mismo. Entonces sistema excepto SON System.Out Simpson fue a través y yo podría haberlo hecho excepción más específica este punto de datos. Pero entonces si miras hacia abajo, mira todo el ducto en cuanto a adónde fue. Entonces lo que pasa es que se fue al controlador. El controlador lanzó una excepción y luego ellos excepción manejan el manejador de mano que sobrevolamos, calientan nuestro código personalizado. Y luego dijo: ¿De acuerdo, qué debo hacer? Bueno, las estadísticas se anotan son 500, el tipo de respuesta es JSON. Voy a registrar el error y luego voy a escribir a Bach en nuestra respuesta que esto ha ocurrido. Entonces de esa manera podemos realmente de forma segura y con confianza, después de haber hecho eso, quitar todas las demás capturas de prueba de cualquier otra parte del código. Porque una vez más, esas capturas try estaban ahí para asegurarnos de que estamos manejando todos los errores con gracia, son lo más graciosamente posible. Entonces ahora que lo hemos hecho global, tú quieres, puedes hacer es solo hacer lo que me ves haciendo, y simplemente ir por y sacar todas las capturas de pista en cualquier cantidad que esperes que se ejecuten. Sólo tienes que seguir adelante y ejecutar eso. Y lo que te das cuenta es que por eso, la eliminación de esa dependencia del try catch está en todas partes en cada opción. Cuando estás expandiendo y extendiendo en tu funcionalidad abs, tu aspecto trimestral mucho más limpio porque entonces tú y tu equipo así pueden escribir el código sabiendo completamente bien que tu manejo de excepciones está sucediendo a escala global. Entonces lo he hecho con country. Puedes seguir adelante y limpiar el controlador del hotel así como el controlador NLL que puedas tener. 39. Implementar la versión de API: Hey chicos, bienvenidos de nuevo. En esta lección, estaremos hablando de versionar nuestra API, aunque la razón por la que desearíamos la versión son API que con el tiempo, más funcionalidad evolucionará ahí momentos en que podamos cambiar la forma en que nuestros endpoints se comportan, genes , algunos verbos son la forma en que se estructura la carga útil, todas esas cosas. Pero entonces no quieres simplemente hacer eso. Y luego todos tus clientes un día se despiertan y se dan cuenta de que tendría que cambiar toda tu base de código porque implementaste un cambio cerca de API. El versionado de la API te permite correr paralelamente entre la antigua forma de hacer las cosas y la nueva forma de hacer las cosas. Y luego eventualmente se puede eliminar el punto de césped todos los clientes tienen. Por supuesto, después de una adecuada advertencia y educación, nuestra propia la nueva norma defacto que estás introduciendo. Por lo que retinal quiere hablar de versionado y nuestro viaje va a empezar justo aquí en, en nuevo get, donde vamos a conseguir que el Microsoft está siendo en las bibliotecas de control de versiones MVC centrales. Pueden seguir adelante y buscar eso e instalarlo. Y luego después de que hayas hecho eso, vamos a ir con las extensiones de servicio y vamos a añadir una nueva función. Y estamos llamando a este configurar versioning. Por supuesto, ya sabes, puedes llamarlo como sea con lo que te sientes cómodo. Pero ahora mismo lo estamos llamando configurar versioning. Y luego dentro de esta función vamos a tener olor de código al, por lo que estamos viendo servicios, control de versiones API. Y luego vamos a incluir una inicialización de opción donde estamos viendo un informe versiones API, verdadero informe SWOT desvíos significa que habría un encabezado en nuestra respuesta es ver que esta es la versión que estás usando. Entonces cuando nuestros clientes hablen con la API, vamos a ver en la respuesta, sí, simplemente calentarías esta versión de API. Vamos a asumir la versión predeterminada cuando no se especifique. Entonces si tenemos 123 versiones API y el campo cliente para especificar que quieren usar la versión 13, etcétera. Entonces solo vamos a usar uno por defecto el cual hemos ido adelante y especificado a continuación. Dijimos que la versión de API predeterminada va a ser API versión uno. Por lo que puedes seguir adelante y en 2D cualquier falta o por ejemplo, como de costumbre. Y luego después de que hayas hecho todo eso, podemos ir a la startup y podemos registrar los servicios del sistema operativo. Entonces solo pondré ése aquí abajo. Está bien. Ahora lo que vamos a hacer es crear un nuevo controlador. Entonces sólo voy a ir a Agregar. Controlador elegirá una API y solo la dejaré vacía. Y luego por ejemplo sake, voy a llamar a este país cisne v2. ¿Está bien? Entonces controlador country V2. Entonces tenemos un nuevo controlador. Y sólo voy a inicializarlo con algunas de las cosas del controlador original del país. Entonces sólo voy a copiar todas estas cosas. Entonces solo estoy, solo quiero un endpoint solo para propósitos de prueba. Entonces el punto final con el que estamos lidiando será conseguir así que adelante e incluir cualquier referencia faltante. Bueno, en realidad voy a cambiar la forma en que éste accede a los datos. Entonces en lugar de usar la unidad de trabajo, voy a dejar que implemente el contexto DB directamente. Entonces esto es. Contexto de base de datos. Entonces por supuesto recuerda que eso es, es tabú. Realmente no quieres hacer eso mientras va a funcionar, no es una mejor práctica tener el APA mirando directamente los datos. Pero para este ejemplo, solo haré eso para que tengamos un tipo de retorno diferente entre los dos controladores. Entonces voy a seguir adelante e inicializar esto lo más rápido posible. Y luego una vez que eso se haga, una vez que se inyecte, y este es tu controlador V dos. ¿ Está bien? Por lo que podemos especificar la ruta aquí para que sea lo mismo que el origen. Conjuraré el control porque recuerda que irán al controlador de Khan, ¿verdad? Por lo que esto sería api slash country. No obstante, esto por defecto sería api slash country V2. Pero y si dijera que no quiero el nombre del controlador. Yo quería ser el mismo endpoint. Ahora si es el mismo endpoint, por defecto, la API no sabría a dónde ir porque va a ver este con la raíz y ver éste con la misma ruta y no sabría a dónde ir. Ahora lo que puedo hacer es especificar que esta es versión de API, y luego especificar que ésta es 2. Está bien, eso debería ser una cuerda. Entonces API versión 2, lo que pasaría sin embargo es que el cliente necesitará especificar qué endpoint es el que esperan calentar. Está bien, así que sólo voy a hacerla la arriba y limpiar esto, poner en presentar unos parámetros de solicitud en esta situación. Y acabo de limpiar el resto de la misma. Entonces no quise aburrirte con mi limpieza, pero esto es todo lo que estamos haciendo. Solo estamos viendo conseguir países. Y va a devolver contextos países punto, que sólo va a meter la lista de apagados en la base de datos y devolver eso. Muy bien, entonces el tipo de devolución aquí será diferente al dto return-type de nuestro endpoint original. De acuerdo, entonces tomemos esto para una prueba de manejo y veamos cómo funciona esto. Ahora si recuerdas en nuestra configuración habíamos dicho que debíamos asumir la versión por defecto cuando no se especifica. Entonces lo que hicimos aquí fue solo repetir la misma llamada que la rueda se debe a nuestros puntos finales. Acabas de decir api slash country. Y estamos consiguiendo Maco, el de nuestro país. Pero entonces no, si miras en la sección de encabezados, verás que la API soportaba las versiones 1 Do Recordar que nuestra configuración habría establecido 1 como nuestra predeterminada. De acuerdo, así que eso está funcionando, da cuenta de que hay versiones en él está devolviendo el conjunto de resultados del predeterminado. ¿ Sabes cómo conseguimos que nuestro cliente sepa especificar qué versión quieren? Hay algunas maneras de hacer esto. Número uno, podemos solicitar por una cadena de consulta para que podamos ver si quieres que la otra que pases en una cadena de consulta son vía param. Vamos a ponerlo en la versión param APA dash. Y entonces veríamos 2. Y luego envían, verías que nos devuelven un 200 OK, y la versión de apoyo es 2. Entonces déjame, déjame poner esto en un poco más de contexto para que podamos visualizarlo. Entonces sabemos que tenemos dos controladores. Tener controlador Cuadratura v dos, que tiene la misma raíz que las originales. Quería poner puntos de ruptura en sus respectivas funciones. Y luego vamos a ver cuál se pone calor para estar estan lo que solicita. Por lo que sólo voy a repetir la solicitud de la versión 2. Y luego cuando visual studio enciende jabón, ve que está golpeando el nuevo controlador que configuramos usando el mismo punto final, excepto que estamos pasando en la cadena de consulta que queremos la versión dos. De acuerdo, para que pueda continuar, golpea la base de datos y devuelve los datos en consecuencia, y eso está bien. Pero entonces si no incluyo el param y luego hago las mismas peticiones, nota que está golpeando nuestros orígenes. Entonces eso es todo. Por lo que podemos tener más de un controlador con la misma ruta, excepto que hay diferentes versiones. Entonces esa es una forma rápida para que el cliente especifique que quiero la versión dos. Si no especifican, entonces los vamos a enviar a versión en uno. Ahora otra forma en que podemos hacer esto, y sólo voy a parar esto ahora mismo. Otra forma en que podemos especificar cuál es qué versión son bajas. El cliente es especificar qué versión quieren es modificar la raíz. Así que en realidad puedo una especie de super imponer justo aquí entre la palabra API y el nombre del endpoint. Y ver que quiero que pases en v colon y la versión API. ¿ Está bien? Entonces cuando hagamos eso y estén encendidos, voy a modificar un tipo de endpoints o misiones originales. Por lo que inicialmente teníamos API slash, country slash. Ponemos la cadena de consulta para obtener la versión 2, pero luego no, modifico la raíz, así que debería poder verlo para apuntar o justo aquí en la URL, ¿verdad? Por lo que API slash 2 slash country. ¿ Y aún tengo el punto de ruptura CSI dual? Entonces vamos a ver si se le pega y sí se le pega. Entonces ves que esa es otra forma en que el cliente puede especificar qué versión de la API quieren y puntos finales. Por lo que la versión 2.0. especifican 2 por lo que calienta los puntos finales apropiados. No, podría haber una situación en la que no necesariamente quieras aumentar la URL porque ahora mismo todo lo que tenemos para aumentar nuestra, estamos obligando a los clientes a que tengan que cambiar sus URL de BS, De acuerdo, así que tienen que ver el slash api slash 2 slash endpoint o adaptarse a Boston como una cadena de consulta. Entonces otra forma en que podemos conseguir que funcione el versionado y déjame simplemente detener el error es agregar una configuración desgarró Service Extension para el versionado, donde vemos opción dot versión API o bien. Y si solo echamos un poco a ver qué es lo que esto lo está haciendo a verlo. Se utiliza para leer el servicio API cuando lo especifican los clientes. Muy bien, entonces podemos ver en el nuevo lector de versión API de cabecera. Entonces, ¿qué es, un barco, la petición entrante que queremos leer, ¿verdad? Entonces estamos diciendo que queremos el lector de versión API de cabecera y estamos buscando un encabezado por el nombre de la versión API. Por lo que esto nos permitirá a uno, no sólo mantener nuestras raíces como lo teníamos antes, sino que permitirá al cliente simplemente agregar un encabezado en lugar de tener que cambiar toda su URL. Entonces probemos ésa. Por lo que cartero de piel de abeto, solo voy a quitar el 2.0. de nuestra URL. Y entonces lo que voy a hacer es especificar en las secciones de encabezado que tiene heterocíclica did API versión dash. Entonces ese es un nuevo encabezado que es que quería pasar por encima de 2.2. Y luego cuando envío eso, nos tocamos con nuestro punto de ruptura en nuestra versión 2.0. controlador. De acuerdo, así que bastantes maneras tendrás diferentes personalidades telefónicas o diferentes métodos de hacer las cosas en lugar de introducir demasiados cambios rompientes todo en la base de código al que todos ya están suscritos, puedes pasar en una nueva fase y simplemente llamarla versión, esta versión que, y que pasen en el encabezado para la versión apropiada cuando sea necesario. No hay una cosa más que te voy a mostrar sobre este tema es cómo puedes especificar que algo está en desuso. Entonces en quietud ahora y solo voy a seguir usando este porque esto es experimento. Digamos que un verso sobre herramienta de tres puntos. Por lo que ninguna versión 2 está en desuso o ya no es la versión preferida. Por lo que realmente puede agregar a la anotación aquí que el valor en desuso de esta versión de API es verdadero. Entonces lo que pasaría es que cuando envíe el encabezado a través para nuestra respuesta y podemos probar eso aquí. Entonces esta fue una solicitud previa, así que voy a ejecutar otras solicitudes, golpear el punto de ruptura, continuar, pero luego mirarlo. Esto es la nariz API en desuso versión 2. Entonces no, ya no es decir, oh, estás calentando la versión de API te está haciendo saber que ésta ya no es la preferida. De acuerdo, probablemente esté cerca del final de la vida, sea lo que sea. Entonces esas son formas en las que realmente puedes implementar el versionado en tu API para ayudar a controlar el hall USTED honorarios en tus cambios a medida que avanza. 40. Implementación de en cachero: Oigan chicos, bienvenidos de nuevo. En esta lección estaremos explorando la implementación del almacenamiento en caché en nuestra API. Ahora, el almacenamiento en caché puede mejorar significativamente el rendimiento de la API. Simplemente piensa en cuando tenemos cientos, tal vez miles de clientes suscribiéndose a la API, todos están tratando de encontrar todo dicho dice países y probablemente incluso ambos al mismo tiempo. Y realmente puedo tomar un peaje en el rendimiento de la API basado en toda la infraestructura y un pie, tengo que golpear la base de datos con cada solicitud. Por lo que el almacenamiento en caché introducirá una especie de capa de acceso rápido en la parte superior del data store real. Y reducirá significativamente la frecuencia con la que tenemos que tirar de la base de datos. Entonces lo que estaremos implementando es un almacenamiento en caché. Estaríamos buscando implementar una experiencia experta en mecanismo para reducir el todo, muchas veces tenemos que ir a la base de datos. Estaríamos buscando implementar un mecanismo de validación para reducir el ancho de banda de la red. Y al final de esta lección, sólo queremos una sensación general de almacenamiento en caché, por qué lo tenemos y cómo se puede implementar. Ahora hay tres tipos de almacenamiento en caché y sólo quería darles chicos y es un temido antes de que nos metamos en todo el asunto del código. Por lo que la caché del cliente vive en el navegador. Entonces es un caché privado porque es, sabes, necesitas un solo cliente en particular de ARN. Muy bien, tenemos la caché de gateway que tipo de vive en el servidor y es una caché compartida. Entonces los despliegues de gateway, supongo, y todos los clientes que golpean el Gateway o en cualquier momento del tiempo estarían calentando ese efectivo. Y ellos, tenemos nuestra caché proxy, que también es una caché compartida. Lo que es no vive en el servidor , vive en la red. Para comenzar el almacenamiento en caché o recurso, es bastante simple. Lo que necesitamos hacer es agregar los atributos de caché de respuesta y establecer cuánto tiempo debe vivir la caché. Cuatro, derecha, así sobre cualquier control, sobre cualquier punto final. Y voy a empezar con los países. Ya sabes, acabaríamos de experimentar entre estos dos. Entonces solo voy a agregar el atributo que dice caché de respuesta. Y entonces la duración es igual a 60. Entonces 60 significa si Barnes. De acuerdo, entonces estamos configurando el cache-control con una edad máxima de 60 segundos. Si miras la duración, ves esto establece la edad máxima en el encabezado de control de caché. Entonces cuando, cuando un cliente consulta por Nieto desde el endpoint, habrá un encabezado incluido que diga que esta es la vida útil del efectivo que estás obteniendo son datos en caché que no eres bueno. Entonces, entremos al modo de depuración y realizemos una prueba rápida. En el modelo de post, lo que quieres hacer es solo asegurarte de que tu opción de encabezado sin caché ascendente esté desactivada. Entonces puedes hacer es ir a Configuración de archivos y debajo de General sí esperamos que el sentado se encuentre o está apagado. De lo contrario se puede proceder. Por lo que ya sabemos que podemos mirar todos los encabezados que regresan. Y yo voy a hacer enviar. Y cuando obtenemos la respuesta, vemos que nuestro encabezado de control de caché está retrocediendo y tiene la edad máxima de 60 años. De acuerdo, ahora esto es realmente solo el encabezado, así que en realidad no estamos cambiando nada todavía. Esto es solo dejarle saber al cliente que mientras los datos se almacenan en caché, lo que es por supuesto que realmente necesitamos almacenar en caché los datos. Entonces vamos a tener que modificar algunas de nuestras configuraciones en nuestra startup, que es donde empecé. Por lo que en nuestro startup dot cs, vamos a agregar este nuevo registro de servicio en la función configurar servicios. Y que sólo voy a poner pan aquí. Por lo que los servicios que agregan caché de respuesta. Y luego después de eso necesitamos registrar nuestro middleware, que haré justo encima del middleware de enrutamiento que dice app.use almacenamiento en caché de respuesta. Por lo que solo puedes seguir adelante y sumar esas dos líneas. Y entonces lo que vamos a hacer es hacer otros diez. Y cuando ejecuto esta solicitud, estamos viendo un nuevo encabezado. Y éste es que indica el número de segundos que el objeto ha estado en una caché de proxy. De acuerdo, así que sólo pensamos burbujear en los diferentes tipos de almacenamiento en caché. Entonces en ninguna parte implementando nuestra caché proxy y ver el valor aquí es nueve. Entonces si gano otro y ves que es nulo 32 segundos dentro de la edad máxima de seis años. Por lo que más o menos dentro de la vida, si seguimos jalando, ella, seguirá obteniendo un valor diferente para el ID. Entonces cuando hago eso, se ve que la edad se ha ido porque superamos el suelo de 60 segundos donde en realidad fui a la base de datos esta vez, regresé y no hay edad. Pero entonces si lo vuelvo a tirar, ahora me está diciendo que está bien, tiene diez segundos. Tiene 14 segundos, etcétera. Es NORM.DIST va a volver a mi inicio muy rápido y vamos a explorar todo el fin de semana probablemente inter implementa, lo siento, un más global válido porque derecho saber, tendría que sentarme esto manualmente sobre cada opción o cada endpoint. Y luego si lo cambiamos de 60 a 120 para denotar pasar por cada uno. Entonces lo que podemos hacer en el arranque se agrega a la config para add controller. Entonces voy a poner en mi, mi expresión lambda. El Tolkien y la web R0 y otros poniendo las llaves provocarán, ya sabes, si tenemos más de una líneas que configurar, eso lo hace más fácil. Bueno, lo que voy a agregar es una config para ver los perfiles de efectivo dot add. Y queremos los 120 segundos de duración. Entonces aquí podemos tipo de definir hasta perfil de caja, que luego podemos usar y reutilizar en todo. Entonces necesito, déjame ver qué necesito aquí. Necesito un punto y coma al final. Está bien, ahí vamos. Así config dot cash profiles dot dot add. Nosotros le damos cualquier nombre, ya sabes, dentro de la razón. Y luego nueva duración de perfil de efectivo. Y puedes agregar otras propiedades al verbo ubicación del perfil un encabezado Ionia, demasiado complicado. Pero lo que sí sabemos es en lugar de especificar la duración aquí en este encabezado. Puedo ver perfil, bueno, gosh, Nombre del perfil es igual a y luego ponemos ese nombre que acabamos de especificar en esa ranura. Entonces si quisieron seguir adelante y probarlo, no lo voy a volver a probar porque ya sacamos el justo de los encabezados volviendo a la edad. Entonces no, lo hemos incrementado a indio sobre cualquier punto final que deseemos tener ese efectivo. Y más que probable querrías hablar de los que están leyendo. El get profiles serían los que tendrían ese perfil de almacenamiento en caché. No necesariamente necesitarías eso sobre la creación y otras operaciones. De acuerdo, así que hablemos de una situación en la que nuestros datos podrían quedar rancios. Entonces como dije, con el efectivo, se necesita como una copia rápida de la capa de datos y devuelve esos datos por el tiempo que se lo dijimos. Entonces en este caso son dos minutos. Bueno, vamos a extender esto a tal vez diez minutos. Y luego la primera vez que el cliente intenta obtener datos, luego se va a hacer trampa y entrar, obtener una versión en caché después. Pero entonces y si cinco minutos dentro estos diez minutos o dos minutos dentro de este periodo de diez minutos, realidad ocurrió una actualización. Entonces se agregó nuevo país, ¿verdad? Y entonces siguen recibiendo datos rancios mientras los cachés estén vivos. Entonces no queremos eso. No queremos que cuando, cuando los datos cambien por debajo, sigan recibiendo datos antiguos. Entonces para sumar a esto es algo de validación. Muy bien, así que para hacer alguna validación o agregar encabezados para validación y experiencia en cheques, vamos a incluir una nueva biblioteca. Y va a ser esta biblioteca llamada encabezados de caché de puntos Marvin. De acuerdo, también lo es la velocidad en un middleware central que agrega encabezados de caché HTTP a las respuestas. Y se ven los diferentes encabezados que caduca el cache-control, etag y Last-Modified. De acuerdo, por lo que implementa caché, caducidad y validación. Para que puedas seguir adelante y conseguir eso. Y voy a refactorizar o cuarto de bit. Entonces en las extensiones de servicio sobre cuándo agregar una nueva función, donde estamos viendo pública estática, void configure encabezados de caché HTTP y conocemos al jefe de perforación en la colección de servicios. Y luego estoy tomando esa primera línea que agregamos servicios dot add response gushing así como servicios dot add http headers cache. Entonces nos llevamos a esos dos. Y entonces lo que vamos a hacer es justo y me refiero a la startup, entonces donde tenía el original Y sólo voy a agregar una referencia a esa función la cual va a inicializar estas dos llamadas de servicio ¿verdad? Después de esa modificación, vamos a añadir el middleware. Entonces después del almacenamiento en caché de respuesta de Estados Unidos en cuándo sumar puntos use encabezados de caché HTTP. Y antes de que hagamos más modificaciones, solo para asegurarnos de que todo esté bien, solo vamos a hacer una prueba rápida y vamos a enviar una solicitud totalmente nueva. Y cuando miramos la lista de encabezados que regresan de esas solicitudes, mira caduca Last-Modificado, tenemos una ETag. Identifica un recurso específico versiones. Entonces es igual que un poco de hash que dice que esta es la versión del detalle consiguiendo muy y otras cosas. Entonces vemos que estamos recuperando algunos encabezados nuevos en el camino, ¿verdad? También notarías que la edad máxima es una especie de remontada a los 60. Entonces sí, era 12V sets en 12 en, pero ha subido a 60. Entonces vamos a explorar cómo podemos personalizar esa edad máxima. Y la forma en que vamos a hacer eso es volver a nuestras extensiones de servicio y agregar el siguiente código en el punto de servicios, agregar encabezados de caché HTTP. Entonces vamos a definir un Tolkien, llamarlo experiencia en opsin lambda flecha. Y vamos a decir experiencia sobre la opción max, edad 65120, sea lo que sea que queramos, podemos ver la experiencia en la ubicación de caché de resultados. Vamos a querer que sea privado o queremos que sea sermón público, pero vi público o privado. Entonces digamos que lo queríamos privado. Y luego la opción de validación, ve más revalidar es verdadero, es decir, una vez que cambian las betas, debemos pasar por ese proceso. No obtengo después de hacer estas modificaciones, en realidad podemos eliminar el encabezado del recurso. Está bien, así que vamos a hacer una prueba más. Y veremos que la modificación es en realidad global. De acuerdo, así que incluso sin poner el recurso R, lo siento, el atributo justo por encima del recurso, vemos que todavía estamos consiguiendo cerca de los mismos encabezados y yo sólo estoy seguido y ellos viven en toda la vida del 1-20. De acuerdo, entonces lo siguiente que quiero mostrarles son los orgánicos. Cosas que quería mostrarte serían los atributos personalizados que en realidad puedes agregar justo encima del punto final potencial que quieres un ajuste diferente para nosotros. Entonces sí, dijimos el global sentado en la startup o lo siento, en la configuración del servicio. Pero luego sobre el punto final, en realidad puedes anular eso. Por lo que sólo puede agregar esas referencias faltantes. Por lo que HTTP cache, caducidad y AUC Yolanda diferente ubicación. Se quiere que sea público y éste debe ser de 60. En realidad puedes anular la configuración global justo aquí. Y luego puedes decirle a éste que no necesita revalidar. Entonces simplemente rebotando de nuevo a los encabezados que vienen pero sepan que hemos implementado el almacenamiento en caché solo para pasar por ellos una vez más, este remolcador realmente representa lo único, como yo único hashed decir esta es la versión de los datos que UIC. Si, si dentro de la vida útil de la caché, algo cambia, entonces esta etiqueta realmente va a cambiar y entonces obtendrías una nueva etiqueta. Pero entonces mientras el Datastore no cambie, lo que estamos haciendo es simplemente almacenarlo en caché para que no tengamos que golpear la base de datos para traer los mismos datos cada vez que alguien quiera. Es por lo menos por dos minutos si conseguimos uno, esas son peticiones. No necesariamente necesitamos ir a la base de datos para la SIM o datos. Entonces esa es la ventaja de agregar almacenamiento en caché a tu API. Por supuesto, caso por caso, es posible que desee personalizar la forma en que los endpoints particulares sirven los datos frente a otros. También es posible que ni siquiera necesite almacenamiento en caché basado en la aplicación o puede que no sea adecuado para el tipo de operación para la que está proporcionando la API. Entonces esto es sólo otra cosa que creo que es bueno que conozcas y puedes usarlo, tenerlo en tu arsenal para cuando sea necesario. 41. Limitación de velocidad y la velocidad: Oigan chicos, bienvenidos de nuevo. En esta lección estaremos hablando de limitación de tarifas. Ahora, limitando o estrangulando la velocidad como también se le llama, es una técnica mediante la cual imponemos ciertos límites en su totalidad. A menudo alguien puede golpear nuestro endpoint y en realidad obtener mi beta. Entonces por supuesto, si alguien viene y bombardea el endpoint tanto como tenemos caché y todas estas cosas. El hecho es que el endpoint en realidad se demuestra a una denegación de servicio o un ataque DDoS. Y lo que queremos hacer es una especie de poner un mecanismo en que cuando detectamos demasiadas peticiones de una fuente, podemos como bloquearlas y decir, oye, aquí, exagerando. Fuera del potencial ataque DDoS, en realidad nos ayuda a tipo de medidor OMS a menudo cualquier cliente accede a datos y muchas API muy populares o su Google. Y sólo voy a decir Google, pero todos esos grandes jugadores con API y SDK, todos tienen alguna forma de estrangulamiento. Si lees los requisitos y las condiciones de uso de sus API, tienen algo ahí para ver puedes solicitar puede ser de 100 por Minitaur, 100 por hora escalera de cosas. Por lo que hoy vamos a estar configurándolo en nuestra API solo para tener una sensación de cómo se hace. Y vamos a estar usando la biblioteca es Speed.net Core tarifas límites. Por lo que sólo podemos seguir adelante e instalar eso. Y una vez que eso esté instalado, lo siguiente que queremos hacer es pasar a una startup y alo o aplicación para usar memoria caché porque va a usar memoria caché a tipo de tienda y hacer un seguimiento de quién solicitó Watts y cuántas veces lo han solicitado en el momento, ¿verdad? Por lo que de nuevo, dirán servicios que agregan caché de memoria ahí mismo en el funcionamiento de los servicios de configuración. Después tenemos algunas modificaciones que se hacen a Extensión de Servicio. Por lo que ya tengo la cotización aquí. Y a este método se le llama configurar límite de velocidad. Y ya sabemos que la recaudación de servicios y lo que estamos haciendo aquí es configurar un conjunto de reglas para que solo puedas seguir adelante y copiar el código e incluir cualquier referencia que falte a medida que avanza. Por lo que vari, reglas de límite es igual a nueva lista, reglas realmente límite. Pueden tener múltiples reglas. Por lo que tenemos que inicializar un nuevo objeto de regla que nos permita especificar los extremos particulares. O en este caso estoy viendo a Star, lo que significa que cada endpoint se va a adherir a esta regla. Por lo que en base a esta estructura, en realidad puedo tener múltiples raíces. Puedo decir coma y hacer una nueva regla. Está bien, déjame copiar y pegar. Puedo hacer una nueva regla, especifica un punto final en particular y luego cambiar los límites. Entonces esto es que estás limitado a una llamada por segundo. ¿ Está bien? Eso es un poco corto. Es decir, podemos decir diez segundos, una llamada cada diez segundos. Puedo ver una llamada cada diez minutos o 100 porque depende de ti. Puede configurarlo una vez más, si tiene reglas diferentes por endpoint, puede seguir adelante y agregar estas reglas y especificar los extremos particulares a los que son aplicables. Ahora mismo sólo voy a sentar una regla global. Entonces solo voy a decir todos los puntos finales y voy a ponerlo en algo que es muy pequeño para que podamos verlo en pruebas, ¿verdad? Entonces voy a ver en cinco segundos sólo se te permite una llamada en cualquier punto final. Entonces vamos adelante y decimos servicios dot configurar. Pondré en la IP opciones de límite de lectura y sólo decimos opciones, no reglas generales equivale a las reglas de límite de tasas que acabamos de definir. Fuera de eso, necesitamos agregar estos servicios singleton en forma de tienda de contador de tarifas límite. Y eso se va a asociar con la tienda de contador de límite de memoria caché. Entonces todos estos son solo bits de código que requería para apoyar la biblioteca que importamos esto. Por lo que una biblioteca diferente podría implementarlo de manera diferente. Pero este es el código requerido para esta biblioteca en particular, digamos Candace, hit pause, escríbalos. En este punto, intellisense, los estaremos llenando porque eres cualquiera del paquete. Ahora prólogo no las extensiones en servicio solo van a volver a arrancar y vamos a agregar estas dos líneas, servicios punto configurarlo limitando, que es el método que acabamos de configurar y los servicios que agregan HTTP accessor de contexto. Por lo que esto nos da acceso al controlador real y a sus funcionamientos internos cuando sea necesario. Y luego finalmente, vamos a sumar el middleware donde el enrutamiento del etanol. Entonces voy a poner tus anuncios en cualquier caché. Tenemos app.use IP límite apresurado y por supuesto incluir cualquier referencia que falte. Ahora se han utilizado diferentes códigos de respuesta cuando están respondiendo para ver demasiadas solicitudes. En tiempos más recientes, se ha utilizado 429, lo que literalmente significa demasiadas peticiones dentro del pasado, presenciaron plataformas usando para 20, lo que significa mejorar aquí com y otras. Entonces vamos a probar esto. En lo que va país voy a pegarle mandar. Y si observamos los encabezados, veremos que obtenemos alrededor de tres nuevos encabezados, X3, limita los rayos X, se mantuvo limitador significado y límite reset, ¿verdad? Entonces te está mostrando que el límite es de cinco segundos. no tienes más, decir para una ventana de 5 segundos y el reinicio va a ser en este momento sellos. Entonces si golpeo esto varias veces, de acuerdo, voy a usar un endpoint diferente porque creo que éste se predice por el almacenamiento en caché. Por lo que podría no, basado en mi configuración de almacenamiento en caché, no va a violar el acelerador. De acuerdo, así que voy a usar el hotel porque recuerden que montamos todas esas cosas en el país y puntos. Entonces déjame ir al hotel, que no los leí modificar tanto. Entonces ya envía una solicitud y me está mostrando los mismos encabezados, límites, etcétera, etcétera, fs y otro, lo que se despliega como líneas más adelante. Está bien si envío otra, demasiadas solicitudes, bien, así que dice reintentar después de ver enviar otra solicitud después de 1 segundo, así que nada regresó pero el mensaje API llama cuota excedió el máximo admitido uno por cinco segundos, ¿verdad? Entonces me está haciendo saber que necesito probar un dólar en esta cantidad de tiempo. Y cuando lo haga, ahí vamos. Si vuelvo a intentarlo, vuelva a intentarlo después de cuatro segundos, inténtelo de nuevo. Y si sigo haciendo eso en su lugar, adoptar valle sigue cambiando en relación al número de segundos que tengo en base a la última solicitud. Entonces es así como podemos agregar estrangulamiento. Y automáticamente una vez más da pero que para 29 decir demasiadas peticiones. Está bien, y ese mensaje, así que el cliente lo sabe, oye, estás bombardeando la APA. Mejorar escuchar la calma. 42. Revisar y añadir cambios a GitHub: Muy bien chicos. Entonces donde es otro hito donde sólo vamos a revisar las cosas que implementamos en este apartado. Y luego los cambios de guitarra tienden a GitHub. Por lo que ir en orden de culpa, hicimos el primero sería paging. Por lo que implementamos pellizcos donde pasamos en algunos parámetros de solicitud a los países de nuestro get. Y también nos adelantamos y fijamos algunos impagos para decir si no proporcionan ninguno, entonces vamos a proporcionar esta cantidad de información por adelantado. De lo contrario, le damos al cliente la oportunidad de decir que quieren estos muchos registros a partir de este punto. Ahí se presentan por el número así como el pH, ¿no? Entonces eso es una cosa que implementamos. También implementamos el manejo global de errores, lo que nos permite crear o escribir nuestro código sin la necesidad de demasiadas capturas de prueba. Y viene un poco más ordenado de lo que era antes, eran cada vez que estamos viendo try-catch, try-catch. Está bien. Otra cosa que hicimos fue implementar el control de versiones en nuestra API. Por lo que creamos esta controversia para controlador solo con fines experimentales, donde especificamos la versión de API y exploramos cómo podemos permitir que el cliente especifique qué versión de la API es la que quieren. Y creo que el último bit de configuración los tendría positon como encabezado. De acuerdo, así que en nuestros servicios de extensión, ponemos en tienda para el manejo de excepciones y manejo de excepciones globales para decir, ya sabes, cuando hay una flecha ingresada y regresamos con ese 500 para el versioning, sí dijimos que queremos implementar el versioning. Al leer desde el encabezado que se pasa con la solicitud, especificamos la versión de API predeterminada para ser 1. Entonces si se especifica dinero, entonces es 1. También nos fijamos en implementar el almacenamiento en caché. Por lo que en realidad podemos simplemente proporcionar los datos hasta por una cierta cantidad de tiempo antes de tener que tirar de la base de datos para la siguiente solicitud. Y también ponemos en validación para asegurarnos de que una vez que los datos subyacentes cambien, el tipo de datos se refresque en la parte superior de Cachemira. Y por último, pero de ninguna manera menos importante quién puso en la limitación a tipo de control con qué frecuencia un cliente en particular basado en la dirección IP, al menos en base a la forma en que hemos configurado, ella, puede llegar a un punto final en particular. Entonces bien sabe que el límite es muy pequeño, el periodo es pequeño, pero eso es solo para nuestro propósito experimental en una situación real, probablemente puedas mirar a otros proveedores como Google y así sucesivamente. Y si tu infraestructura es lo suficientemente robusta, puedes usar sus, sus valores para informarte en cuanto a cómo puedes poner en estratificación Qué es te dejo esos valores de ejemplo por lo tanto, no. Y lo que queremos hacer es facturar para que sepamos que solo vamos a conseguir cambios. Y luego ponemos en nuestro mensaje. Y ese es mi mensaje. Entonces, cuando haga este check-in, solo sigue adelante y comete y hunde. Entonces todo lo que se hace aquí. Y recuerda que en los ejemplos lo habría hecho en un lugar y te animo a probarlo en el otro lugar. Pero entonces siempre se puede comprobar el código fuente y volver a comprobar y comparar notas. Y una vez que todo eso esté hecho, estamos listos para pasar a nuestro siguiente tema. 43. Cambios de arquitectura - resumen de la sección: Oigan chicos, bienvenidos de nuevo. Hemos hecho bastante para estar desarrollando nuestro AICPA hasta este punto. Y sí, tenemos un producto en funcionamiento TSV tenemos un montón de características que nos ayudan a aportar experiencias de valor agregado cuando las personas interactúan con nuestra API. Lote en este apartado, queremos discutir ciertas decisiones arquitectónicas que probablemente necesitemos tomar. Como se puede ver lo que hemos trabajado y quiere sus obras. Es un buen software en cuanto a que anunciaste este conjunto de funciones y entrega este conjunto de funciones. No obstante, se vuelve un poco más complicado a la larga donde hay que mantener en nuevo querido mantener ciertas cosas separadas. Cuando este proyecto niñas retinol rueda y tienen qué tablas de herramientas y unos repositorios en las unidades fuera de trabajo y eso está bien. Pero entonces a medida que el proyecto podría expandirse, porque esta es la única fase uno, medida que esto crece, necesitamos que se almacenen más datos. Tenemos que hacer más cosas. El proyecto se va a hinchar. Entonces ahora mismo lo que estamos practicando es lo que se llama todo en una sola arquitectura. Donde cuando scuffle un proyecto en Visual Studio, como ves, obtenemos todo lo que necesitamos realmente sobre la aplicación de trabajo todo en un solo proyecto. Pero entonces mucha gente probablemente miraría esto descongelado y dirían, bueno, ya sabes, todo es 1 proteus y así no faltaría la práctica. Y eso es cierto. Hay razones filosóficas, o al menos razones tangibles y prácticas que querrías mantener ciertas cosas separadas. Y entonces eso es traer la mejor práctica que va por el nombre separación de preocupaciones. Entonces sí, tenemos carpetas en actuar separación de preocupaciones hasta cierto punto, pero creo que se puede refinar un poco más. Entonces lo que estaremos haciendo en esta sección es arrancar viejos algunos de los elementos clave de la API principal, un proyecto, y crear proyectos donde escanearán en vivo por sí mismos. Por lo que la API solo será cosas relacionadas con API, y solo hará referencia a otros proyectos que tienen como datos son cosas relacionadas con la lógica empresarial. Está bien, entonces eso es lo que estaremos haciendo para esta sección. Así que anda por ahí y nos divertiremos a medida que avanzamos. 44. Proyecto de modelos de datos: Muy bien, Entonces nuestro primer cambio de proyecto será para los modelos de datos no lo son, así que vamos a crear un nuevo proyecto. En esta solución. No queremos hacer eso. En realidad somos la solución ir a Agregar. Y queremos un nuevo proyecto. Y este proyecto simplemente va a ser una librerías de clase si lo tienes a un lado, eso está bien. Si no, siempre puedes simplemente buscar nuestra biblioteca de clases. Y una vez que lo encuentres, queremos una biblioteca de clase C-Sharp. Entonces seleccionamos eso y voy a llamar a este hotel listando datos de puntos. Muy bien, Así que estábamos haciendo obvio que este es el proyecto de datos, CMV en, en, en construir todos estos proyectos más grandes están teniendo múltiples proyectos. Probablemente querrías que la capa de aplicación tenga puntos, MVC o UI o API. Pero eso no es absolutamente necesario y ya hemos ido por el camino de motivarlo. Entonces eso está bien. Solo querías asegurarte de que representamos que este nuevo proyecto datos de puntos que representan que es para nuestros elementos de datos y activos. Entonces con eso hecho, podemos golpear Next y queremos mantenerlo en dotnet cinco. De acuerdo, así que podríamos haber usado en su estándar, podríamos haber usado cualquiera de estos, pero entonces todo es dotnet cinco. Por lo que queremos asegurarnos de que nos quedemos en dotnet cinco. Alternativamente, podríamos haber usado estándar allí como un puente entre las diferentes versiones de dotnet Core. Dotnet framework también, lo que dotnet cinco funciona perfectamente en esta situación. Por lo que acabamos de golpear Crear. Y una vez que tengamos esa biblioteca de clases, obtenemos eso con archivo de clase ahí dentro. Ahora bien, esta actividad va a requerir un poco de refactorización, que es una de las razones por las que la gente simplemente tiende a hacer esto desde el primer día para evitar el proceso de refactorización y todo lo que tiene que suceder con respecto a eso. Entonces ya verás ahora que tenemos un nuevo espacio de nombres, lo que significa que, bueno, cualquier cosa que esté en la carpeta de datos es segura porque ya va a tener ese namespace dot data solo porque es el hotel escuchando proyecto y la carpeta de datos. Ahora ten un nuevo proyecto que va a tener el mismo espacio de nombres, eso está bien. Entonces en realidad sólo puedo tomar todos estos archivos. Y voy a cogerme, no copiar, sino atrapado y dar click en mi nuevo proyecto y voy a pegar. Entonces en esa pieza cotinina está terminada y solo eliminaré esta clase uno nazis, no la necesito, ¿verdad? Cuando eso se haga, verás que todas las referencias siguen ahí, pero luego estamos obteniendo algunas líneas rojas porque con el usuario de API no hay referencia de biblioteca que permita saber qué es el usuario de identidad. Entonces eso es otra cosa. Cuando estamos rompiendo en múltiples proyectos, tenemos que asegurarnos de que representamos los diferentes elementos son bibliotecas u otras de las que puede depender cada componente. Entonces con toda franqueza, este nuevo proyecto es ajeno a todo lo que existía en el viejo y eso está bien. Entonces si salto a los contextos de la base de datos y le doy unos segundos, ya ves que está empezando a iluminarse con todos los errores de las bibliotecas faltantes. Ahora, manera fácil de recorrer estos puntos de control. Y entonces solo puedo seguir adelante e instalar el paquete que falta. Por lo que necesitaría tanto necesidad de carga real. Necesito una entidad para Entity Framework Core. Saber que tengo la versión local, que en mi caso es 5.02. Podría tener una versión diferente. También puedo encontrar e instalar, pero sólo me apegaré a la versión local. Y ahí vamos. Todos esos errores no están resueltos. Pero entonces todavía tengo este tema aquí con el agujero para escuchar, configuraciones de puntos, no entidades. Ahora esas configuraciones existen aquí en esta carpeta, y estas son realmente configuraciones de entidad. Y había incluido el inicializador mapper en esa configuración. Entonces lo que voy a hacer es cortar la carpeta de entidades de la carpeta de configuraciones y luego bajar al proyecto de datos. Haga clic en Agregar. Voy a añadir una nueva carpeta de configuraciones. Y la cosa es que usamos estos archivos de configuración únicamente para sembrar. Cual la realidad es que estas configuraciones se pueden utilizar para cualquier cosa que se quiera ser única sobre esa entidad cuando se está creando. Bueno, si voy a fondo en eso, en mi curso de Entity Framework, pero lo mantendré lo suficientemente ligero para este. Y en esta carpeta de configuraciones, solo voy a pegar carpeta entidades que acabamos de atrapar. Por lo que ahora todas nuestras configuraciones de entidad están sentadas donde están las entidades o los modelos están. Solo necesitamos hacerles saber su nuevo espacio de nombres, que es listado de hoteles, datos de puntos, configuraciones de puntos, las entidades estadounidenses. Por lo que sólo tenemos unos cuantos. Yo sólo voy a hacer esa actualización manualmente. En un caso en el que tengas más, probablemente quieras hacer como nuestro control, encontrarlos y actualizarlos más rápidamente. Pero como se puede ver, está sucediendo de manera bastante fluida en ese punto. Y luego en la nota de contexto de base de datos para resolver esta declaración usando, solo le hago saber que estoy usando hotel es en las configuraciones de datos de puntos entidades y ahí vamos, esos errores ya se han ido. Por lo que en este punto, tengo algunas áreas más por las que solo voy a dar clic para ver qué más se está quejando a medida que avanzamos. Por lo que los usuarios de la EPA no. Y un buen atajo de teclado cuando quieres limpiar estos archivos, tienes todas estas instrucciones de uso innecesarias. Simplemente puedes hacer Tecla de control y E como huevo. Y ves que tipo de limpia los archivos y elimina las declaraciones de uso innecesarias. Está bien, así que déjame dar click a través y ver qué más es completable faltan referencias. Muy bien, entonces no, En mi proyecto API, se está quejando de que no puede encontrar ese espacio de nombres de datos punto y no puede encontrar el contexto de la base de datos, por supuesto. Por lo que puedo quitar esta carpeta de datos. Ya no, ya no como una irrelevancia. Bien. ¿Qué conoces todo el proyecto para esos archivos de datos. Por lo que puedo dejar que la AICPA ennobere el nuevo proyecto yendo a dependencias, agregando proyecto para referencia, y luego haciendo clic en hotel listando datos de puntos. Cuando hago clic en Ok, y luego hago una compilación. Ya verás que tengo una compilación exitosa con ambos proyectos teniendo éxito en la compilación, no tengo más errores. Y ves que fue un procedimiento agradable, bastante sencillo. Siempre es bueno hacer esto, como dije, tipo de actividades de refactorización cuando el proyecto es joven. Pero diré que no es que siempre debas hacer esto. ocasiones tu contexto determina lo que tienes que hacer. Entonces, para un proyecto API muy pequeño, probablemente no necesitaría romperse en 34 proyectos diferentes solo porque quieres que tus modelos estén separados. Pero entonces cuando veas que este presupuesto podría crecer y florecer en algo más de lo que querías esa consideración temprano Viejo. 45. Proyecto principal de la aplicación: Muy bien, así que hemos separado con éxito nuestros activos relacionados con datos de los proyectos de aplicación, y eso es bueno hasta ahora. Muy bien, Ahora vamos a pasar a la siguiente fase de nuestra pequeña operación y no querer hacer es un poco configurar nuestro núcleo de aplicación. Esto mancharía tal vez como una lógica de negocios y cualquier configuración específica de la aplicación. Se, puede ir por muchos nombres diferentes. Entonces el nombre que te estoy dando es más como un Nim sugerido. Ese tipo de sugiere lo que la capa es un barco o el proyecto es un barco. Pero no estoy diciendo necesariamente que esto es lo que debe llamarse todo el tiempo. Por lo que puede ver a otras personas con proyectos de nombre similar con diversos activos y archivos de configuración que se almacenan ahí así como quizá lógica empresarial y los detalles y todas esas cosas. Entonces empecemos con esa. Por lo que sólo voy a hacer clic con el botón derecho en la solución una vez más. Y vamos a añadir otro proyecto que va a ser de naturaleza similar, una biblioteca de clases. Y se va a llamar Hotel listando puntos. Podemos llamarlo aplicación. Core simplemente lo llamaría núcleo. Simplemente trabajaré con core donde solo lo llamo Total listing dot core. Haga clic en Siguiente. Y este también va a ser un proyecto dotnet cinco. Y eso crea, ahora como de costumbre, comenzamos con el archivo de clase predeterminada uno, que solo podemos seguir adelante y eliminar. Ahora en configuración para core, voy a empezar tomando todos los detalles. Por lo que todos los detalles que actualmente están en el proyecto de listado hotelero, los voy a poner dentro del proyecto core. Por lo que voy a crear una carpeta donde mis detalles vivirán de no en adelante. ¿ Todo bien? Y voy a cortar todas estas avena y colocarlas dentro. Entonces, en realidad, no los estoy cortando a todos. Y te mostraré por qué. Estos son detalles y estos son literalmente modelos. Entonces cualquier cosa que sea un detalle lo que significa que se parece la clase de datos y tuvimos un número de ellos por diferentes razones. De hecho los voy a mantener lo siento, voy a tomar esos específicamente. Entonces no estoy tomando error, no estoy tomando peticiones param porque esas eran algo específicas al nivel API, no el no que el nivel BTO, ¿verdad? Entonces voy a cortar esos y luego pegarlos dentro de la carpeta de detalles. Por supuesto, me fui a arreglar algunas referencias aquí, así que no, mi espacio de nombres aquí es listado de hoteles. Puntos. No es puntos, núcleo, perdón, puntos. Detalles. Ya no modelos. Entonces ese es nuestro nuevo espacio de nombres para detalles. Entonces iba a usar ese nuevo espacio de nombres a través de todos ellos. Por lo que todos saben dónde viven. ¿Todo bien? Y todo el mundo debería poder ver todo el mundo sabe que todos están en el mismo espacio de nombres. Todas esas áreas deberían desaparecer entre los archivos. Y notarás que cuando copie y pegue, ciertas cosas simplemente se agregan con bastante rapidez. Por lo que he habilitado una característica en Visual Studio. Si vas a Herramientas, Opciones, luego editor de texto, C-sharp avanzado, verás una opción aquí que dice Agregar faltante usando directivas en p. Así que cuando estés cortando y BCR copiar y pegar código en sí solo lo hará en realidad. tratar de poner todas las declaraciones de uso que podrían faltar, ¿verdad? Para que eso pudiera acelerar el proceso de mover código en el futuro. Entonces ahora que hemos movido todos nuestros detalles, si hago una compilación, sé que voy a estar dentro de un montón de errores porque cualquier cosa que dependiera los detalles ya no va a ninguna parte los detalles están y eso está bien. Eso es parte el otro factor. También quiero pasar por encima de mi carpeta de servicios, así que solo voy a copiar esto y pegarlo en el núcleo de la aplicación, ¿verdad? Y entonces una vez más, tenemos que actualizar este espacio de nombres. Por lo que este no es un hotel listado de servicios dot core, dot. Sería lo mismo para su interfaz. Por lo que sólo podemos conocer esa actualización rápidamente. Ahora, se ven todas esas hierbas porque no sabe dónde cercar todas estas opciones relacionadas con la identidad en estas configuraciones de extensión. Y algunas de esas bibliotecas simplemente no están en este proyecto. Este momento. Bueno, antes de empezar a agregar, agregar, agregar las referencias del proyecto, solo quiero pasar primero por todos los archivos clave. Por lo que el siguiente son unos sería el material del repositorio. Por lo que yo repositorio y repositorio. Podemos cortar esos. Y basado por aquí. Y ya sabes, en este punto algunas personas en realidad simplemente fusionarían estas carpetas son probablemente solo tienen una carpeta que dice repositorio y luego ahí dentro tienen ambas interfaces y los contratos y las implementaciones. No necesariamente tienes que hacer eso, depende de ti. Pero fui a mantener la estructura de carpetas. Y esto ahora se va a vivir punto core I repositorio. Y lo que voy a hacer es sólo copiar ese hotel, el núcleo 100 por favor. Todas estas referencias a través y a través de nuestros proyectos con el nuevo espacio de nombres. Por lo que al final de este proceso, todo el mundo sabe que tienen un nuevo hogar. Pero una vez más, algunas de las referencias Predict siguen retenidas para dar un paseo. Eso está bien. Llegaremos allí eventualmente. Está bien. Entonces otra cosa que voy a querer mover es este archivo CSS de extensiones de servicio dot. Entonces en el archivo de inicio teníamos todas estas extensiones de servicio encendidas, así sucesivamente. Al igual que en este punto, todos viven dentro del proyecto AICPA. Pero no necesariamente los quiero dentro de los productos API. Entonces voy a tomar este servicio extensiones 0 y lo voy a colocar dentro del núcleo. Y una vez más, voy a hacerle saber que se le dice a listar punto. ¿ Todo bien? Ahora lo que vas a ver con este tipo de movimiento es que todas estas referencias a todas estas bibliotecas ya no estarán específicamente en el proyecto API. Sabrán vivir dentro del proyecto central. Y entonces la API Bridget sólo hará una referencia al proyecto central. Entonces cuando estamos agregando bibliotecas de terceros, tal vez más adelante quiero agregar un sistema de correo. Todas esas cosas, simplemente seguiríamos agregando al núcleo porque el núcleo va a ser líder inmediatamente entre la API y la funcionalidad real que interactúa con aplicaciones de terceros, ¿verdad? Entonces por eso son repositorios aquí porque es interactúa con la base de datos o servicios, está aquí directamente con la API o el servicio de identidad. Más bien, el detalle está ahí porque interactúa con los terceros que están las personas. De modo que cualquier cosa que esté relacionada con terceros iría dentro del área central. Y si en la base de datos relacionada va dentro del proyecto de datos. Y entonces cualquier cosa que sea la aplicación en sí estaba en nuestro proyecto API. Ahora, sólo note que todavía tenemos este algún controlador cool y el modelo. Entonces en realidad sólo voy a eliminar esos dos porque realmente no los necesitamos. Pero había bueno para fines informativos inicialmente, al menos, ¿verdad? Entonces creo que nuestros proyectos se ven bien aparte de las flechas obviamente, pero así es como empieza a verse nuestra solución. Y si miras aquí, se ve mucho más compacto. Es mucho más fácil ver exactamente lo que necesitas cuando lo necesitas. Si no estás haciendo nada ahí, siempre puedes ir al núcleo y seguir adelante y aplicar cualquier modificación a cualquiera de estos. Y entonces siempre se puede ampliar la lista de proyectos en consecuencia, lo siento, entidades de acuerdo a leer. Por lo tanto, sumemos algunas de las dependencias que faltan en el proyecto API. Voy a agregar la referencia del proyecto al proyecto central. Y en el proyecto de núcleo y cuándo agregar la referencia faltante al proyecto de datos. Ahora con esa referencia de proyecto que se está haciendo, si volvemos a alguno de nuestros controladores o algo así, no quiero que alguien comience con es una limpieza. Yo sólo voy a hacer Tecla de control, lo siento, deshacerme de todas las faltantes sin usar usando declaraciones. Y luego puedo usar mi punto de control para incluir las nuevas referencias, ¿verdad? Entonces para todas estas líneas estrechas, solo puedo hacer Control punto-punto las sentencias de uso. Y para mantenerlo sencillo para esta actividad en particular, lo que quiero hacer es solo asegurarme de que yo cualquier cosa que se pueda resolver con un control. Eso es lo que quiero enfocarme en ella en absoluto. Entonces si voy a la tecla Control, deshazte de las declaraciones en Estados Unidos y luego Puntos de control para agregar los que faltan. Y luego una vez que vea que no tengo más errores, adelante. Si aún me encanta el icono de Arizona, resolverlo usando las sugerencias del Visual Studio, entonces lo dejaré en paz. Está bien, así que voy a dejarlo en paz, ¿verdad? No. Lo que pasa es que vas a estar viendo flechas porque faltan ciertas bibliotecas. Vamos a estar cuidando de las bibliotecas que faltan en el próximo. Entonces solo quería mantener este tipo de apretado y enfocado en meter estos proyectos. La referencia del proyecto está en marcha. Muy bien, así que adelante e incluya a los desaparecidos usando declaraciones. Y una vez hecho todo eso, creo que la mayoría de nuestros errores que serían lift estarán dentro de nuestros proyectos centrales y valor más específico en lugar de las extensiones de servicio dentro del repositorio también. De acuerdo, entonces cuando regresemos, haremos una limpieza final y luego solo haremos una prueba para asegurarnos de que todo siga funcionando como se esperaba. 46. Limpian y prueba: Muy bien, chicos, así que ahora necesitamos limpiar todos los errores que dejamos de nuestra actividad previa. Lo que tengo abierto en este momento es la aplicación de listado de hoteles. Lo sentimos, el hotel listando archivos del proyecto. Todo lo que tienes que hacer es hacer clic en el archivo del proyecto. Tan solo un clic y te mostrará todos los paquetes que están siendo referenciados dentro de ese archivo. No hay forma suficientemente simple de que estos proyectos pasen al proyecto principal es copiar el grupo de ítems. En realidad, voy a hacer un corte porque estas son más como bibliotecas de terceros. Los únicos que probablemente necesitarían quedarse aquí serían como el automapper porque todavía tenemos la configuración automática aquí. E incluso entonces. Creo que podríamos mover esto. Ven a pensarlo, así que me voy a mover que sé que dije que era una limpieza. No, en realidad estoy haciendo otros movimientos. Voy a cortar configuraciones y volver a bajar en la cancha. Cosas relacionadas con terceros que quieres poner en esa carpeta ahí. Y no estoy diciendo necesariamente que esto tiene que ser esto son sólo tres proyectos diferentes, tres capas diferentes, por así decirlo. Algunas personas tendrían en realidad el núcleo diferente a la lógica empresarial. Pero entonces este no es realmente nuestro modelo de negocio porque todo es genérico, y es así que necesitas trabajar dentro. Si tuvieras repositorios específicos que estuviesen haciendo como operaciones específicas todo el tiempo, entonces probablemente querrías tener otro proyecto que esté almacenando ese tipo de cosas, ¿verdad? Entonces no es necesariamente que tenga que ser tres proyectos. Si haces mi curso de Arquitectura Limpia, ves que puedes terminar con cinco o seis proyectos diferentes. Y a lo que llamamos sólo a la arquitectura, pero no vamos a entrar en todo eso en esta actividad en particular. Entonces no, que he movido este láser inicial superior. Necesitamos, por supuesto, configurar nuestro nuevo espacio de nombres. Yo solo controlo clave para limpiar ese archivo. Y por supuesto, tenemos un montón de áreas , por eso estamos aquí. Entonces en este proyecto para la API, voy a tomar toda esta sección de grupo de ítems y esta es una forma mucho más rápida de conseguir todas estas referencias en otros proyectos que entrar en nuevo get y obtener ellos uno por uno como lo hicimos inicialmente, ¿verdad? Entonces sólo los voy a poner. Y luego baje al núcleo y los voy a perforar, así que sólo los voy a poner justo encima de ese grupo de ítems que está ahí, y luego voy a guardar esto y simplemente construir. Y después de la compilación, todavía tengo un montón de errores, pero lo que está pasando es que está restaurando y registrando todas estas referencias. Entonces eso está bien. Podemos pasar y resolver todos esos temas. Entonces si voy y vuelvo a saltar al proyecto API, ya ves, sí, tenemos un montón de errores en este es el inicio de nosotros. Por lo que estamos en el inicio de ese archivo de caso de nuestro proyecto API primera clave de control de acción. Y si no te gusta el atajo de teclado, en realidad puedes simplemente presionar que es un pincel ahí. Acabo de tener corridas que limpiar para, ya sabes, todos estos son titulares se refieren a las extensiones de servicio que ahora faltan en el proyecto API. Entonces si controlo eso y luego introduzco una sugerencia, agrega la declaración de uso para el proyecto central. Y mira eso. La mayoría de ellos se van. Ahora éste está diciendo que quiere agregar papel otoñal, y no puede encontrar al mapeador inicializar láser. Antes de abordar esa, sin embargo, porque van a hacer algo especial. Con eso, déjame simplemente seguir adelante y sumar la otra faltante usando referencias para las unidades de trabajo y nuestro gestor de ojo fuera. Y con todo eso hecho, hemos arreglado la mayoría, si no todos, de los errores. ¿ De acuerdo? OK. Esto se debe a que todavía hay errores en el objetivo para la corrección. Entonces eso está bien. Vamos a enfocarnos en el automapeador. No, lo que puedo hacer es realmente crear un método de extensión que se registre automáticamente porque el láser de inicialización ya no está en nuestros proyectos API, así que no tenemos que preocuparnos por eso. Lo que vamos a hacer es reescribir este poco de código y verás por qué en unos pocos. Para no, sigamos adelante y sumamos las declaraciones faltantes usando para las otras dos líneas. Y este error está ahí, probablemente porque aún hay misterios sin resolver con los archivos siendo referenciados. Entonces eso está bien. Entonces, centrémonos en la parte superior otoñal. Entonces lo que voy a hacer es agregar un método de extensión de servicio que configurará otoño superior derecha. Entonces tenemos algunos escritos ya. Yo sólo voy a tomar uno y especie de duplicarlo, y éste va a ver configurar auto mapper. Y dentro de esto, sólo vamos a ver algo así como servicios que agregan superior otoñal y montaje que consiguen montaje. Por lo que hay situaciones en las que podría tener múltiples configuraciones de mapeo. Y no me malinterpreten, podríamos haber usado el mismo tipo de mapa o inicializar nuestro código proveniente de nuestro archivo Start-Up, podría haber reutilizado esta sintaxis exacta. Correcto. Eso funcionaría. Eso está bien, porque mientras sepa dónde está el láser de inicialización superior, estaría bien con eso, como se puede ver. Pero como te estaba explicando, hay momentos en los que podrías tener múltiples elevadores iniciales superiores, tal vez tener diferentes endpoints o tienes tantos detalles y entidades que podrías terminar teniendo diferente superior risers iniciales con diferentes configuraciones para diferentes situaciones, cualquiera que pudiera terminar siendo si el sistema crece a ese tamaño, puedes usar esta expresión general donde las reflexiones en realidad solo saldrán y encontrarán cualquier archivo que coincide con lo que está buscando Otoño Superior, que sería mi parte superior inicializar o heredar del otoño superior derecha. Por lo que cualquiera de estas líneas funcionaría perfectamente aquí. Pero mi punto es que tenemos que sacarlo y ponerlo aquí, porque ahí es donde el superior se inicializa en nuestras vidas. Entonces en el inicio ese archivo CSV, ya puedo ver configurar. Otoño Superior. Y ese sería un caso cerrado. Está bien. Entonces creo que voy a seguir adelante con el enfoque más genérico donde sólo decimos conseguir la ejecución de ensamble y ad autumn arriba en consecuencia. Está bien. Entonces simplemente me desplazé un poco y estoy viendo el manejador de excepciones y ese modelo de error, no lo movimos. Entonces sí, tomé la decisión de no moverme porque pensé que hubiera sido mejor en la API. Claramente, se necesita terminar en el curso, así que eso no es problema. Simplemente tomaré ese objeto de error y podemos. No quiero ponerlo en los detalles. Bueno, no es un poco. Entonces voy a crear una nueva carpeta llamada Modelo CSC que estoy especie de ser específico o al menos lo mejor que pueda estar con donde pongo qué. Porque al final del día, la separación de preocupaciones sí hace crecer tu proyecto. Pero luego te ayuda a ser más objetivo con dónde estás poniendo qué es y qué estás nombrando tus archivos y carpetas, ¿verdad? Entonces aquí tengo el caso AirDots, y solo le hago saber que ahora vive dentro de la carpeta Dot Core Dot Models, y eso debería cuidar el error que estamos viendo en ese archivo. Está bien. Una vez más, solo necesito hacer mi limpieza. Tecla de control. Deshazte de todo lo que no se esté utilizando y no se necesite y saltando a lo más temprano. Vemos que bajamos de 50+ flechas a No. 40 plus. Eso está bien. Entonces saltemos al mapeador y vemos aquí que se está quejando del. Perfiles, si controlo que estoy usando Autumn Upper, eso cuida una cosa, si controlo eso y agrego las declaraciones de uso o los detalles que cuida otra cosa. Y así como así, todas las flechas se han ido. Y entonces esa lista se reduce en unos 15. Entonces ahora si saltamos al siguiente archivo problemático me unidad trabajo duro. No sabe dónde está. Entonces podemos simplemente seguir adelante y agregar que usando declaración y cualquier cosa que no podamos encontrar, solo controlamos eso ¿verdad? Por lo que no puede encontrar el contexto de la base de datos. Eso es todo. OK, ahí está. Usando los datos de listado de hoteles. No hay problema. Y eso debería ocuparse de todos los demás expedientes que no puede encontrar. Está bien. Y luego tenemos algunas flechas, pero el control que no va a resolver esas. Entonces eso significa que necesito resolver lo que hay en esos archivos. Entonces ves algunos de estos, pesar de que hay muchos errores, muchos de ellos están contenidos en un solo archivo. Entonces arreglando IE usando declaraciones o algo donde deshacerse de los errores muy rápidamente. Entonces vamos a saltar a los otros archivos. Este es el gestor de autor solo necesita usar declaración para eso y solo una clave de control para limpiar. ¿ Algo más? Si salto a ISPManager, así te darás cuenta de que estos son los marcadores azules aquí en los márgenes. Entonces esos me permiten saltar a los archivos que se están heredando o que archivo está heredando de derecho. Entonces siempre puedo decir, OK, ¿qué archivos heredan de ISPManager? Y simplemente nunca me va a llegar allí. Entonces, ¿para habilitar ese? Y le he mostrado a la gente este, y no funcionó para algunos. Funcionó para algunos. Pero solo puedes volver al editor de texto de opciones C-sharp Advance, y al final verás margen de herencia, que es experimental. Entonces si no funciona, no me demanden, por favor. Pero en términos generales, debería funcionar como cómo ves que se esté usando para mí aquí así puedo simplemente saltar a ispmanager y arreglarlo usando declaración y control Katie para deshacerse de los errores y los innecesarios. Está bien. Y si vuelvo a la lista, eso se encarga de bastantes si salto por aquí. Tecla de control aquí. Por lo que solicitar armas de fuego realmente es necesaria por el repositorio también. Entonces eso significa que en este punto, no tengo ningún uso para la carpeta de modelos. Por lo que voy a tomar peticiones params colocados dentro de modelos en nuestro proyecto core lo deje, ni su nuevo hogar, que es Dot Core Dot modelos. Está bien. Y solo voy a quitar esta carpeta no innecesaria de nuestro proyecto. Está bien. Entonces, ¿dónde estuvo ese error? Entonces estamos arreglando este error. Déjame saltar de nuevo y creo que estamos en el repositorio genérico. Pero mientras estoy aquí, déjame solo controlarlo. Te deshaces de algunos errores y luego puedo usar lo que puedo usar margen de herencia porque hay un error en el repositorio genérico. Entonces cuando salto a un repositorio genérico, puedo arreglar esto usando declaración para armas de fuego de búsqueda. Y una vez que eso esté arreglado, entonces debería poder volver al repositorio genérico y ver un archivo sin errores. Si no, permítanme simplemente controlar eso en la declaración de uso. Y eso está bien. Y luego de la declaración de uso para armas de fuego de Occidente. Eso está bien, así que quiero decir, puede que no estés pasando por los mismos errores en el mismo orden que yo solo porque acabo de levantarme conmigo mismo, me doy cuenta de que podría estar moviendo un poco rápido, pero espero que estés apreciar el proceso de pensamiento detrás de la reflexión sobre lo que se necesita fijar en el camino. Está bien. Por lo que siempre puedes simplemente seguir marcando lo antes posible. Y como eres, estás usando sentencias como espacios de nombres fijos, notarás que eso temprano solo reduce nuestros reduce y reduce. Entonces aquí estoy abajo a seis errores. Empezamos a los 50 más estoy abajo a las seis. Por lo que simplemente agregando la declaración de uso para ese modelo de error que nos reduce a cinco y luego controlarlo para limpiar este archivo y luego agregar el uso para armas de fuego de búsqueda. Y ya casi estamos ahí, casi gratis en casa. Ahí vamos. Y sólo tecla de control. Al ver ese arriba y allá vamos, libre de errores, déjame hacer una construcción. Y voila! Por lo que ahora hemos construido exitosamente proyectos construidos. Está bien. Entonces tomémoslo a dar una vuelta porque sí, esto se ve bien. Nuestro proyecto API ahora es mucho más delgado de lo que era cuando empezamos. Pero, ¿todavía funciona? Entonces tomemos eso para dar una vuelta. Está bien. Entonces es arrancar, y esa es una buena señal. Está bien. Entonces probemos algo lo suficientemente simple. Voy a tratar de hacer bien nuestro registro. Entonces pruébalo y me voy a registrar como usuario il1r2 ejemplo convertido en mi contraseña es una contraseña lo suficientemente complicada como sabemos y hemos probado, y quiero la regla usuario. Todo lo demás, solo me voy y luego hago clic en ejecutar, y luego estoy obteniendo una respuesta total, lo que sugiere que fue exitoso. Entonces eso significa que todo lo que hemos configurado sigue funcionando bien. Todo lo que hicimos fue mover los archivos, hacer nuestro proyecto un poco más limpio y un poco más fácil de mantener e incluso probar. Entonces no voy a hablar mucho de las pruebas unitarias, pero una de las principales razones por las que la gente tiende a separar sus archivos que es aumentar la estabilidad del código uno y hacerlo un poco más modular. Por lo que es más fácil probar y ver qué se está probando si quieres más en las pruebas unitarias. Tengo una velocidad de desarrollo impulsada por pruebas de curso en él núcleo que puedes hacer para ver las pruebas unitarias completas funcionan en una situación similar a esta. Entonces con todo eso hecho en la siguiente lección, solo vamos a revisar todos los cambios que hicimos, el proceso de pensamiento detrás de estos cambios. Y si realmente es necesario o no. 47. Revisar las Modificaciones y los beneficios: Muy bien chicos, bienvenidos de nuevo. En esta lección, solo vamos a revisar todos los cambios que hicimos a nuestro proyecto API. Entonces una vez más, con lo que empezamos generalmente se conoce como una arquitectura todo en uno porque en un proyecto, teníamos Conectividad de Base de Datos, teníamos lógica empresarial, teníamos de todo, de acuerdo, denominadas las configuraciones, referencias de terceros, etcétera. Ahora como hemos visto y probado y probado, todo funciona como se esperaba. Entonces lo que hemos hecho aquí no es necesariamente mejorar la funcionalidad. Porque teníamos funcionalidad. Lo que hemos hecho es mejorar tal vez la legibilidad, la mantenibilidad, y solo el diseño general fuera del proyecto. Para que a la larga sepamos a dónde tenemos que ir para encontrar por qué. Son muchos los aspectos que puedes agregar a un proyecto API en cuanto a solo la arquitectura fuera del proyecto. Y paso por muchos de esos en mi curso sobre arquitectura sólida con entidad y arquitectura sodded en ASP.Net Core. Por lo que puedes revisar ese curso si quieres ver justo lo mucho que pensaste proceso conseguir realmente entrar en construir fuera. Y arquitectura API. Sí mencioné las pruebas. Las pruebas son un poco más posibles cuando se toma este enfoque y se separa todo. Por lo que puedes consultar mi curso sobre pruebas unitarias también. Pero mi punto es que en este punto hemos cambiado el diseño de los archivos, pero no nos hemos quitado se suman a la funcionalidad general. Por lo que la funcionalidad se puede lograr a través de todo en una arquitectura, como vemos en viñeta. Hicimos esto para aumentar la mantenibilidad y legibilidad de nuestros archivos. Entonces repasemos todo lo que hicimos de principio a fin. Lo primero que hicimos fue crear este proyecto de datos. Y en estos proyectos de datos ponemos en todas nuestras configuraciones para diferentes entidades así como todas las entidades así como el contexto. Podríamos haber separado aún más estos sin hacer una carpeta sólo para las entidades. El modo en que lo expones se basa en contextos aéreos. Espero que lo encuentres más legible para ti. O proyecto de año entero. Los compañeros son liderados, lo encontraremos más ilegible. Todo el mundo tiene unos estándares diferentes. No estoy tratando de ser prescriptivo con mis sugerencias, ¿verdad? Entonces al separar los objetos de datos de la propia API, sacamos de la API todas las preocupaciones de ambos activos relacionados con la base de datos, de la propia aplicación, ¿verdad? Y luego para que aún sepa a dónde ir y buscar los objetos relacionados con datos. Simplemente ponemos en una referencia de proyecto al proyecto de datos. De acuerdo, junto con eso vino cualquier otra referencia de terceros como el núcleo de identidad de uno y así sucesivamente. Entonces, cada vez que estás poniendo algo que era, en cualquier momento estás poniendo algo que tiene una referencia de terceros, por supuesto, el proyecto en sí necesita saber cuáles son esas referencias de terceros. El segundo que hicimos fue crear la obligación sobre núcleo y todo el pensamiento general detrás del núcleo es que necesita interactuar con cualquier cosa que sea su tercero. Entonces una vez que tengas algo que sea de terceros o que necesite mediar con una biblioteca de terceros, nuestro sistema, puedes pensar en ponerlo en el núcleo. Entonces en contextos, tenemos el inicializador mapeador, que es para ópera otoñal. Esa es una biblioteca de terceros. Ese es el trato es la tercera parte es que usaremos eso para transferir datos. Tenemos los repositorios, estos interactúan con la capa de datos soleus. Están interactuando con la base de datos, que es de terceros. Ponemos eso ahí. Eso también podría duplicarse como lógica empresarial, ¿verdad? Si estamos usando repositorios personalizados en el camino, tenemos modelos aquí porque ciertas operaciones requieren estos modelos. Y entonces tenemos los servicios que interactúan con la identidad en esta situación. Entonces también puse estas extensiones de servicio en el proyecto central porque aquí es donde estamos registrando todas las bibliotecas de terceros a las que no queremos cumplir con referencias directas en nuestra API. Entonces déjame director de TI por ejemplo, a ellos en el proyecto central. Y luego configuramos nuestros métodos para que podamos hacer el registro. Eso está bien. Y luego ponemos todo eso en el núcleo nulo para la API basado en la forma en que lo construimos. Entonces en base a la forma en que se construyó, algunas personas realmente lo tendrían que la API y nunca ve la capa de datos en sí, ¿verdad? Pero por todo lo construimos nuestros controladores y utilizamos la unidad de trabajo, Es un poco difícil hacer eso porque tenemos que hacerla amiga, Derek, o por ejemplo, algunas de las entidades. Entonces cuando hablas de controladores delgados, que también Louis tiró en mi curso de arquitectura limpia, no estoy tratando de marcar es ahí nada ya que solo te estoy haciendo saber, que puedes ir allá y verlo. Pero hablamos de controladores delgados donde estamos haciendo mucho menos. Pero eso se entiende mejor cuando se tiene una fundación que se parece más a esto. Entonces entiendes por qué tomarías ciertas decisiones. Entonces es bueno hacer este curso y luego hacer ese. puedas obtener ese tipo de trayectoria ascendente en términos de pensamiento y comprensión de cómo se desarrollan las API. Pero mi punto es que tenemos que hacer referencia al proyecto de datos y al proyecto central desde la API para facilitar las referencias que se necesitan a nuestra unidad de dónde a nuestras entidades. Y en nuestro startup dot cs, todos nuestros servicios de registro personalizados que se están yendo figurando. De acuerdo, así que todas esas pequeñas cosas sí juegan un papel enorme en todo esto juntando. Y más o menos eso es todo lo que vamos a estar haciendo para refactorizar este listado hotelero API. Una vez más, tomamos un proyecto, lo dividimos en tres, tenemos más archivos, probablemente tengamos más carpetas, pero ¿adivina qué? A la larga, será mucho más legible y más fácil mantenerlo. Ahora antes de proceder a revisar esto, hay un ajuste más que hay que hacer. Y mientras te daba ese monólogo, Justin, lo noté. Por lo que tenemos esta carpeta Migraciones la cual me incluyó. No sé por qué lo pasé tanto por alto, pero esta carpeta Migraciones no debería estar aquí. Debería estar en nuestro proyecto de datos porque representa todas las migraciones de bases de datos, ¿verdad? Entonces lo voy a citar y lo voy a pegar dentro de datos. Y solo por motivos de consistencia, me voy a asegurar que cada uno de estos tenga el punto en él. Espacio de nombres, ¿verdad? Para que podamos, hay un poco a través de abrir cada uno y darle datos de puntos. Al igual que para la instantánea, se desea darle datos. Y todo mientras seguimos en snaps, vería que tenemos esta aireable para usar columnas de identidad. Entonces creo que esa es nuestra referencia o con nuestros dedos de los pies del proyecto, solo estamos incluyendo la identidad ASP NET Core Entity Framework Core. Pero si no me equivoco, también necesitamos el SQL Server. Entonces recuerda que tomamos todo este grupo de ítems de nuestro proyecto API. Por lo que definitivamente necesito esta biblioteca. Simplemente lo copiaré es porque no estoy seguro, Dependiendo de ello, pero lo copiaré y lo pegaré en el proyecto de datos. Y cuando vuelva aquí después de que haga sus pequeños cheques y equilibrios, o si fuerzo una compilación, ese error debería desaparecer. Y debería saber tener proyectos sin errores, vale, todavía tengo algunos errores. Y estos errores están apareciendo en los archivos autogenerados que corresponden con el con las migraciones. Entonces déjame ver si darle a esos el espacio de nombres resolvería el error y hace de ahí. Entonces en este punto sin embargo, porque sólo estamos recapitando en desenvolver se abrió aquí dando otra actividad. Pero sólo voy a señalar sus opciones en este punto. Te puede gustar, oh, sólo tenemos tal vez cuatro o cinco archivos de migración por los que puedes pasar y hacer todo eso y actualizar los espacios de nombres. También podrías simplemente eliminar las migraciones porque las migraciones son realmente solo el historial de los cambios de la base de datos. Pero entonces si la base de datos está donde quieres que esté, la próxima migración en la que estás. Si todo está desprovisto de migraciones, tendría la última versión de la base de datos. Ahora todo esto está en dev. No estoy diciendo necesariamente que por eso se debe hacer, pero una vez más, el contexto es todo donde desarrollar algo aquí, hemos entregado Seúl, nos deja ejecutar un experimento y yo voy a hacer todo aquí ni de Fuller. No, no estoy encubriendo nada. Quiero que veamos exactamente cómo funcionaría esto desde cero, ¿verdad? Entonces una vez que acabo de hacer fue pasar por encima de la carpeta Migraciones porque la migración no debería estar en el APA, eso está bien. Pero si tomo migraciones y hago clic en Eliminar, eliminar, eliminar esa carpeta Migraciones, y luego voy a mi consola de Package Manager. No, no puedo hacer ninguna migración aquí porque necesito las herramientas. Así que déjame ir por aquí. Entonces solo les estoy mostrando todo lo que necesitamos. Necesitamos herramientas que necesitamos el diseño. ¿ Hay otra biblioteca que necesito? No lo creo, ¿verdad? No. Y podría que solo necesite el núcleo de Entity Framework si no lo tengo ya. Entonces déjame sólo cavar estas dos bibliotecas. Pero terminó en el proyecto de datos. Y yo sólo voy a saltar de nuevo. Y también voy a tomar Entity Framework Core y poner en este proyecto. Entonces cuando estoy ejecutando migraciones null en el paquete administrar contras, consola de Package Manager. Necesito asegurarme de que mi proyecto predeterminado esté establecido el proyecto de datos porque ahí es donde vive el contexto, ¿verdad? Entonces si digo agregar migración guion en este punto, lo siento, nombre, sería fresco. Mi acuerda tiro. Está bien. Y estoy recibiendo un error porque todavía me falta el paquete de diseño. Eso es lo que realmente quería. Muy bien, así que solo agreguemos esos paquetes de diseño. Entonces esto, no quiero usar NuGet y buscar Microsoft dot Entity Framework Core Design. Y ahí vamos. Entonces esto adelante e instálalo. Ahora ves que la versión aquí es mucho más alta que la versión que estoy usando. Eso está bien. Voy a bajarlo a la versión en porque quiero mantener mi proyecto consistente. De lo que te aseguras de que estás usando la versión que tienes arte. Por lo que instalar. Y una vez que eso se haga, voy a guardar decir c saber que se agrega diseño, ¿verdad? Entonces quería volver atrás y todo está bien porque metí en mal los comandos de migración de anuncios. Tan fresca migración, presione Enter. Muy bien, entonces el error se está repitiendo. Oh, lo siento mucho. Por lo que este paquete también debe estar en la startup. El proyecto startup son los proyectos API. Yo sólo voy a saltar allá arriba. Y sólo estoy haciendo esto rápidamente. Entonces solo voy a crear un modo de grupo de ítems, grupo TIM. Y en ese grupo de ítems, solo estoy poniendo ese diseño que acabo de sacar del proyecto. De acuerdo, así que intentemos eso otra vez. Entonces ya ves, dije que voy a hacer esto desde cero para que puedas ver el proceso, ver las flechas, y saber qué esperar. Ahora ya ves, tengo una migración exitosa. Y si miramos a través de este en, si estamos mirando una foto, vemos que sólo tenemos un archivo de migración. Está bien, y va a su espacio de nombres de tarjetas, y el deseo autogenerado va al espacio de nombres actual, eso está bien. Pero si nos desplazamos, en realidad seríamos capaces de ver cada cosa que se ha hecho hasta este punto. El R, Una vez que debo ver es que digamos que tenía mucha columna ADA, quitar una columna, cambiar nuestra columna, Hacer esto, hacer eso a las tablas a lo largo del camino, que es una parte estándar de desarrollo. Pero terminaste con 20 archivos de migración. Por lo que agregamos para migración difusa podría haber terminado con 20 porque prueba y error cambiando aquí y allá. Entonces el punto es que si realmente eliminas toda la migración PFAS y haces una migración fresca, echará un vistazo a cómo se ven los datos, saber cuál es la estructura de la base de datos. No. Y ese archivo de migración con el que obtienes tienen todos los cambios como en ese punto. Por lo que fácilmente condensarías 50, 60 archivos de migración en un solo archivo de migración que solo te da la última versión de la base de datos en un solo objetivo. Entonces eso es probablemente algo que querrías considerar también en el futuro. Por supuesto, tener la migración en incrementos también te ayuda a retroceder si es necesario. Para que puedas calibrar lo que necesitas hacer. Está bien. Pero sólo quería demostrar por qué moveríamos el archivo de migración todo fuera del proyecto web y cuáles son las posibles ramificaciones. Entonces con todo eso hecho, creo que en realidad ya terminé con esta lección en este punto. Hemos refactorizado nuestro proyecto y sabemos que todo está donde lo, nuestro Todo sabe como un nuevo hogar de acuerdo al papel que desempeña en nuestra aplicación. 48. Configura el entorno de Hosting - IIS y SQL Server: Oigan chicos, bienvenidos de nuevo. En esta lección, comenzaremos a configurar nuestro entorno para el despliegue local de nuestra API. Y note, cuando decimos despliegue local, esta podría ser fácilmente sus máquinas personales. Entonces en mi situación, lo estaré desplegando en mi máquina personal. Pero también podría ser en una empresa mushy en nuestro servidor algún lugar donde esta API necesita servir en toda la red. Y potencialmente podría ser incluso. Entonces Internet es cualquiera que sea la situación, enseñando, tú, te estás mostrando pasos críticos hacia la preparación de esta máquina para que pueda alojar tu API. Por lo que nuestro viaje comienza aquí donde tenemos que descargar el.net favor antitimed Señor del SDK, que hemos estado utilizando para el desarrollo. Pero queremos asegurarnos de que tenemos el tiempo de ejecución y solo podemos conseguir ese paquete de hosting para Windows. Entonces, cuando haces eso, inicias tu instalador. Y luego avanza y pasa por los puestos de control de seguridad. Y las que se hace, se puede cerrar eso. Y entonces sabemos que vamos a pasar a configurar, supongo, o servicios de información de Internet. Entonces lo que queremos hacer es, diría de nuevo, sí ir a tu menú de inicio y ver la característica. Y luego quieres hacer clic en activar las características de Windows en nuestro apagado. Por lo que los que seleccionaron, esta pequeña caja aparecerá y quieres asegurarte de que seleccionas los servicios de información de Internet. Una vez que hagas eso, vas a conseguir esa plaza. Ese cuadrado significa que no es todo lo que está marcado, lo cual está bien. No necesitas cada característica. Te voy a mostrar sólo las que tengo instalado actualmente y luego solo puede pasar y asegurarse de que esas también estén marcadas de tu lado. Por lo que tengo la consola de administración y luego tengo estas bibliotecas para funciones de desarrollo de aplicaciones. Para que puedas asegurarte de que las marques. A lo mejor no los necesitas todos, pero me funciona con estos, recomendaría que te asegures de tener esos. Y luego para las características HTTP, puedes seguir adelante y tomar esos salud y diagnósticos una vez que yo, bueno, esa sección es en realidad opcional, pero te recomiendo que obtengas la sección de registro HTTP. Entonces características de rendimiento, autenticación básica y las demás. Por lo que una vez que tengas esos, puedes hacer clic en Aceptar y luego puede tardar un tiempo en instalarlo. Ya los ayudé así que no necesito esperar a que se instalen, pero una vez que terminaron de instalar, entonces puedes reanudar este video. Entonces una vez que estés seguro de que tienes, ya que ese proceso está terminado, para asegurarte de tener S, solo puedes ir a tu menú de inicio y teclear S, y luego verás que aparece. Y luego cuando inicies, obtendrás esta consola que te muestra tu servidor y todos los sitios que tienes actualmente listados allí. Para asegurarte de que está funcionando, realidad puedes simplemente hacer clic en Sitios web predeterminados e ir a Burroughs. Y luego te mostrará esta página la cual te muestra que ahora estás viendo a tu servidor. Ahora otra parte esencial de configurar su entorno local será asegurarse de que su servidor de base de datos esté instalado y en funcionamiento. Entonces cuando hablamos del servidor de base de datos, tenemos algunas opciones en un entorno empresarial, probablemente ya lo tengas o deberías tenerlo. Puedes consultar con tu administrador del sistema lo que necesites hacer. Pero solo tienes que seguir adelante y asegurarte de tener SQL Server a nivel personal. Si no lo tienes ya, tienes que opciones. Tienes ya sea desarrollador o express. Por lo que se expresa muy libre. No se requiere ninguna licencia en absoluto. Y lo que entonces tiene algunas limitaciones a nivel personal expresa bien. Desarrollador te da muchas más características y en realidad está lleno de potencia. Por lo que es una descarga mucho más grande y una tarea mucho más grande que tenerla instalada da acceso a muchas más características. Para este despliegue, probablemente puedas salirte con la tuya Express, pero entonces tal vez si estás pensando en la longevidad, probablemente solo quieras conseguir desarrolladores para que tengas todo lo que necesitas para poder seguir adelante y descargar eso. El montaje es bastante sencillo y al final de la misma se te pedirá que instales el estudio de gestión. Y por si acaso te perdiste ese paso, siempre puedes solo Google SMS, que es la abreviatura de SQL Server Management Studio. Y una vez que pasas por eso, siempre puedes simplemente no cargar el estudio de gestión a través de este medio también, que también es una instalación sencilla. Por lo que para lanzar el estudio de gestión, después de que esté instalado y conectarse a su servidor de base de datos, puede seguir adelante y hacer clic en el icono y verá esta pantalla de lanzamiento de splash. Y para conectarte al servidor, no tienes que poner un nombre de servidor. Entonces tengo dos servidores ejecutándose, unos pocos servidores ejecutándose en mi máquina o sé que tengo SQL Express, así que sí tengo una instancia de SQL Express, pero también tengo una instancia del desarrollador. Entonces para llegar a la expresión SQL contra decir dot slash inversa SQL Express, eso no significa realmente host local también. De acuerdo, y si fuiste con desarrollador, entonces solo necesitas localhost. Por lo que no necesitarías ningún slash nada más. Entonces voy a usar desarrollador, digamos si digo localhost y se conectará, y creo que tengo algunas bases de datos, no demasiadas. Por lo que podemos proceder ahora antes de pasar al siguiente paso, solo quiero animarte a asegurarte de que tengas acceso de administrador o incluso si no tienes acceso administrativo, si estás en un entorno empresarial donde estás no en condiciones de ser el administrador, que al menos tengas acceso suficiente o que estés trabajando con alguien que tenga el acceso para llevar a cabo algunas de las acciones aquí. Entonces muchos de los problemas que la gente y los de Colin son al hacer este tipo de despliegues fuera de probablemente faltante biblioteca oughta y no instalar algo. El siguiente tema más grande suele ser los permisos y las autorizaciones de autor, ¿no? Por lo que sí se asegura de que estés trabajando con alguien que es el caso que tenga suficientes permisos para dar la vuelta y los posibles bloqueos de carretera. Y si estás en el aire personal de la máquina solo son una máquina que es tuya para gestionar. Tan solo asegúrate de tener derechos administrativos. 49. Publica la aplicación a IIS y SQL Server: Muy bien chicos, así que después de configurar tu entorno y seguro que visitaste que todo funciona. Ahora lo que queremos hacer es en realidad publicar el sitio a nuestro, lo sé antes de hacer eso, tenemos unos pasos que tenemos que completar. Y un cambio de código en particular que quiero hacer es con respecto a la interfaz de usuario de swagger. Entonces en la página de inicio donde tenemos app.use swagger UI, quería tipo de cambio mantener este endpoint se genera. Y la razón es que he presenciado que lo quiere es publicar el camino reglas tipo de cadenas. Entonces lo que quiere hacer es que se vea algo más como esto se usaron servidor UA o semilla, lambda Tolkien. De qué entonces tenemos las llaves haciéndolo un objeto. Y sólo vamos a especie de calificar la ruta base del MIT para ver string dot es espacio en blanco molar c dot, root, prefijo. Está bien, y luego vamos a decir punto, punto, punto. Entonces lo que pasa es que cuando el prefijo raíz cambia en relación a si está en desarrollo como lo está ahora, r Si se publica, el, el camino necesita verse un poco diferente. Entonces lo estamos haciendo es solo ver o poner un punto, dos puntos, y entonces sólo vamos a anteponer eso a nuestro camino existente, que estaba ahí antes, y al listado de hoteles API. De acuerdo, para que puedas seguir adelante y hacer ese cambio rápido. Y sólo para duplicar comprobar que todavía funciona de nuevo alrededor. Y seguimos viendo nuestra documentación de la API de Sagar. Y también notarías que la URL tiene punt-dot. Cuando hacemos clic en él, obtenemos esto. Entonces cuando vayamos a ese enlace podría verse ligeramente diferente, que es que pasé por todo lo que acabamos de hacer. ¿ Está bien? Entonces no sólo confirmar que está trabajando en otra cosa muy importante que queremos hacer es crear la base de datos. Entonces en nuestro servidor de base de datos, así si estás usando SQL Express o estás usando desarrollador, puedes simplemente ir a esa instancia en particular que esperas hospedar la base de datos de la API, lo siento, encendido. Y luego solo quieres crear una nueva base de datos. Entonces quieres que eso necesita estar presente para cuando hagamos nuestras migraciones, ¿no? Entonces porque no quiero ningún tipo fue solo voy a hacer doble clic en el nombre de la base de datos de la, de los hosts, de la configuración de la aplicación, lo siento, y luego seguir adelante y usar ese nombre para crear la base de datos. Y luego puedes seguir adelante y confirmar que la base de datos está ahí. Está vacío, ¿verdad? Nodal o demasiado al respecto. Pero este es el despliegue inicial, ¿no? Entonces lo que vamos a querer hacer es publicar. Para que podamos seguir adelante y hacer clic derecho en nuestros proyectos. Vemos Publicar, haga clic en eso, y luego podremos elegir nuestro objetivo. Por lo que tenemos bastantes opciones aquí. Se puede publicar a un 0, que podemos ver más adelante a la carpeta Docker, FTP. Esto sería útil si estás hospedando como en un GoDaddy o uno de esos o haces FTP al servidor en el que se alojará. O puedes ir directamente a iOS o si tienes otros perfiles, solo puedes importar un perfil. Entonces voy a hacer carpeta y voy a explicar por qué hago foto porque estoy haciendo un despliegue local. Puedo hacerlo localmente a la máquina y luego mover los archivos a donde quiero que apunten. Esto también aplica cuando vas y este es mi basado en mi experiencia. Entonces en mi experiencia, he hecho implementaciones de carpetas donde elijo la carpeta directamente en el servidor al que iba por un error tipográfico puse en la ruta equivocada y lo lo probé y lo probé y lo probé y lo probé y nada estaba actualización. Resulta que lo estaba haciendo por el camino equivocado. No me di cuenta hasta que elegí opción que dicho borrar todo en la foto. Y luego terminé quitando algún otro podría marcar solo para conseguir mi pequeño sitio web. Entonces mi naturaleza cautelosa, no, eso es lo que he aprendido a través de la experiencia, me impulsa a hacer siempre nuestro despliegue a mi máquina y luego los archivos y moverlos a la máquina de destino. Y así es como lo hago. Entonces por eso es, te voy a demostrar, en base a la experiencia, puedes elegir si lo harás o no a mi manera o solo las calles escolares son la máquina objetivo que cuando no hay manera correcta o equivocada, es sólo un asunto apagado. Experiencia enseñándome sabiduría. De acuerdo, así que voy a elegir una despliegues de carpeta local. Por lo que se va a entrar en la carpeta bin liberado.net cinco publicado. De acuerdo, podemos dar click en terminar y luego podemos editar. Entonces hay ciertas cosas que queremos hacer. Por lo que podemos agregar este punto cambia la ubicación objetivo si lo deseas. Pero entonces cuando vamos a Ajustes, podemos elegir otras pequeñas configuraciones. Quiero las opciones de publicación del archivo. Por lo que esta es la media opcional en embarcaciones. Eliminar todos los 5p existentes. Entonces, lo que hizo esos es blanco antes de aprender los nuevos archivos. Y si no eliges eso, lo que hará probablemente sea simplemente anular lo que hay ahí o lo que hay en común de todos modos. Entonces esto puede ser arriesgado porque si es la carpeta equivocada, como dije, eliminará archivos críticos. Podemos elegir las bases de datos. Bases de datos, utilice esta cadena de conexión en tiempo de ejecución. Y me voy a llevar esto y voy a cambiar sus conexiones con él porque no quiero que use loca, DBMS, SQL local DB. Quería usar mi host local o localhost slash SQL Express, cualquiera que sea el nombre del servidor. Pusiste eso ahí. Conservaré el mismo nombre de base de datos y cualquier otra opción. Y luego el barco de vapor, las migraciones. Entonces voy a decir aplicar esta migración. Y lo que esto hará es generar un script basado en la situación actual de la base de datos y las migraciones y todo, ¿no? Entonces podemos simplemente seguir adelante y hacer eso. Haga clic en Guardar y, a continuación, en Publicar. Entonces aquí tienes la ubicación objetivo y aquí es donde va a ir en mi máquina, Publish. Y una vez que eso publique completado, te mostrarán, si quieres. Suelo o no, que fue en mi caso, y la degeneración del guión se completó con éxito. Por lo que pasando de ser solo el despliegue inicial, este paso de generación de flagelo es muy importante porque cuando vas a estar desplegando nuestro como una actualización, ya está en producción en tu actualización algo que Amy cambia la base de datos, nuevas migraciones, etc. Usted querrá proporcionar ese script a los administradores de bases de datos son el desarrollador senior. Es decir, si eres un desarrollador senior, entonces bien. Bueno, quieres este script con el fin de más, tener más control sobre los cambios en la base de datos. No quieres que nadie solo diga, oh, estoy migrando datos número de giros o hago migración sobre las escrituras obesas? Porque en el desarrollo tenemos menos preocupaciones sobre los datos y la integridad reales que en la producción. Por lo que quieres tener cuidado con eso. Y sigamos adelante. Por lo que puedo controlar click e ir directamente al sistema de archivos donde se publicó esto. Y yo puedo tomar esos archivos y una vez que voy a hacer es en S, Así que déjame solo traer a otro lugar en el sitio web por defecto, sabemos esto. Vamos a hacer clic derecho. Y entonces sólo voy a ir a explorar. Entonces esto ahora lo está llevando a la carpeta Ionic donde estoy WW root folder donde todas las aplicaciones web deben salir. No. Digamos que este es un servidor que tiene múltiples aplicaciones ejecutándose. Por lo que todos ellos se están ejecutando desde el nombre del servidor slash la aplicación web. Mmm. Entonces lo que vamos a hacer es crear la API tiene una web arriba, así que obtendremos el nombre del servidor o el nombre de la máquina barra las API y los puntos. De acuerdo, así que voy a crear una carpeta. Sólo voy a llamarlo una API de guión bajo total. Y luego dentro de esta carpeta voy a colocar todos los archivos. Entonces si eres una copia y a través de una red, te recomendaría que los archives para que sea más fácil copiar a través. Pero ya que es solo para despliega el pliegue en la misma máquina aquí. Fue operación incómoda. Entonces quiero ejecutar los scripts SQL. Entonces sólo voy a entrar en E f, lo siento, me gustaría un poco rápido EFS branquias scripts, abrir ese archivo de script. Y entonces aquí verás que todo lo que estaba en las migraciones está justo aquí en SQL comprensible agradable. De acuerdo, así que hasta las migraciones que hicimos, base de datos creó todas esas cosas, sembrando beta. Entonces los datos predeterminados que estamos poniendo en todas esas migraciones Anzac aquí en scripts SQL. Entonces por eso digo que cuando vamos a estar cambiando la base de datos cada vez que se genere este script, en realidad podemos extraer las cosas nuevas y tener más control sobre lo que estamos haciendo a los datos viz. De acuerdo, así que aquí y bueno, cualquier manera el script tipo de lo protege porque dicen si el, entonces por eso tengo la tabla de historial de migración porque quita las instantáneas de cada migración. Entonces dice, si esta migración no existe, entonces Karel este oxígeno. Entonces es algo así, ya veremos si ya está hecho. No necesito volver a hacerlo. Está bien. Entonces solo podemos ejecutar esto y dejarme volver a la cima. Entonces con SQL, si estás, si no estás tan familiarizado con SQL, a fin de asegurarte de que el script de la Tierra sea capaz de correr contra la base de datos. Se puede ya sea en la parte superior decir Usar, y se pone en los nombres de la base de datos. En este caso será listado de OTA o solo asegúrate que la base de datos esté seleccionada de la parte superior aquí en la lista de bases de datos disponibles, ¿verdad? Entonces así es como puedes asegurarte de que tu habilidad para leerlo esté en sus necesidades actuales obesas cuando hago clic en ejecutar, el script se ejecuta con éxito. Entonces sabe que tengo las mesas si solo refresco, son todas, son todas las para los usuarios y hoteles y países, todas las que creamos manualmente, están todas ahí. Entonces sé que la base de datos está preparada y lista. Lo que voy a hacer es continuar con la sesión de la aplicación web API misma. Entonces Buck en IIS, solo voy a actualizar esta lista porque lo que hará es enumerar cada carpeta que está en www root automáticamente ver eso. Y entonces lo que voy a hacer es hacer clic derecho en él y convertir herramienta y aplicación. Antes de hacer eso, lo siento, lo siento. Antes de convertir esto en una aplicación y vamos al pool de aplicaciones. Por lo que un grupo de aplicaciones es como un contenedor dentro del cual la aplicación web o las aplicaciones web pueden atropellarse. Un solo principio de responsabilidad sugeriría que hagas un pool por spread AP. Porque si horroroso continúa con múltiples OPS que todos esos ups dejan de funcionar. que sepas, para el aislamiento, puedes tener múltiples albercas. Alguien está en la API de imagen. Alberca a nada demasiado elegante o complicado. El dominante versión CLR sobre cuándo decir no hay código administrado porque estamos usando.NET Core. Entonces esto es muy, muy importante. Y luego podemos dar click bien, así que está bien. Ahora la relevancia de eso es que cuando vuelvo al paso anterior y todo cuando hago clic derecho y digo convertir, la aplicación me va a preguntar qué grupo de aplicaciones quiero seleccionar. Por lo que puedo ir aquí y seleccionar de esta lista desplegable hotel API, una alberca. Esa es la que deseo para esta app a iraní. Y entonces puedo seguir adelante y dar clic en Aceptar. Y luego notarás que ya no parece una carpeta. No, parece un pequeño globo web con el pozo, no, parece subir. Está bien. Entonces tomemos este giro de alambre. Voy a sólo Bros al puerto 80. Y aterrizamos en esta puja que está viendo dirección 404, no telefónica, bien, pero lo que hubiéramos esperado es más o menos como documentación de swagger. Entonces déjame ver si tal vez cuando lo he impulsado lo hará y ahí vamos. Entonces no, al menos sabemos que lo estamos viendo desde un localhost. Y note que esto no es host local colon los puertos localhost dos puntos los puertos, el número de puerto. Déjame mostrarte solo para que dondequiera que esté claro, localhost colon, el número de puerto representa el entorno de desarrollo. En situación maya, anfitrión local por sí mismo. Representa a IIS. Si tienes múltiples servidores web, web, tal vez tienes, wow ME, Poisson o Apache, u otros servidores web en ejecución, entonces es posible que necesites cambiar los puertos porque en este momento tengo apache. Qué se ejecuta en el puerto localhost 8080. De acuerdo, lo que es el predeterminado en iOS es mi predeterminado. Entonces host local es lo que se ve cuando el nombre de la aplicación web y luego la primera página. Entonces por lo menos sabemos que estamos sirviendo de actividad desde el IIS. De acuerdo, así que usemos cartero y hagamos una petición fresca. Por lo que solo voy a solicitar todos los hoteles a la API. Sin aviso el enlace. Espero que no sea demasiado pequeño en este momento tengo que ver localhost slash hotel, subrayado API slash api slash hotel. De acuerdo, así que su local slash la web up name slash, el camino que nos habríamos asentado en nuestro controlador. Por lo que tiene que saltar de nuevo. Y yo solo estoy haciendo este suelo comprensión completa de todas estas pequeñas variables y aguanta si se separan, ¿verdad? Entonces la regla que dijimos era API slash controller, no dije que pudiéramos cambiarlo. Eso probablemente sabría que estamos desplegando, ¿verdad? Qué punto es que por ser API Slashdot significa lo que sea que esté precediendo, siempre irá por ese camino. Entonces si es que no usamos nuestra web up on call it total up. Podría haber sido localhost slash api especial. Si era el medio, si era una ubicación raíz fuera del servidor de aplicaciones. Entonces en este caso no lo es, no estoy dispuesto a entrar en ningún cambio de nombre Solo porque tu institución podría ser diferente a la mía y solo estoy explicando todas las dinámicas detrás por qué mi terminar esta camioneta tuya no puede porque se fue por un camino diferente. Entonces si despliegas directamente, y una vez más, no tengo ningún problema en mostrar si desplegaste tu, tu API directamente a la raíz de este iónico tirado derecho de www root, lo siento, no nos hiciste sacar a todos y ponerlo aquí mismo en la raíz, entonces host local slash swagger en realidad te serviría. Espero este mismo pij que sólo estábamos mirando en viniendo de anfitrión local, ¿verdad? Pero debido a esta web arriba, tenemos que entrar en la aplicación web para llegar a las cosas reales. De acuerdo, así que vamos a probar esta solicitud. Y cuando hago clic en enviar, estoy recibiendo un error 500. Y todo lo genial de todo lo que hicimos fue que mandamos a todos bloguear, ¿verdad? Por lo que siempre puedo simplemente ir a mi carpeta de registros y echar un vistazo a por qué estoy recibiendo estos errores. ¿ Está bien? Entonces este archivo de registro me está mostrando que algo salió mal en el fallo de inicio de sesión del cliente de datos para el usuario. Y luego me está mostrando el nombre del usuario. Entonces en el video anterior, sí vi permisos jugarán un papel muy importante en lo que estás haciendo, ¿verdad? Entonces. Por nuestra alberca up que acabamos de crear. Para que el usuario debajo del pool up pueda interactuar con la base de datos, necesitamos asegurarnos de que le damos permiso a la base de datos. Entonces lo que voy a hacer es ir a SQL Server o volver a la base de datos. Y luego vamos a hacer dos cosas. Se va a crear un inicio de sesión para ese usuario en grupo. Y luego vamos a agregar ese inicio de sesión a la seguridad para la base de datos. Entonces en primer lugar, nuevo login o bien, déjame, déjame solo ver si puedo hacerlo directamente como usuario. Por lo que bajo la base de datos es nuestro objetivo a la seguridad de los usuarios que usuarios nuevos, y luego elegir usuario de Windows. Está bien, y luego poner ese nombre de usuario como pool, ese es su dominio. Y el, básicamente el nombre de la piscina es el nombre de usuario. O podemos dar click en Aceptar. Y si miramos en la lista, entonces veremos que eso arriba usuarios de pool no, agregó, no. Permítanme volver a intentar esta solicitud. Siguen levantándose 500. Déjame tratar esto un poco. Entonces lo que voy a necesitar hacer es darle más permisos. ¿ Está bien? Por lo que lo agregamos a los libros de base de datos. No le dimos ninguna membresía, así que sólo lo voy a sentar. ¿ Dueño de DB? No, querrás probablemente ser un poco más granular de lo que estoy teniendo razón saber, al establecer permisos porque el usuario que puede acceder a la base de datos podría no, quizás no quieras darles la propiedad porque la música de propiedad y dejar caer la visa, visa, Andrew Oldham, cosas potencialmente maliciosas tanto como está ayudando al usuario. Quieres estar muy consciente de la seguridad a la hora de dar permisos, ¿verdad? Por lo que tal vez sólo quieras darles datos, leer, datos en o qué música y leer y escribir en la base de datos. Pero no pueden hacer ninguna otra operación crítica que pueda comprometer los datos. ¿ Está bien? En mi situación está mi máquina ahí, mis usuarios. Voy a establecer db owner. Entonces voy a decir membresía DB Dueño y esquemas propios. Db Dueño. Y generalmente notas que el esquema predeterminado, el trato que no tienes que preocuparte por eso eso es más cosas de nivel de base de datos que solo quieren poner en marcha nuestra aplicación. Por lo que podemos dar click en Aceptar y luego podemos intentarlo de nuevo. Y luego vemos aquí que estamos obteniendo datos. Por lo que estamos obteniendo datos de nuestra base de datos API. Ahora solo para que sepas que algunas de las características de seguridad o soy unas características nazis, unas configuraciones que es, podría haber solo Putin podría no funcionar necesariamente así para ti hay otros factores son tú que las calles están haciendo estas cosas. El tener permiso para dar permisos a los usuarios y todas esas cosas sí juegan un papel en si puedes o no completar con éxito todas las actividades como me acabas de ver hacerlo. En última instancia, sin embargo, estos son los pasos muy básicos para poner tu aplicación en funcionamiento en las configuraciones necesarias en la base de datos. Y ahora volviendo a es hay pocas cosas que queremos asegurarnos de que nos pongamos en su lugar. Si recuerdas, cuando estábamos configurando nuestro JWT, agregamos una clave secreta que agregamos como variable de entorno. No. Si lo agregaste al estilo molesto, entonces no tienes que pasar por este paso. Si sin embargo hiciste lo que hice y lo agregaste como variable de sistema, entonces necesitamos nuestra API para almacenar esa clave, correcto, que pueda manejar esa operación muerde donde quiera que esté en auto máquina. Entonces vamos a pasar al editor de configuración. Y de la lista desplegable a la izquierda, queremos asegurarnos de que tenemos system dot web server y luego vamos a elegir ASP net core. De acuerdo, así que adelante, sección cónica, vamos a sistema.Fuera. Webserver es B.NET Core. Y luego de la lista desplegable a la derecha, vamos a bajar a hosts de aplicaciones, no a conflictos. Saber, cuando hacemos esos dos cambios, podemos ver cono Variables de Medio Ambiente igual a 0. Entonces sólo vamos a hacer clic en eso. Y luego vamos a sumar nuestra variable de entorno. No, lo mismo que habías agregado como la clave del medio ambiente. Por lo que sólo quería sin recuperar el mío y mi nombre era la palabra clave y mi valor fue así de bueno. Ahora, por complicado que sea, quien sea simplemente, El punto es que lo queremos en una ubicación segura y eso es lo que nos está brindando este mecanismo. ¿ Está bien? Por lo que solo puedes seguir adelante y poner en tu nombre y la clave que seleccionaste. Y entonces podemos seguir adelante y cerrar esto. Ahora que se agrega. El comentario no es de nadie. Podemos hacer clic en aplicar para aplicar los cambios y luego reiniciar o pools. Entonces recuerdo, sí mencioné que cuando hay múltiples aplicaciones en la piscina, si te pasa algo a los agrupados y a todos aquellos arriba escolarizados. Por lo que sólo quería reiniciar o pool. Podemos simplemente hacer reciclar. Y entonces lo que vamos a querer hacer es probar nuestro login y Tolkien recuperar Isla y acceso asegurado. Así que déjame solo volver a comprobar que esto todavía, acuerdo, así que nuestra API sigue funcionando. Eso es bueno. Déjame intentar iniciar sesión, así que solo voy a volver a una de mis solicitudes más antiguas. Correcto. Y bueno, en realidad, no puedo usar esta solicitud más antigua aún porque si lo intenté así solo voy a duplicar esto. Y fui a quitar el número de puerto. Y tampoco estoy usando HTTPS. Https. Ese es todo otro nivel de configuración donde no quiero meterme demasiado en eso en esto, en esta lección, solo queremos que nuestro despliegue de banda se ejecute. Así que host local slash hotel, underscore API, luego slash api slash Lothian inicio de sesión slash saliente. Correcto. Entonces y yo mandé conseguir un cuatro oh, uno, ¿verdad? No estoy autorizado porque este usuario no existe. Entonces porque no vimos al usuario. Entonces si tú, si ves que el usuario, probablemente no tengas ese problema. Por lo que sólo voy a cerrar algunas de estas solicitudes más antiguas están en. Entonces intentemos registrar al mismo usuario o al mismo usuario. Entonces sólo cambia el camino. Y cuando enviamos la solicitud, vemos que conseguimos que se acepte la herramienta. Por lo que este usuario es creado. Vayamos a la base de datos y verve. Y podemos ver a ese usuario aquí, trauma a example.com en la contraseña. De acuerdo, así que ahora que tenemos el usuario creado, intentemos de nuevo nuestra operación de inicio de sesión para intentar conseguir el Tolkien. Entonces la costura solicita que sólo tratemos de dejarme mandar, y aquí está nuestro Tolkien. ¿ Está bien? Entonces si sólo vamos a la cárcel con TDA y echamos un vistazo a nuestro Tolkien, donde ver cosas que estamos acostumbrados a ver, ¿verdad? Se va a decir firma inválida porque una vez más, no sabe con la clave se firmó, que es con lo que acabamos de decir, Abre la variable de entorno. Pero vemos que los Tolkien sí tienen la inflamación que esperamos. Entonces eso es ahora voy a probar uno fuera del alma operación borrar. Déjame probarlo con el hotel para que sepamos que tenemos tres hoteles que vemos eso, ¿no? Voy a eliminar hotel con ID3 de la base de datos para que sepamos que necesitamos a nuestro Tolkien y tendremos el enlace. Déjame simplemente cambiar esto a hotel. Entonces estamos borrando hotel. Por lo que sólo quiero verificar que nuestro Tolkien funcione. Y cuando hacemos eso, estamos recuperando una herramienta para. Entonces eso significa que si voy a la base de datos y miro en la tabla de hoteles, eso empezó con tres, sólo estamos viendo herramienta. Por lo que ves nuestro Tolkien funcionó nuestro, todos nuestros endpoints, al menos lo que hemos probado, por lo que fuegos artificiales y hasta ahora hemos desplegado con éxito nuestra API en o local. Despliegue local IS con nuestra base de datos local de puertos. Por lo que siguiendo estas pautas, podrías implementar exitosamente API dentro de tu empresa sentada o para tu uso personal, o cualquiera que sea esa situación. 50. Crea una cuenta de Microsoft Azure: Oigan chicos, en este video estaremos creando a nuestro Microsoft un 0 conos. Como dije antes, podemos empezar de forma gratuita. Para llegar a estos sitios web, vamos a absorber dot Microsoft.com y luego supongo los caminos que según tu región o tu idioma. Pero así es como se ve el sitio web debería verse. Y se puede leer a través de él para ver exactamente lo que 0 es todo moradas. Se trata de ser futurista, permitir más colaboración, y operar de manera más fluida en un espacio cerrado, ¿verdad? Están por todo el mundo y normalmente solo elegirías la región que está más cercana a ti. Por lo que en realidad estoy en la región del Caribe. Entonces dice mi Joel, región está al este a nosotros o al este de Estados Unidos dos. Pero no por este video. Este video que apenas estamos creando las columnas no estaban configurando nada de razones por el momento. Y así para empezar, podemos esos bien, si ya tienes una cuenta en vivo, entonces solo puedes seguir adelante e iniciar sesión con ese live up cones. Pero puedes simplemente hacer clic en Iniciar gratis. Y aquí te dicen que puedes crear un gratis han ido hoy y puedes empezar con 12 meses de servicios gratuitos. Entonces eso es un buen trato para mí. Y si te desplazas hacia abajo, ves 12 meses de servicios gratuitos, populares, gratuitos más crédito de 200 dólares que expirará en 30 días. Por lo que te dan $200 una puede crear máquinas virtuales V, nuevo, crear recursos en la nube y experimentar hasta que ese dinero sea o.Y eso es realmente sólo por un mes. Pero luego hay ciertos servicios que solo consigues de forma gratuita por el resto del año, y luego tendrás algunos otros servicios que siempre son gratuitos. Está bien, entonces lo que vamos a hacer es solo seguir adelante y dar clic en Iniciar gratis. Entonces nos pedirán que firmemos con nuestro vivo de conos. Si tienes una cuenta en vivo una vez más, él puede seguir adelante y usar eso. Si no tienes otro cono, entonces puedes seguir adelante y crear uno. Y esta es una opción muy reciente para iniciar sesión con GitHub. Entonces tengo un live a cone que uso, pero solo voy a pasearte por el create 1 primero. Conoce el ícono en vivo no necesariamente tiene que estar en vivo o en all.com. No tiene que ser una cuenta tradicional de Hotmail, puede ser una cuenta de Gmail. Por lo que en realidad puedo usar la misma dirección de correo que utilicé para GitHub o por direcciones de correo que uso cuando me estoy registrando para cosas que puedo usar eso ya sea Yahoo, Gmail, Hotmail, lo que sea. Y basta con dar click siguiente. Y aquí ya está, está diciendo que ya me ha ido un punto de Microsoft. Entonces eso hace esto conduciendo mi punto sin embargo, que una vez que tengas una dirección de correo electrónico, no tiene que ser Hotmail o un tradicional barco AECOM vivo ahí, creando así un Microsoft o Collins para ti con esa dirección de correo electrónico. Para que puedas seguir adelante e inscribirte. Es un proceso bastante sencillo. Ahora están Conda decidió que ya existían. Esa es una cuenta que estaba usando para inscribirme en el colon gratis. Entonces. En realidad solo seguí adelante y me metí y porque realmente no me conformé mucho más, creo que tu proceso de inscripción en realidad va a parecer muy similar a esto independientemente, así sucesivamente para superar el obstáculo de poner en tu dirección de correo electrónico y procediendo, entonces probablemente vas a terminar en una pantalla como esta donde te van a pedir tu información demográfica solo por su registro manteniendo mi país y son enormes en su Jamaica. Y le estoy citando mi número de teléfono que creo que hace. Y luego dicen: ¿quieres verificar tu identidad por teléfono o la necesidad por tarjeta? Entonces voy a elegir me lleva por teléfono y acabo de recibir el texto. No tardó en absoluto. Entonces solo voy a poner ese código y luego verificarlo. Ahora aquí la parte que podría disuadirte si no estás preparado para ello, querrán verificar tu identidad por tarjeta para que no te cobrarán a menos que actualices, lo significa que tienen diferente plan de suscripción de cláusula USTED, así que correcto. No, te estás registrando para el plan de suscripción gratuita. Una vez que se hagan esos suscripciones gratis en plan, entonces no podrás hacer mucho en la plataforma hasta que envíes nuestros nuevos subíndices en marca, lo que coincide con que las actualizaciones. Entonces como dije antes, hay p A medida que vas Y luego hay prueba de slash de dev paga-as-you-go, que es en la que estoy, que es como la mitad del precio de la normal PICU cool. Por lo que en realidad proporcioné la inflamación de mi tarjeta cuando me inscribí. Y habiendo hecho eso, puedes hacer clic les hace clic en acuerdo si no hablas de tarjeta o no te sientes cómodo con proporcionar los detalles de nuestra tarjeta entonces. Delicioso, y puedes parar aquí, está bien. Más adelante, cuando realmente estamos desplegando en Azure, aún puedes ver cómo será y ver lo beneficioso que es para ti. Qué, si lo deseas, entonces puedes seguir adelante y proporcionar tu información y luego dar click en el acuerdo y aceptar los términos del acuerdo y entonces estarías en la plataforma. Entonces solo voy a firmar en mis conos Rayleigh, podría citar sin comillas el cono Rayleigh, pero uno que uso y te muestre cómo se ve un 0. Bueno, en realidad acabo de escribir en Puerto dot 0.com con la esperanza de que me pidieran que iniciara sesión, pero yo hice eso y simplemente reescribió ese mus en parecer un cono que solo estaba instalando a George Williams en gmail.com. Entonces este tablero, así que este es el tablero en el nivel muy básico, tienen un panel a un lado aquí enumerando ODE. Bastantes servicios que puedes obtener. Pero entonces, porque no completamos el set de cuatro porque no completé el liquidado, al menos entonces cuando vaya a suscripciones, voy a ver que no tengo suscripción, ¿verdad? Entonces como te veré en la suscripción es cómo te califica como cliente, ya sea tu PSU, meta, empresa o lo que sea. Entonces si más tarde decidí que quería proporcionar mi información, solo puedo volver y dar clic en agregar. Y entonces eso me llevará a completar el signo de trámite donde realmente agrego la suscripción. Y así este es un juicio gratuito a esa guerra sentada. Sólo tienes que saber que tienes soporte para desarrolladores de objetivo de PSU ya que tienes bastantes de ellos, ¿de acuerdo? Por lo que probablemente iría con paga a medida que avanzas. Pero eso sí, todo esto está en los pasos de inscribirte en Azure, y eso es si deseas proceder con eso. Pero entonces para este tutorial realmente y verdaderamente, solo quería que llegaras tan lejos como el tablero para que puedas ver que así es como luce un Xero. Esto es lo que el portal de administración de cargas de trabajo puede configurar sus máquinas virtuales. Pero para este curso, estaremos buscando servicios. 51. Deploy la aplicación y la base de datos a Microsoft Azure: Porque volveremos. Por lo que ya configuramos o un zerocoins y todo lo que queremos realmente desplegar. Entonces antes de hacer eso sin embargo, quería hacer un cambio de configuración de trineo a donde van a ir nuestros archivos de registro porque en un Xero hay una unidad LC, no hay seco local. Entonces lo que voy a hacer es dejar que Cyril Log cree una carpeta dentro de toda la estructura de carpetas para el proyecto. Y ahí será donde estarán los troncos. Entonces de esa manera cuando vamos a Azure, no tenemos que preocuparnos por ningún camino ni ponernos demasiado lujosos. Entonces vamos a repasar y publicar. Ahora que dicho eso, solo estoy haciendo esto localmente por simplicidad, hay toneladas de más. ¿ Qué diría robusto presume mecanismos de registro que podemos aprovechar para entender esto porque quería encontrar la manera más rentable porque los otros cuestan dinero a medida que agregan. De acuerdo, así que vamos a hacer clic derecho. Ir a publicar. Vamos a montar una nueva editorial. fluoróforos ya tienen un perfil para el despliegue local, que es un perfil completo, ¿verdad? Entonces en realidad puedo simplemente renombrar este para que sepa exactamente para qué sirve. Perfil I S. Seguro. Está bien. Pues entonces quiero uno nuevo. Y éste va a ser el perfil de Azara. Entonces lo que quiero hacer se implementa en un servicio de Azure up. No, si tú si no sabes tanto, citaré a Azara sin ropa. Lo que pasa es que puedes implementar una aplicación en una obligación como tipo de restricción de servicio, lo que significa que no tienes que preocuparte por este servidor ni nada. Simplemente prepararán noche, te compraron bonito contenedor y pondrán tu código ahí. Y entonces sostendrán cosas hechas eso para que te pongas como un cis, ¿verdad? O más bien esa sería la plataforma de servicios como servicio. Por lo que están brindando la plataforma como un servicio para que solo la pongas arriba en ella y simplemente se ejecutará. Entonces eso es lo que quieren decir con el observe es, y luego lo que querían comprar un Windows o Linux, usaremos Windows. De lo contrario puede hacerlo contenedor o a un registro de contenedores o a una máquina virtual. Entonces básicamente el mismo tipo de consideraciones que habría hecho con la implementación de IIS ya sea a su máquina o máquina de red, tendría que hacer ese tipo de consideraciones contra una VM en Azure porque es lo mismo que sólo una máquina virtual servidor CM. Y él Hall, vamos a elegir la plataforma como servicio. El servicio y luego haga clic en Siguiente. Y entonces éste, no, puede que te pida que te conectes. Entonces hay que decir en, en bien honrado descenso dentro de este pequeño Swami, te muestra el grupo de recursos de suscripción. Y no tengo muchos de esos. Entonces solo voy a seguir adelante y presionar este plus científico empezar a construir sobre ello en arriba Servicio a EU por el nombre. No voy a cambiar el nombre. Y luego tengo algunos grupos de recursos, SIR, de proyectos de foss. Pero voy a crear uno nuevo. Voy a llamarlo un listado total. Api. Entonces ese es el nombre de ese grupo de recursos. Y luego el plan de hosting aquí, puedo dejarlo en el predeterminado, pero luego sí tienen un plan de hosting gratuito. Y en base a donde estoy en el mundo, este de EU dos es mi mejor apuesta. Y elige gratis. Por lo que podrías estar en otro lugar del mundo eliges la razón que es más cercana a ti, pero en base a donde estoy, Este de Estados Unidos dos es mi elección razonable. Ahora elige las implementaciones gratuitas. Haga clic en Aceptar y, a continuación, crea. Y luego después de que se haga ese proceso, podemos seguir adelante y dar click siguiente y luego podemos refrescar. No apologistas es gestión, así que no quiero ninguna gestión. Simplemente saltaré este paso y luego hacemos click. Por lo que la siguiente pantalla nos está mostrando cuál va a ser la URL de nuestro sitio. Entonces sea cual sea el nombre AP que nos sentamos ahí punto, punto 0, websites.net porque es gratis. Nos dan un subdominio. Y siempre podemos seguir adelante y comprador en dominio si queremos, pero no vamos a llegar tan lejos, pero va a causar que sí tenemos dependencia de servicio en una base de datos. Están viendo si necesitas configurar tu base de datos con fines de conectividad, ¿verdad? Entonces necesito ir y decir configurar. Y luego los últimos esos, ¿quieres una base de datos de SQL Server local o será Azara SQL? Por lo que una vez más, iremos con la opción PAS donde solo nos están dando un servicio en la nube. Y solo necesitamos conectarnos. Por lo que tenemos que seguir adelante y crear una nueva instancia de un servicio Nitobi nombre de hosting, servicio hotelero, DVs, AC tipo de llenado cargar algunas cosas. Voy a ponerlo en el mismo grupo de recursos en su conjunto a listar API. Ahí vamos. Y luego servidor de base de datos, tengo que crear uno nuevo. Entonces se va a llenar algunas cosas, pero voy a tener que poner mis datos administrativos. Entonces y la contraseña Bartov, que es bastante terriblemente estricta. Así que solo asegúrate de tener una caja especial, mayúscula y un número y debes estar bien una vez que superes los siete caracteres. Por lo que una vez que pongas todos esos detalles, puedes seguir adelante y hacer clic en Aceptar. Se autollenará lo que necesita para llenar dentro. No necesita uno, crear el servidor de base de datos y luego tendrías acceso para conectarte a él. ¿ Verdad? Y eso está concluido. Por lo que vamos a dar click Siguiente. Y entonces lo que hará es decir, vale, este es el nombre de cadena de conexión de la base de datos. ¿ Cuál es el nombre de usuario? Entonces tenemos que volver a poner el nombre de usuario que solo usamos para crear el material de la base de datos y la contraseña. Y luego lo mantendrá en la sección perturbadora Uzziah. Podemos elegir la bóveda de claves, pero solo dejaré eso como la configuración predeterminada ahí. Y luego si queremos volver a ver realmente el valor de cadena de conexión. Entonces en realidad puedo mostrarles que la fuente de datos, esta es la conexión a la base de datos real en Azure, ¿verdad? Entonces si solo copio eso solo para mis propios propósitos. Esto muestra el catálogo inicial, ese es el nombre de la base de datos para el que el ID de usuario será verdadero en ese punto cualquier dominio y la contraseña, utilicé una contraseña simple, por supuesto, en un entorno de la vida real, usarías un más contraseña segura. Para que podamos hacer es seguir adelante y dar click Siguiente. Y no tenemos que tocar nada aquí y solo decir terminar. Muy bien, y ahora podemos dar click publicar. Y esto podría llevar un tiempo porque tiene que crear algunos recursos. Y esto es decir que está publicando la aplicación sin agrupar el tiempo de ejecución, tomando la compatibilidad en tiempo de ejecución. Entonces podemos dar eso. El resultado final de esa comprobación, sin embargo, es que está lanzando el navegador y enviándome este error 500. De acuerdo, así que al menos sabemos que está respondiendo. Entonces la API está ahí, pero aún tenemos algunas cosas que tenemos que hacer. Entonces, empecemos yendo a nuestro portal. Por lo que solo tienes que hacer clic en administrar en un portal 0, nos navegamos a la velocidad que nos muestra la aplicación corriendo en un 0. Está bien, así que sabemos que definitivamente no es adorado, está ahí. Hacemos clic en bros. Es bueno mostrarnos la URL, lo siento, predicho por HTTPS. Y estamos consiguiendo por ese 500. Entonces no estamos, no estamos mejor de lo que estábamos antes, pero al menos podemos confirmar algunas cosas. Ahora si bajamos a la configuración, como que nos mostrará algunas de las cosas como nuestra cadena de conexión. Está bien, así que recuerda esa cadena de conexión y ese valor oculto, al menos de esta cadena de conexión, puedo ver el servidor para la base de datos. Entonces sólo voy a copiar eso. Recuerda que te mostré antes, así que sólo voy a copiar eso. Y luego en el estudio de gestión, voy a tratar de conectarme, solo va a hacer clic en eso. Si ya lo tenía abierto, está bien. Si no, entonces te lanzan en Management Studio y luego pones nombre del servidor y las credenciales que haya y haz clic en conectar. Y solo te solicitará que inicies sesión. Entonces lo que pasa es que el firewall está viendo no estoy permitiendo acceso a la base de datos desde cualquier otra fuente que esté fuera de los 0's Así que en este momento lo que quiero hacer es solo iniciar sesión y luego agregará una excepción para la dirección IP que estoy usando. Entonces esa es una característica importante de seguridad. Por lo que estaré detrás de esta dirección IP. Alguien de su propia casa con una dirección IP diferente no podrá llegar a la base de datos a menos que inicie sesión y verifique igual que lo estoy haciendo ahora. Por lo que voy a seguir adelante y dar clic en ok. Por supuesto, hay formas de permitir el acceso desde todas partes, pero no necesitamos hacer eso ahora mismo. Y luego cuando miro en la lista de bases de datos, vemos nuestra base de datos. Entonces solo estoy confirmando que nuestra base de datos lo es. Pero mira esto, no hay mesas. Y lo que voy a hacer es editar el perfil e ir a ajustes. Y en realidad nos saltamos este paso. Supongo que estamos demasiado ansiosos, ¿verdad? Por lo que no hicimos los pasos de migración, aplicamos esta migración en publicar. Y bueno, ya usamos su propia cadena de conexión con la nueva base de datos alojada en tiempo de ejecución. Entonces eso no es realmente necesario volver a marcar, pero eso está bien. Y voy a guardar y luego simplemente volveré a hacer clic en publicar. Y si solo miramos el registro, ve agregando base de datos. Y luego ven aquí nos da alguna indicación de que algo de scripting está sucediendo. Entonces vamos a revisar dos veces. Y lo que sucede en esta ocasión es que porque dijimos aplicar las migraciones, en realidad se adelantó y la llenó todas las mesas para nosotros. De acuerdo, así que esas son las partes realmente importantes de la misma. Por lo que no tuvimos que distribuirles manualmente. Una vez más, sería prudente de tu parte en nuestro escenario real de producción en vivo controlar este proceso un poco más de lo que podemos hacer en nuestros proyectos personales y en nuestro tiempo personal. De acuerdo, para que puedan revisar mi otro curso de despliegue y control de la producción en los entornos. Pero para esto, solo estamos, solo queremos poner en marcha nuestra API y entender, oh, todos los sistemas funcionaron juntos. Por lo que esta es nuestra base de datos actualmente funcionando en su servidor. Entonces volvamos a nuestra consola de depuración en lugar de kudos, vaya al sitio www root. Y luego recuerda que dijimos Ponga el amor la misma raíz que el sistema de archivos. Entonces por eso tenemos acceso a nuestra carpeta de registros aquí mismo, que nos mostrará nuestro registro desde que llevamos haciendo estos despliegues. Entonces si solo sigo adelante y lo descargo, lo abriremos en una nueva sesión de navegador. Y sólo quería ver por qué a través del error más reciente. Entonces dice que algo salió mal con un argumento no como sip son, algún error de referencia de larguero, y alguna codificación que se supone que está sucediendo en las extensiones de servicio línea 46. Entonces si solo vamos y miramos el código y vemos qué sucede exactamente en esa línea. Es donde estamos configurando nuestro JWT. Y ya ves que estamos haciendo todo esto. Y aquí es donde dice que la codificación falló. Y falló porque estamos buscando C0. Y C0 es realmente una variable de entorno llamada clave. Entonces recuerda que solo tuvimos que sentarnos eso está abierto. Supongo que tenemos que hacer lo mismo que tu, de acuerdo, así que lo que voy a hacer es volver a nuestro panel de gestión, bajar a la configuración. Y luego desde aquí puedo decir nueva configuración de aplicaciones. Voy a decir que la nueva configuración de la aplicación es clave junto con el valor. Entonces quiero decir, puedo continuidades ese mismo valor. Probablemente voy a usar un valor más simple, pero luego para la consistencia entre el entorno probablemente quisieras parecer cosas. Entonces es, ya sabes, uno u otro o usa uno simple en cuerpos de desarrollo de uno complicado en producción o usa uno por entornos. Por seguridad y separación de roles, situaciones, desarrollador podría no ser capaz de simplemente entrar en producción y manipular cualquier cosa porque probablemente no lo sepa. Pero por simplicidad, solo voy a mantener la clave Cmd cruzada. Y voy a dar clic en Aceptar. Adelante y guarde eso, continúe. Y usará digamos que reiniciaremos la aplicación, está bien. Adelante y reinicia. Y una vez que eso se reinicie, voy a ir a panorama general, ir a madrigueras están para que no podamos bros en ningún lado. Estamos recibiendo esto, de Sally, ahora estamos consiguiendo un 500. Este es el mismo error que obtuvimos si pasaste por la implementación de iOS. Eso es todo lo que tenemos, ganar-gana y ruta. Entonces si digo slash swagger, entonces me llevará a que el doc swagger esté alojado en nuestros sitios web de Azure. Entonces solo voy a seguir adelante y hacer una prueba rápida. Entonces voy a tratar de que el país ejecute. Y entonces he recuperado con éxito todos los países que actualmente se encuentran en la base de datos. Entonces eso significa que si traté de usar cartero, solo voy a copiar esta URL a Cartero. Y yo sólo voy a crear un nuevo espacio de trabajo porque a veces se pueden sobrecargar unos. Entonces solo voy a crear un nuevo espacio de trabajo, abarrotado Azur. Y entonces lo que voy a hacer aquí son solo solicitudes relacionadas con la revista Dwell, ¿verdad? Entonces país que quería conseguir no hay autores está en la cima. Pero entonces como puedes ver, puedes sacar a todos los países de inmediato del pero a través. Probemos uno de esos intentos de registro y luego hagamos algo que esté asegurado. Entonces solo voy a estar volteando entre el espacio de trabajo original donde ya tenía las solicitudes y este nuevo. Por lo que sólo voy a ir al poste. Yo sólo copio esto. Y en lugar de aburrirte con crearlo es yo lo acabo de hacer. Por lo que el nuevo punto final sería cualquiera que sea el nombre del sitio web sea barra y luego API. Entonces por eso no lo eliminé desde el despliegue del IS que levanté porque tiene más sentido aquí. ¿ Verdad? Esconde un cono slash login y luego podemos enviar. Y tengo una causa árabe tuve la carga útil de inicio de sesión en lugar de los apologistas de registro. Por lo que estamos haciendo nuestro registro y tenemos la carga útil de los carros con la contraseña de correo electrónico. Y este es el mismo con el que probamos de uno que estamos en nuestro local. Entonces solo quiero verificar que todo siga funcionando ya que funciona localmente y conseguimos que nuestra herramienta sea aceptada. Entonces eso es bueno. Estamos debajo de un camión. Entonces lo que puedo hacer es repetir la solicitud de inicio de sesión. Entonces solo tienes que hacer clic en eso, traer la solicitud de inicio de sesión y luego podemos enviar a Tolkien más alto. Excelente. Y entonces lo que haremos es intentar eliminar nuestra creación son algo que sabemos que habíamos dicho que uno de esos bandera autorizado. Y por supuesto, no te estoy aburriendo con formar el enlace donde sabes que tienen que formar el enlace correctamente. El endpoint es api slash hotel con el ID. Es el método delete. Y luego agregamos nuestro token de portador de autorización y el token que acabamos de recuperar del inicio de sesión. Y luego cuando hacemos click, recuperamos nuestra herramienta para ninguna respuesta de contenido. Entonces si voy a la base de datos sólo para verificar, una vez más, nuestra base de datos Azur, podemos verificar que ya no tenemos hotel con el ID3. Por lo que sabemos que podemos registrar un usuario a nuestro saber públicamente la API diploide. Entonces si ya hice este enlace, ya sabes, más fácil de recordar, entonces en realidad podrías navegar a él. Por supuesto, para el momento en que estás haciendo esto, escucha, esto probablemente ya no existe, pero el punto es que así es como puedes publicar tu API al mundo. Y usando swagger, facilitaste que cualquiera pudiera venir y decir, Oh, así es como funciona este endpoint. Y estos son todos esos. Y ves que conservamos nuestro país V2 por hablar amble versionado nuestras API. Conservamos la API por defecto del pronóstico del tiempo, pero por supuesto, no, podemos limpiar todas esas cosas. Y algunas limpiezas que yo sugeriría serían como con country y hotel realmente y verdaderamente, debería haberlo llamado los puntos finales. Países y hoteles especie de controladores realmente deberían haber sido controladores de países y controlador de hoteles. Pero eso es semántica. Eso es solo cuestión de presentación en este punto, podemos confirmar que la funcionalidad está en funcionamiento.