Transcrições
1. Introdução: Ei pessoal, eu queria aproveitar este tempo para dar as boas vindas a este novo curso, último Guia de Desenvolvimento de API web do ASP.NET cinco. Agora, seu tipo é um múltiplo bots. Posso garantir-lhe que o conteúdo vive mais curto até ao edifício. Neste curso, você aprenderá como criar uma API Web que pode ser mantida usando o ASP.NET cinco, que é o mais recente e o melhor e Microsoft e desenvolvimento preso Entity Framework. E vamos explorar muitos padrões de design de nível empresarial em considerações quando se trata de design e API. Sou seu instrutor para este curso. Meu nome é verdadeiro. Quem são Williams? Sou engenheiro de software e palestrantes a tempo parcial. Vamos explorar o que é uma API, as letras AP e IR,
abreviação de Application Programming Interface. Praticamente uma API é uma interface de software que atua como um intermediário entre dois aplicativos. Então, digamos que você pode acessar o Facebook como funcionalidades de um aplicativo que não é um aplicativo do Facebook. Então este tem o topo para o Facebook e permitir que você faça Facebook coisas ao vivo. Bem, isso é comunicar com o Facebook através de uma API. Então, neste curso, vamos aprender como construir esse tipo de interface para permitir as pessoas acessem um armazenamento de dados subjacente que estaremos construindo. Usando a funcionalidade que vamos construir estão usando clientes que eles precisarão construir, seja para um celular ou web ou qualquer outro tipo de dispositivo. Assim, as APIs ou pelo menos o tipo de API que vamos construir são baseadas nos princípios restantes. Então vamos aprender pulso e preso abreviado para transferência representacional do estado. É um padrão de API Web muito popular e é usado em muitas plataformas. Portanto, embora estejamos construindo a API usando o núcleo.net, a API pode ser consumida por clientes de muitas outras pilhas de desenvolvimento. Além disso, estaremos aprendendo a usar Dominic core cinco, estaremos olhando para entender os serviços e oh, todo
o fluxo de aplicativos funciona. E nós também estaremos olhando para usar o nível corporativo mais quente. Práticas recomendadas que podemos colocar no código de tal forma que quando estivermos prontos para expandir, seja através de nossa própria descoberta ou em um ambiente corporativo. Nós não teremos que puxar muito do nosso aplicativo para fazer isso. Bem, podemos apenas tocar nos componentes à medida que avançamos. Então, em poucas palavras, você vai aprender o ASP.net cinco e Entity Framework forward wind para estar usando aspas em primeiro lugar, é incrível desenvolvimento e exploração. Mais uma vez, os padrões de codificação chave estarão olhando autenticação de
API usando os tokens da web JSON são JWT para curto curso, podemos protegê-los mais do que nossos endpoints e protegê-los de acesso não autorizado ou indesejado. Vamos analisar
a compreensão do pipeline de serviço núcleo Dark Net e tudo o que
podemos estendê-los e colocar em nosso próprio middleware, ter olhando para testes de API e registro sóbrio usando Postman e serial out para nossos testes de API e fins de registro respeitosamente, e também estaremos olhando para toda a arrogância pode desempenhar um papel na documentação da nossa API e também ajudar com o controle artístico de fontes. Vamos usar o GitHub para que possamos armazenar
ou codificar de forma segura e ser capaz de reverter caso seja necessário. E então olhamos para, depois de construir sobre todas essas coisas maravilhosas, como exatamente permitimos que nossa API seja acessada, seja em um ambiente de empresa ou pelo Mundo. Agora, este curso tem princípios silenciosos de alguém. É cerca de dez horas de duração e você vai aprender um monte de coisas. Por isso, prepara-te para esta viagem e estou muito entusiasmado por te ter junto.
2. Instale o Visual Studio 2019 Edição comunitária e . Net 5 SDK: Pessoal, hoje vamos começar a instalar Visual Studio Community Edition e.net cinco. Agora, nossa jornada começa aqui no site do Visual Studio, que você pode acessar através de uma simples pesquisa do Google. Ou você pode tentar reproduzir esse URL, que é Visual Studio dot microsoft.com barra VS comunidade barra. Agora, existem adições diferentes do Visual Studio. E a comunidade é aquela que
é, é gratuita para uso individual e essa é a que vamos usar. Então você pode ir em frente e baixar o Visual Studio, que lhe dará o instalador do Visual Studio. E quando isso estiver concluído, podemos ir em frente e executar esse arquivo. Vamos lançar os pontos de verificação de segurança que você pode ter, mas você pode continuar para permitir que o instalador comece. E tudo isso é onde você realmente define o que Visual Studio será capaz de fazer. Portanto, esses são chamados de cargas de trabalho, e cada carga de trabalho irá expor um conjunto de recursos diferente para você. Então, para desenvolvimento web, você vai querer obter o ASP.net e a carga de trabalho de desenvolvimento web. Para desenvolvimento de desktop. Você deseja obter o desenvolvimento de desktop net ou fazer upload. E para qualquer outro SDK ou tipo de projeto que você queira desenvolver, você pode ir em frente e obter a carga de trabalho associada a ele. Não, para este exercício, queremos preparar o nosso estúdio de resultados com os recursos necessários para o desenvolvimento web. Mais uma vez, você pode ir em frente e levar tantas dessas cargas de trabalho. Cada um virá com seu próprio tamanho e lhe diz quanto espaço é necessário com base nos que você selecionar. Mas, no mínimo, para desenvolvimento web, você quer ter certeza de que você tem ASP.net e desenvolvimento web marcado. Você pode ir em frente e pegar as outras ferramentas de desenvolvimento, se desejar. Mas eu não estou disposto a fazer isso porque estes são todos.net framework 644.84.6, desculpe, 4.74.8. Mas vamos instalar o documento cinco em poucos minutos para
que você possa fazer isso e deixar o Visual Studio instalar. Isso vai demorar um pouco para que você possa tomar uma xícara de café e voltar. Agora, uma vez que o download e a instalação estão concluídos, você tem duas opções. Você pode ir em frente e entrar. E assinar o que significa que você entra com seus cones vivos. Se você tiver um, se não, então vá em frente e crie um. É gratuito e torna a vida mais fácil se você apenas criar um e realmente entrar. Mas vou em frente com uma opção não nula talvez mais tarde. E então você escolhe suas configurações gerais. Então eu acender o tema escuro e você pode escolher o que eles querem, quais configurações de desenvolvimento ou geral. Vou deixar o meu em geral, mesmo que estejamos fazendo o que desenvolvimento. Mas eles basicamente apenas otimizam certos atalhos de teclado e o layout com base em sua seleção. Vou deixar o meu em geral. Vou começar com o Visual Studio. Certo, assim que isso for feito, você será solicitado com esta neve. Se você não entender isso, então tudo bem. Mas é por isso que eu teria sugerido que você se inscrevesse com seus cones de vida porque então tudo você tem um período de teste de 30 dias. E se você não quer o topo do cone, então eles basicamente vão dizer para você sair. Então você pode realmente ir em frente e entrar. Então eu vou assinar com a minha própria. E uma vez que você assinou e, em seguida, você vai ver que ele não está licenciado para você e ele só parece enviar mais convidativo. Então agora, em vez de sair do Visual Studio, posso fechar. E este é o Visual Studio no nível básico. Agora temos o Visual Studio. O que também precisamos é o.net 5. Assim, você pode chegar à página de download net cinco através de uma pesquisa simples do Google mais uma vez. Ou você tenta reproduzir esse URL, qualquer que você achar mais fácil de fazer. Neste ponto, você deseja baixar o SDK e o tempo de execução. Então deixe-me começar fechando o Visual Studio porque ele precisa instalar extensões para ele. E o instalador está sempre disponível para você. Então, se você não adicionar uma carga de trabalho, só para que você saiba, você pode realmente apenas clicar em modificar e, em seguida, ele irá reiniciar esse pH com tudo o que o trabalhador diria se mais tarde você quiser que ele faça algo novo, você só precisa modificar essa carga de trabalho , em seguida, você obterá esses modelos de projeto em conformidade. No entanto, vou fechar o Visual Studio, para que possamos continuar com nossas instalações. Então vamos pegar o.net cinco. Agora você pode ver que os SDKs disponíveis com base em seu sistema operacional, eu tenho um sistema operacional Windows 64 bits trabalhando com retina, então eu vou em frente e baixar isso. E enquanto esse está baixando e apenas Lindsay aperte o botão Voltar e passar para o tempo de execução, que é absolutamente necessário para hospedagem. Então você vê que é o suporte de tempo de execução. Então, se você estiver indo para hospedar o aplicativo do.net cinco em, em um servidor local, então você definitivamente precisa do tempo de execução. Então você pode apenas obter este pacote de hospedagem que eles têm lá disponível para download. Então você pode baixar ambos e quando eles terminarem. Então, quando os SDKs terminarem, você pode ir em frente e instalar esse 1 primeiro. Não deve demorar muito. E tudo bem, então é bem sucedido. Depois de instalar o SDK, queremos apenas ter certeza de que temos tempo próprio. Também concorde com qualquer coisa, e vá em frente e execute sua instalação. E ele vai deixar você saber quando ele for concluído com sucesso, saber que temos o SDK está completamente instalado. Eu só queria iniciar o Visual Studio e mostrar o que você ganha com esses SDKs. Então, se eu for em frente e criar um novo projeto por causa das cargas de trabalho que tenho disponíveis para mim, verei diferentes modelos de projeto. Então eu escolhi apenas o nó web worker. Então eu tenho a capacidade de fazer um console regular para cima. Tenho o núcleo ASP.NET. Na verdade, eu acho que este vem por causa da carga de trabalho da área de trabalho, mas neste momento eu não estou tentando descobrir o que funcionou, quem pertence a qual. Basta saber que se você está indo para estar fazendo nosso projeto web, você tem a opção de escolher um aplicativo web core,
um aplicativo blazer, e você pode escolhê-los se você não vai fazer para R.NET framework, alguém para escolher uma aplicação Web. NET Core. Esta não é a aplicação que estamos construindo. Só estou mostrando suas opções. Então vamos em frente e colocar o nome do projeto poderia criar. Em seguida, a partir da lista suspensa aqui, você pode escolher se deseja um Core 2.13.1 ou o mais recente dominate core 5. E com isso, você poderá escolher os diferentes modelos e prosseguir. Então, quando voltarmos, vamos realmente criar um projeto e fazer um tour fora das estruturas de pastas.
3. UPDATE: instale Visual Studio 2022 Community Edition e . NET 6: Ei pessoal. Nesta lição, instalaremos o Visual Studio 2022, que vem com dotnet six, que é o dotnet mais rápido até agora. Então, para começar, só
precisamos ir até o Visual Studio dot Microsoft.com slash downloads. E então iremos em frente e vamos o download gratuito na edição da comunidade, que nos dará um instalador. Assim que executarmos esse instalador, poderemos selecionar as cargas de trabalho que queremos. As cargas de trabalho realmente se referem às bibliotecas ou às bibliotecas de
suporte para o tipo de up que você está interessado em criar. Então, neste caso, definitivamente queremos obter esse ASP.net de desenvolvimento
web na carga de trabalho de desenvolvimento web. Mas se você estiver interessado em outras tecnologias, você pode ir em frente e selecioná-las. Assim, você pode ver que tenho várias cargas de trabalho selecionadas com desenvolvimento do Azure, NodeJS e desenvolvimento de desktop. Então você pode ir em frente e dividi-los também. Eu acho que eles serão úteis com outros projetos que você pode acabar construindo tudo,
uma vez que você tenha feito isso,
você pode ir em uma vez que você tenha feito isso, frente e clicar em Instalar, o
que seria feito no canto inferior direito. Obviamente, quanto mais cargas de trabalho você selecionar, maior o tamanho do download. Então,
depois de concluir isso, você poderá continuar. Agora, quando esse download estiver concluído, você pode obter certas opções que eu não
vou obter porque já o tenho instalado. Então isso vai orientá-lo sobre o que eu espero? Você pode ter uma opção na qual você escolhe seu tema. Como você pode ver, estou usando o tema escuro, mas então você tem a opção de um tema claro, um tema azul. E o problema é que o Visual Studio 22 tem muito mais temas do que seus antecessores. Então, mesmo que você não queira iluminar os temas iniciais, você pode obter todos os temas se precisar deles. Além disso, você pode ser solicitado a entrar. Portanto, se você já tiver o 2019 instalado em sua máquina e acabou de instalar em 2022, você já entrou em 2019, provavelmente não solicitará que você faça login novamente. No entanto, se esta for a sua primeira instalação do Visual Studio, você pode ser solicitado a entrar ou criar uma conta ativa, ponto em que você gostaria de usar apenas sua Microsoft emitido ao vivo em todos os loci que me ensinam um muitos cones com, ou você pode simplesmente ir em frente e criar um. E se eu, se minha memória me servir corretamente, você pode usar outro endereço de e-mail que não seja da Microsoft, secreta saliva, frio.
4. Configurar a conta GitHub: Ei pessoal, neste vídeo estaremos criando ou contas do GitHub. E esta é uma coisa muito simples, envelhece, torna muito fácil para nós nos inscrevermos. Você só precisa ir para GitHub.com. Faz GIT HUB DOT COM, github.com, e você vai pousar nesta página. Agora a partir daqui, se você já tem uma conta e você pode entrar e você pode praticamente parar de assistir o vídeo aqui. Se não o fizeres. No entanto, então o formulário central está bem aqui. Você pode fazer uma pequena leitura, apenas recebe uma apreciação do que o GitHub é quatro e é tudo sobre, eles têm preços, então eles oferecem planos
empresariais e planos de educação e plantas diferentes ou situações diferentes . Mas para o desenvolvedor solar ou para equipes
muito pequenas que podem não ser de nível empresarial do que eles são. Te dou muito de graça. Então, para se inscrever, você só precisa inserir um nome de usuário, endereço de e-mail e uma senha. E uma vez que você forneceu todas essas coisas e desde que seu nome de usuário é único o suficiente, claro, então você clica em se inscrever no GitHub e você deve estar dentro. Então eu já tenho uma conta, então eu realmente vou entrar. Você viu que minhas sobrancelhas estão enlouquecendo tentando fornecer informações. Por isso, vou iniciar sessão com a minha conta existente. Então esse é o meu bem, você pode usar seu nome de usuário ou endereços de e-mail para entrar e a senha. E aqui estou eu, esta é a minha página inicial, então eles realmente te dão um senso de comunidade. É quase como um Facebook para desenvolvedores, até certo ponto, você pode seguir as pessoas. E uma vez que elas seguem as pessoas, você vê suas atividades na página inicial, você pode ir para o seu repositório. Então, obviamente, se você é novo para se levantar, então você não teria nada listado para o lado aqui. O que eu não sou novo. Tenho estado muito ocupado colocando conteúdo no YouTube, quase qualquer pequeno projeto de estimação que é eu começar, eu tenho um repositório do GitHub ou realmente eu preciso passar por ele. Assim, e também tive alunos que me
adicionassem ao seu repouso no passado para que pudéssemos colaborar. Talvez eles estivessem tendo um problema e eu poderia apenas verificar o código deles através do repositório. Todas essas coisas são possíveis através desta foto verbal. Mas uma vez que você criou seus cones e você está conectado e bem, você obviamente não veria o que eu estou vendo mais uma vez. Mas isso completaria a inscrição.
5. Instale e Explore PostMan: Ei pessoal, neste vídeo nós vamos estar instalando carteiro ou porcelana é uma excelente ferramenta para colaboração e testes APA e validação em todas essas coisas maravilhosas. Então, é muito fácil de instalar realmente. Você só vai pausar o man.com. Carteiro faz luz Luca que entrega seu correio, Horstmann.com. Você não sabe o que é. E claro que você escolhe o seu óleo. Então, o Windows de 64 bits e, em seguida, o download começa. Tudo bem, assim que o download estiver concluído, você pode ir em frente e abrir o arquivo de instalação, executar o instalador. Tudo bem, então quando terminar, você verá uma tela solicitando que você se inscreva ou entre, ou verá essa tela de qualquer maneira, se você vir algo para entrar, eu o encorajaria a fazer isso. Na verdade, já tinha na minha máquina. Então o fluxo pode não ser exatamente assim. Mas se você vir esta página aparecer, então está tudo bem. Você pode apenas clicar no X e você pode tirá-lo. E eu não estou assinada de qualquer maneira. Então, se você vê o fora da tela olhando algo como isso, então você pode simplesmente ir em frente e criar um cones solúvel. Eles podem criar um cones OK muito facilmente nome de usuário, senha, ou você apenas entrar com o Google. Eu gosto de apenas fazer login com o Google. E a coisa é que o analisador vai manter um histórico de cada teste que você fez uma vez que você vai ter em cima cones. Tudo bem, então eu vou apenas ir em frente e entrar com o Google. Ou está ligado. Depois de iniciar sessão, saberá que pode começar a trabalhar. Então, vou mostrar a vocês uma amostra do que o Carteiro é capaz. Em primeiro lugar, vou sugerir que é um modo escuro porque o modo é legal. E então eu vou criar uma nova janela de solicitação. Então, usando este sinal de adição, assim como qualquer navegador com os sinais de adição na parte superior, você pode ver um sinal de adição, e isso lhe dá uma nova solicitação. Agora eu já fui em frente e procurar por algumas APIs públicas, como discutimos, APIs base tem que ganhar nosso gateway em seu banco de dados. Assim, as pessoas têm APIs, várias pessoas têm APIs. E eu encontrei este site qualquer traço api.com. E apenas triângulo de volta para a primeira parte para que você possa ver o que eles têm para oferecer. Então, a partir da página inicial, os colegas emitem um monte de APIs que enfrentam o público. Então você vai, você pode apenas ir em frente e clicar em um e, você sabe, testá-lo. Então eu fui ao dicionário de Oxford onde eu pegava uma lista de idiomas. Então eles mostram todos os pontos finais, certo? Então, na construção de toda a API, eles se vinculam ao dab de banco de dados, uma URL comum, mas então eles têm diferentes pontos de extremidade que darão diferentes bits de informação. E então eles têm métodos diferentes, GET e postar e adiar alguns outros. Mas o fato é que você tem que saber o tipo de solicitação. Você tem que saber o URL através do qual você pode obter essa solicitação satisfeita. Você tem que saber se você tem que passar em cabeçalhos. Então aqui eu sei que preciso de candidaturas. E ID. E então eles me mostram as respostas. Então 200 significa o, t, e homens iniciais exemplo em JSON o que seria essa resposta. E então 404 significa não encontrado. 500 significa que há um erro interno geralmente com o servidor doméstico, não com você, certo? Então, para Musa, você provavelmente está procurando por algo que não existe. 500 significa que o provedor de API tem um erro. Tudo bem, então eu mudei de qualquer API e queria livre, para livre forex api dot cottons, desculpe, então eu dei uma olhada em qualquer URL API como todos esses API é necessário, que você teria ar quente sem cones B, nosso usuário registrado provavelmente sendo usuário fora dessas plataformas que você pode olhar através, você vê Instagram é um YouTube, Google. A maioria deles são previu API, então eles estão usando assim mãe auto segurança ou possuí-la. E vamos passar por todas essas técnicas neste curso. Mas agora eu só quero começar com uma vitória rápida e satisfação de ver o que o carteiro pode fazer e a relevância disso, certo? Então eu telefonei livre forex api.com, direito novamente para parar que é de graça para api.com. E então vamos com a documentação para que a página de destino seja realmente demonstração
deles consumindo os dados através da API que eles estão expondo, certo? Então eles têm uma API incorporada de banco de dados. E, em seguida, eles estão fazendo uma série de chamadas
API para mostrar o índice de negociação entre euro, USD você é e GBP, etc, etc. Então, se eu for para a documentação, eles vão me dar os Termos de Uso, me
dizer como usá-lo. Então a documentação é muito, muito importante e vital quando se trata das APIs, eu vou estar usando swagger classiter UI para o nosso vocal swash. Quando chegarmos lá, você verá, mas também nos concentraremos em documentar nossas APIs em grande medida. Então a partir daqui eles mostram que você tem o, que é o domínio no qual a API está hospedada, certo? E, em seguida, ao rolar para baixo, você verá os diferentes tipos de funcionalidade que eles expuseram. Então essa é uma boa versão beta, certo? E então eles me dizem o pedido, é um pedido GET. E então você tem o, o, os endpoints, desculpe, a URL e o endpoint, isso é o que ele precisa ser parecido. E esta é uma resposta do amostrador. Tudo bem, e se você olhar através, você vê outro. Você pode obter pares diferentes. Então aqui você vai olhar, ele vai ser Euro-USD E1 eo retorno que os resultados dessa consulta para você. E então, neste, você pode obter mais do que um se você quiser. Então você apenas colocar em ambos os índices que você está interessado em como o parâmetro nesse endpoint. Tudo bem, então essa é uma string de consulta para os valores em que as consultas estão. E, em seguida, esta é a resposta da API. Uma vez que as consultas são um dados NDA é telefonado. Não, os acordes de seta contam uma boa história porque então você passa para períodos que não existem em seu sistema do que eles estão dizendo que se você não passar em qualquer configuração é necessário e se você passar em algo que não está lá, então você verá um código de erro 102. Então você tem códigos de erro padrão e você tem alguns milagres. Você mesmo pode fazer. Vamos tentar esta amostra. Então eu vou tentar o primeiro onde eu estou recebendo euro e USD. Então eu vou apenas copiar este link, que eles disseram, isso é tudo que você obtém para os dados neste ponto final. E depois vou abrir o Carteiro. E então o que eu vou fazer é perfurá-lo dentro deste conjunto diz inserir URL de solicitação, isso é o que nós apenas copiamos, certo? Pedido. E o URL, eu colo o URL da solicitação. E então o verbo aqui, LC pode fazer GET, post, PUT, patch, delete, você tem um monte deles. Então get é geralmente usado quando você está esperando para recuperar dados, certo? Então obtenha e, em seguida, livre para sua API. Seja qual for a URL da solicitação, não, está comprometida com a memória porque está lá na documentação. E então eu vou clicar em enviar, saber o que o carteiro faz é imitar uma chamada. Bem, não realmente imitar ele realmente executa a chamada para esse ponto final API e, em seguida, recupera os dados na resposta. Então vemos aqui, ele pode não ser tão bem formatado como como está na documentação. Claro, eles estão colocando seu melhor pé para a frente. O que faz o mesmo pedaço de informação onde obter uma leitura e estamos recebendo um carimbo de data/hora e ou obtendo código de 200. Se você olhar para a direita, você verá o Status 200. Está bem? Então 200 é o universo de resposta para todos k. uma vez que você recebe uma resposta 200, você sabe que tudo está bem. Então os números diferentes têm significados diferentes de palavras, certo? O tempo que levou para mim o custo. Então esta é uma API rápida levou apenas isso é o que
, 2,5 e o tamanho da resposta, certo? Então você sempre pode formatar. Então isso você pode clicar bonito, ou você pode dizer raw ou visualizar ou visualizar. Eu não tenho certeza porque eu sou bonita, Oh, isso é logo depois de mudar o formato. Então é muito HTML. Então, tudo isso é bom. E olhando para isso, eu posso dizer algo como XML e não é XML. Eu disse HTML. Deixe-me clicar em JSON, que é, e lá vamos nós. Então agora é muito JSON. Então agora parece um pouco mais radical, o que está sendo visualizado em sua documentação, certo? Então Postman é muito útil quando você só quer testar como será a resposta. Json é a resposta mais amplamente utilizada que eu estou vendo que vagamente, eu gosto de usar respostas JSON. Qual a alternativa Clausius para isso seria XML. E uma vez que os dados estão sendo retornados que o usuário espera e você documenta o que eles podem esperar, então você está, você pode se sentir confiante de que qualquer pessoa pode usar APA quando necessário. Então, o Postman vai ser útil enquanto vamos para barcos desenvolvendo nossa APN, só quero validar que as respostas são da maneira que esperamos.
6. Crie e faça o projeto de API web: Ei pessoal, bem-vindos de volta. Então a primeira coisa que precisamos fazer tendo um ambiente
de duas partes e tudo mais é criar nossos projetos. Então o que vamos fazer é lançar o Visual Studio. E então vamos criar um novo projeto. Agora, a partir daqui você pode escolher o modelo que você deseja se você tiver o aplicativo web núcleo ASP.net na parte superior, vá em frente e selecione-o. Se você não fizer isso, então você pode apenas digitar na web neste filtro e ele vai filtrar não usar vai estar usando C-Sharp. Então certifique-se de que C-sharp está selecionado. E enquanto você não tem que mudar muito mais, mas para selecionar os modelos desejados e ir em frente e clique em Avançar. Não, vamos construir uma API de listagem de hotéis. Então eu vou ligar para o meu projeto de lista de hotéis. Agora que temos, não temos que mudar muito mais. Podemos ir em frente e clicar em Criar. Se você quiser selecionar um local específico, você pode ir em frente e fazer isso. Caso contrário, prossiga com as criações. Próximo passo tem uma seleção do estoque que pretendemos usar. Não, você já teria instalado o.net cinco SDK e Visual Studio 2090. E assim você deve ter obtido ou 5 como, como uma opção. Se você não tem isso, então você deve ter 3.1. De qualquer forma. Você Candace duplo-back, vá em frente e instale o SDK. Revise esse vídeo se precisar se certificar de que tem tudo instalado. E então você pode ir em frente e selecionar 5. E nós estaremos construindo uma API Web ASP.net Core. Agora, à direita, temos a opção de adicionar autenticação e configurar outras coisas. Então deixamos tudo como está. Não vamos configurar a autenticação aqui porque as opções que nos são dadas não são realmente o que queremos. Então, vamos configurar manualmente isso mais tarde. E isso seria um bom exercício para ajudá-lo a entender como o núcleo de identidade é integrado à sua API. Mas podemos deixar isso sem autenticação, certo? Nulo. E então podemos ir em frente e clicar em Criar. Então agora esse é o nosso projeto foi criado. O, apenas o ponto, oh, antes de eu ir muito mais longe, o layout do meu Visual Studio significa diferente do seu porque eu costumo usar o Solution Explorer. meu lado esquerdo. Por padrão, ele deve estar à direita, estaria à direita. Então, provavelmente é assim que o seu se parece. Ou podemos sempre arrastá-lo e colocá-lo onde você quiser. Eu gosto de tê-lo para a esquerda, então é onde eu vou estar usando o meu. Agora o Solution Explorer está nos dando uma lista de arquivos e eu estou apenas
passando por isso em casos é sua primeira vez criando um projeto.net. Se não for, então eu vou falar sobre isso de qualquer maneira porque, você sabe, repetição Newtons em pressão e talvez eu vou apontar ou algo que você não sabia antes. Mas ei, então a primeira coisa que vamos querer ver é a nossa pasta de propriedades. Então deixe-me, deixe-me começar de novo. Então temos o que chamamos de solução, que é como um manifesto para a lista de projetos que estão nessa solução que estamos construindo. O projeto é listagem de hotéis. Eu noto quando eu clico nele. É realmente apenas um arquivo XML com um monte de configurações em listagens e todas as coisas necessárias para que o projeto saiba qual é sua identidade. Então, porque escolhemos o.NET 5, você vê que essa é a estrutura de destino. Se escolhermos, 3.1 veria algo diferente lá sob propriedades ou lê-las dependências, vemos analisadores, frameworks, pacotes à medida que avançamos, você vê esta lista crescendo, então não obtenha demais para o que está acontecendo lá. Nós olhamos para propriedades, vemos configurações de gramado. Então aqui é como apenas configurações, dizer ao aplicativo e como ele deve se comportar quando estamos no modo de depuração. Então, o que é muito importante aqui, porém, é que nós permitimos que ele configure SSL ou HTTPS quando estamos de acordo em um projeto. Como resultado, temos essa porta SSL. Então, quando estamos fazendo o nosso aplicativo e testes e assim por diante será em HTTPS dois-pontos barra barra host local. E, em seguida, porque HTTPS estava usando a porta SSL,
caso contrário, este seria o ponto final HTTP menos seguro. Então isso é apenas uma coisinha que eu estou apontando todo o seu caso contrário, as outras configurações que vamos entrar em como nós avançamos. Mais pasta controladores, que realmente mangueiras são controladores
bem e estes fazem exatamente o que o nome sugere. Eles controlavam a aplicação através da lógica ou tudo vai. Quando recebemos um pedido de informação santa interpretada, e todos esses comportamentos seriam definidos dentro de nossos controladores. Estas são as primeiras linhas de defesa. Onesy aquece um endpoint de API, você está realmente chegando a um controlador. E então ele diria, OK, qual endpoint ou sit, o que devo fazer? E então ele retornará em conformidade. Mais uma vez, à medida que avançarmos, você verá que isso ganhará vida. Tudo bem, eu vou pular em frente para o nosso ponto perturbador JSON, que não tem muito. Vamos modificar isso. Mas ele vai junto? Mas deixe-me ir para o program.cs, que é o ponto de partida para nossas aplicações. Então aqui você vê que ele executa essas funções principais se você já fez outra linguagem ou desenvolvido em um C-sharp console aplicativos, você percebe que eu sempre começar com principal, pelo
menos ver mais C-sharp Java. Todas essas línguas, pelo menos, têm um método mau, certo? Então, uma vez que estamos executando nossa API vai atingir a média e, em seguida, principal vai basicamente fazer como um edifício. Então o que ele faz é agregar todos
os middlewares em funcionalidade e coloca no aplicativo. Então ele chama esse método, que é realmente definido logo abaixo. E ele faz suas inicializações com base no que está em nosso arquivo de inicialização. Então, se eu for para a inicialização, aqui é onde você vê onde todos os middlewares são adicionados e as configurações são chamadas no get-go. Então aqui vemos onde ele quer usar controladores, adicione as bibliotecas que você precisa adicionar para que possamos usar nossos controladores. Arma arrogância, solo. Tradicionalmente swagger teria sido, você teria que implementar esse dinheiro cedo desde esta versão da API .net, ele sai da caixa para que não tenhamos que fazer muito trabalho, mas vamos explorar o que é swagger mais tarde no caso de você não ter certeza do que é. Nós então isso é configurações ou configurar serviços. Desculpe, temos configurar o que nos permite configurar algumas outras funcionalidades. Então, sem entrar muito neles, alguns deles são auto-explicativos, alguns deles são por razões de segurança. Como todos eles são realmente agradáveis, os hubs, e vamos adicionar mais e mais à medida que colocamos mais recursos em nossa API. Então não se preocupe muito com isso. A fase final desta solução seria apenas este modelo. Então este modelo apenas representa basicamente beta ou uma unidade fortemente digitada de dados. E vamos definir muitos modelos e objetos de transferência de dados mais tarde. Mas, por enquanto, criamos nosso projeto. Devemos ter uma compreensão justa do que estamos olhando dentro desta solução. E quando voltarmos, vamos começar a configurar nosso primeiro serviço inativo aplicativo na forma de registro em log.
7. UPDATE: atualização para . NET 6: Ei pessoal, Nesta lição, vamos estar procurando
atualizar nosso projeto a partir de dotnet 52, dotnet seis e tudo isso é completamente opcional e um pré-requisito para isso é que você realmente tenha instalado Visual Studio 2022 já. Então, se você se sentir mais confortável apenas prosseguindo com dotnet five e Visual Studio 2019, isso não é absolutamente nenhum problema. No entanto, se você quiser dar esse pequeno passo e ir até a busca de dotnet, é
isso que eu vou guiá-lo ao fazer. Em última análise, embora, mesmo se você fizer isso, atualize, tudo o resto do curso caberá, pois dotnet six é compatível com tudo para dotnet cinco. Então, exceto essas poucas mudanças, todo o resto deve funcionar. Então, a primeira grande mudança que vamos fazer é uma estrutura de destino. Então, para o arquivo CSB, esse é o arquivo de projeto na parte superior aqui. Você vai clicar nele
e, em seguida, ele se tornará editável. Então você quer mudar isso de dotnet cinco para dotnet seis. Além dessa alteração neste arquivo, vamos querer adicionar duas novas referências de biblioteca. E esses virão nas formas da Microsoft, não ASP NET cord dot JSON Patch, que será a versão 6 e as abstrações de cache de pontos de extensão de ponto da
Microsoft, que também é dotnet seis. Então, se você fizer esse ajuste, todos os pacotes que você usará metade para dotnet seis. Então, durante a duração do curso, maior parte é feita em dotnet cinco. Você vai me ver referenciando dotnet cinco bibliotecas. Mas tudo o que você precisa fazer é se certificar usar dotnet six em vez de dotnet cinco. Então agora não vamos rasgar o arquivo de configurações e isso é realmente opcional. Mas eles removeram o Microsoft on Microsoft dot hospedando bibliotecas de log vitalício, e eles o substituíram pelo aviso
Microsoft dot ASP NET Core. Então você pode ir em frente e atender a essa mudança. Depois de fazer tudo isso, você quer apenas fazer Control Shift e B que faz uma compilação, ou você pode simplesmente ir para compilar e clicar em Construir solução. E então você provavelmente verá algumas áreas acima do projeto alvo, alvo. Então, vamos pular para os projetos. Vá para New get, Gerenciar pacotes NuGet. Se você não está muito familiarizado com o que obtém, é que vamos olhar para isso mais adiante no curso. Mas, por enquanto, o problema é que algumas de nossas bibliotecas ainda estão em dotnet cinco. Então, como eu disse, em vez de fazer referência ao dotnet 5, vamos fazer referência à versão dotnet seis. Então, tudo o que você precisa fazer é pular para atualizações. Selecione todo o intervalo é, faça uma atualização. Aceite todos os problemas que surgirem. E depois de fazer isso, você provavelmente pode fazer uma reconstrução. Às vezes, um construtor não pega tudo. Então, quando você fizer uma reconstrução, ela será limpa e depois restaurada e, em seguida, compilará. E então vemos que um foi bem-sucedido. Então, sabemos que nosso projeto foi atualizado com sucesso para dominar as buscas. Então você pode ir em frente e terminar o resto
deste curso e se divertir com tudo o que você vai fazer.
8. Configurar o registro usando SeriLog: Bem-vindos de volta, rapazes. Então, nesta lição vamos estar configurando nossos utilitários logger. Então a nossa arma preferida para este será seriado. Dito isto, existem algumas ferramentas potenciais que estão lá fora, digamos UP SIR log n, log, log para net, pelo
menos aqueles são três que eu usei e tenho certeza de que existem outros. Não, estou usando o registro serial porque ele é inclinado como o mais rápido lá fora. E é muito popular na comunidade de desenvolvedores. Mas seja muito objetivo ao escolher sua ferramenta. Eu vou orientá-lo através da configuração para o log da Síria e configurar os outros podem ter algumas variações,
mas, em última análise, eles são todos voltados para fazer a mesma coisa que é registrar sua atividade de aplicativo. Não, deixe-me explicar o que quero dizer por registrar a atividade do aplicativo. Há momentos em que ocorrem eventos inesperados e se ocorre nulo e você ouve falar sobre isso cinco minutos depois ou mesmo o instante após isso acontecer. Às vezes é difícil rastrear, especialmente neste contexto ou é uma API. Não há IU real, nenhum feedback real, exceto em caso de erro que ocorreu. Então, usando este utilitário de login será capaz de tipo de fazer anotações sobre qual opção acionou wat para resposta que teria sido uma resposta de erro. E mesmo assim, podemos ver os detalhes da resposta de erro definida. Então vamos começar com a configuração do nosso registro em log. Então, precisamos que a biblioteca esteja associada com o serial out. Então eu vou apenas clicar com o botão direito do mouse no projeto, ir para gerenciar novos pacotes get. E então nós vamos olhar na seção distritos. Então, isto é o que temos instalado. Suas versões podem ser diferentes das minhas. E se você for solicitado a atualizar, tenha cuidado para que você deve ser capaz de atualizar o Microsoft em CFD suficiente, mas apenas tenha cuidado ao fazer e precisa estar pronto para Roebuck no caso de algo gregos. Até agora, não, vamos procurar e procuramos Syria Log dot ASP.NET Core. Então você verá este, mas não é o que queremos. Queremos pontos ASP.NET Core. Este tem uma biblioteca dedicada ao nosso tipo de projeto. Então podemos ir em frente e instalar isso mais uma vez, se a versão for diferente, não deve ser um grande problema. E para todos os problemas que você está tendo, apenas vá em frente e responda afirmativamente. E então, uma vez que isso é feito, vamos apenas para o nosso program.cs e começar a nossa configuração. Então, tudo o que precisamos fazer é deixar o aplicativo nem que onde você vai estar usando Siri log em vez do logger padrão que veio com o projeto. Porque se você olhar em perturbação, você vê que há alguma aparência de um madeireiro. Eles estão dando algumas configurações, mas isso não é tão robusto quanto o que queremos, certo? Então Cirillo meio que se constrói em cima disso e nos permite substituir. Então eu vou até o construtor de buracos para os olhos. E a primeira coisa que eu vou fazer é fazer uma nova linha sobre isso em sua terra 20 e os pontos usar e direita, Siri log. Tudo bem. Assim que eu fizer
isso, ele vai me dizer o que eu preciso para incluir aquela biblioteca. Então, use seu log após incluir que usando a instrução. Bem, então isso não é tudo. Isso não é algo que o começo costurado saiba que temos esta biblioteca aqui. Agora podemos voltar e configurar. Então eu só estou pegando essa cartilagem da roda porque no ônibus, reconhecidamente, eu esqueci de colocar isso. Então vamos obter nada fora do caminho e proceder para modificar a nossa aplicação principal, que vai inicializar o nosso logger quando o aplicativo começa sabão e
onde termina Putin alguns cenários de log de teste aqui na média como o nosso caso de teste. Então, o que eu quero fazer é configurar um objeto logger. Então eu vou dizer Log dot logger é igual a uma nova configuração logger. Tudo bem, então o que isso vai nos permitir fazer é definir alguns padrões e comportamentos esperados para o nosso registrador. Então eu vou ser apenas quebrando alinhado com cada configuração que eu adicionar foi para c dot. E a primeira configuração que eu quero está certa, ferramenta, em seguida, nós novamente. E então você vê aqui eles têm opções diferentes. Então disparou no console chamado Alltop a caixa, mas então eles falam sobre pias. Então ele pode baixar bibliotecas específicas para que você possa adorar um banco de dados. Você pode registrar dois outros vários arquivos ou tipos de arquivos com base em como você precisa dele barco, certo? Não, só estou interessado em arquivos mais tarde neste banco de dados de barras e assim por diante. Podemos duplo-back em Adicionar ferramenta de registro de banco de dados ou um conjunto de ferramentas. Então, certo, não, eu só vejo direito para arquivar. E então isso leva alguns parâmetros. Então eu vou apenas nomear os parâmetros eles porque eu não vou necessariamente amarrá-los a ordem específica que eles são necessários aqui nos construtores ou nas sobrecargas em vez disso, certo? Então o primeiro que vou escrever é caminho. Caminho significa onde esse arquivo deve ser criado? Quando ele precisa ser criado ou anúncios no caminho precisa ser uma string. Então eu não quero definir um caminho definido e eu vou apenas passar algum tempo e explicar aqui. Mais uma vez, regras de contexto. Primeiro, você pode querer ter um caminho de log central, porque depois de ter implantado sua API em um servidor, você não quer gastar em adivinhar onde fez o logotipo, onde o log pode estar, você pode não querer ele no projeto real. Certo. Porque eu tinha um arquivo de log aqui que tinha acabado de deletar, reconhecidamente. Mas você pode não querer isso em um projeto porque alguém de Broglie e aplicativo pode não necessariamente, você não quer necessariamente que eles para ir para os arquivos de projeto no servidor para ser capaz de acessar os terminais. Assim, você pode definir algum lugar na rede e você pode definir em outra unidade. Você pode simplesmente colocar em um caminho aqui onde você sabe, você quer que seus arquivos de log meta. Então eu vou ver algo como C cólon barra barra e quando dizer hotel. Então eu sei exatamente com qual obrigação estou lidando quando vejo a pasta, lista de
hotéis, registros de barras, certo? É o meu chefe que estou definindo. Então não estou dizendo que você deve definir o local se é a unidade D para você. Se você não quer colocar os registros, isso é com você, certo? Mas eu só estou recomendando que você o torne facilmente acessível ou acessível o suficiente. Você pode encontrá-lo quando precisar. Tudo bem. Então veja listagens de hotéis, registros, e então eu só vou dar meu log log log traço ponto TXT. Então eu vou explicar que são aparentemente traço aleatório em alguns. Então esse é o meu caminho de arquivo. Até agora, muitas flechas, mas vamos continuar e ver o que essas, então eu estou quebrando linhas para que possamos ver tudo. Tudo bem. Este quebrando e fazendo uma desculpa, recuo. Tudo bem, então é isso para o caminho. A próxima configuração que vou colocar é o modelo de saída. Como eu quero que cada linha fique? Certo? Então eu já preparei todos os modelos de colocar. Eu só vou colá-lo lá e guiá-lo através dele. Então, mais uma vez chamado parâmetro ou put templates dois-pontos e o valor
que eu quero seria timestamps Eu estou tendendo ele coloca em um timestamp com esse nível de detalhe, você pode adicionar ou subtrair. Você pode não precisar de todos esses anos Sadat, mês, dia,
hora, minuto, segundo mini milissegundo e o que Z é, certo? Então eu vi isso, usei isso muito detalhado. Dá-lhe o carimbo exato, algo acontece. Você pode não precisar do nível de detalhe que depende de você. E, em seguida, o nível de advertência é é um aviso de inflamação. Vou passar por isso mais tarde. Qual é a mensagem? E então nova linha ou exceção, se houver uma exceção incluída e Bricklin e mostrar a exceção. Tudo bem, então isso é basicamente o que é. Fazendo. Experimentos são que eu tenho é intervalos de rolagem. Então isso significa que intervalo deve criar um novo arquivo. Então isso me traz de volta àquele ponto de traço aleatório, ponto hub ali. Porque o que vai acontecer aqui é quando eu vejo intervalo de
rolamento ponto d significa e sem traço e o DID associado a cada d. Então isso é bom para segmentar seu amado rápido. Alguém disse algo na última semana, quinta-feira. Você pode facilmente ir e encontrar o arquivo de log para quinta-feira de folga na semana passada e revisá-lo. Caso contrário, eles acabarão com um grande arquivo que continua crescendo, crescendo e crescendo. E então você vai ter anos de alças em um arquivo, que é para mim que é ineficiente, pelo
menos quando você tem vários arquivos, você pode gerenciar os mais antigos. Você pode excluí-los com segurança ou movê-los para um arquivo com segurança e ainda manter essa segregação. Então é por isso que estou definindo esse intervalo inicial. O que você tem opções diferentes? Você pode fazer isso por dia, por hora, ou por minuto, por ano, depende de você. Tudo bem. O próximo seria o nível mínimo restrito. Então eu quero restringir a um mínimo de informações de nível de evento de log, certo? O que significa que eu preciso de um C cada pequena coisa, há certos pontos de depuração. Todos eles, você sabe, isso está começando, inicializando isso e revelando que eu não preciso ver tudo isso. Portanto, todos os registros detalhados aqui dependem de quanto você registra, bem
como do que você define como mínimo. Então aqui eu estou vendo apenas log com um mínimo de informações. Eu preciso incluir este controlador de biblioteca pontos entrar, e nós incluímos essa biblioteca. E então eu estou perdendo este ponto-e-vírgula. Mas antes de colocar o ponto-e-vírgula e dar uma olhada aqui novamente. Então temos certeza, e estou perdendo uma vírgula aqui. Então isso é uma coisa boa. A levou para rever isso. E, em seguida, a última coisa aqui para se livrar de todas essas matrizes seria, após este arquivo abrir e fechar chaves, dizemos ponto criar madeireiros. Portanto, é bom ver uma configuração de logger em todos esses itens. Crie o objeto logger. - Não. Tudo bem, então agora que nós
criamos, nós podemos realmente começar a usá-lo. Então o que eu vou fazer aqui é que estamos prontos ou iniciar o processo ou nossa média, a linha principal na função principal dentro do nosso dinheiro pista. E se você não está tão familiarizado com esse gadget pista significa vai
tentar fazer algo e se houver uma exceção, ele vai pegá-lo e lidar com isso de acordo. Então é isso que vamos chamar de manipulação de exceções. Tudo bem, então o que vamos fazer é tentar executar esta linha. Mas antes disso eu vou registrar a informação. Nossos bits de login de informações para dizer, hey, aplicativo está começando para que possamos ver exatamente a que horas e todos os detalhes necessários para saber que o aplicativo começou naquele ponto. Tudo bem, se pegarmos uma exceção, e aqui eu estou apenas qualificando exceção com os objetos que realmente detém a exceção, então eu vou ver fatal. Então você pode registrar erros, eu posso fazer login informações, você pode registrar aviso. Aqui, ele é alimentado se o aplicativo parar de funcionar. Então estou vendo no amor não fatal. E eu estou vendo e esta é a exceção que faz com que o feto desejava ser escrito. E este é um MRD e um aplicativo C em campos, campos para começar. Então eu estou vendo de modo que quando alguém revisou o registro, este é o resultado ou isso é o que aconteceu. Como resultado desta exceção. O registrador vai pharma Tito Nissl formatado e cuspi-lo para fora no arquivo de acordo com este. Tudo bem? E depois de tudo isso, vou dizer finalmente. Finalmente significa depois de ter manipulado ou eles tinham tentado operação e ele pegou e tudo está feito. O que eu quero fazer aqui? Estou vendo, eu só quero limpar e fechar meu objeto de registro. Então é isso que vai acontecer quando iniciarmos nossa aplicação. Então, certo, não, eu vou ir em frente e pressionar este botão Play aqui em cima, que vai iniciar o seu aplicativo. Ou podemos ir ao arquivo de registro e ver o que acontece. Tudo bem, então agora que o aplicativo está carregado e só para que você possa ver, o navegador vai aparecer com arrogância, vai passar por arrogância e mais tarde, não se preocupe muito. Humboldt é isso, parece legal, mas nosso foco aqui está em nossos registros. Então, vemos nosso registro aqui. Aplicativo está começando agora vemos o nível de log e é uma espécie de formatado. Santo, pensei que não seria certo. Então outras coisas estão realmente escrevendo para o log, ver suas obrigações começaram. Assim, os dados de log foram iniciados. Então este é um começo, este começou. Então você pode ver as datas exatas para o que isso vale, certo? Nós conhecemos o ambiente, então você vê os registros fornecem certos detalhes para nós que não podemos ver quando estamos apenas olhando para os bairros são assim. Você nunca saberia que tudo isso aconteceu na grana crescida só de olhar para isso. Então é isso para nós configurando o registrador, pelo
menos por agora, mais tarde nós configuramos nosso banco de dados e assim por diante. Podemos voltar e adicionar a função que ele pode registrar no banco de dados. Também.
9. Explore o Swagger UI: Bem-vindos de volta, rapazes. Então, hoje nós queremos apenas ter um rápido run-through off swagger, como ele se vincula ao nosso desenvolvimento de API e qual é o seu propósito. Portanto, o swagger realmente está lá para ajudar a simplificar o desenvolvimento de
API para usuários, equipes e empresas. É um conjunto de ferramentas de código aberto e basicamente nos ajuda a projetar um documento nossas necessidades obesas com muito menos esforço do que seria realmente necessário para ter esse nível de detalhe. Então é uma ferramenta muito boa. Isso nos ajuda ainda a automatizar um monte de coisas. E a melhor parte de seu estranho é que ele
já está incluído com nossa API em versões anteriores, quem teria que ir e instalá-lo é garantido que não foi um processo muito difícil. Bullets observam que a Microsoft parece que é
uma espécie de padrão que todos com um EPA querem colocar Jian futebol porque é tão legal, tão eficiente em tudo o que está fazendo. Então o que eles fizeram é que eles realmente começaram a empacotar isso em nossa API para nós. Assim, as principais bibliotecas que permitem que o swagger seja integrado, bem um, vem deste novo bolso GET. Se eu for gerenciar novo pacote get, veremos que temos o pacote já instalado. Swash vários pontos é p e.NET Core. Tudo bem, ele era menos ferramentas de desordem do que em nossa startup. Então, lembre-se de que program.cs causa a inicialização. Então a inicialização é nula onde definimos todos os middlewares e o que temos nos serviços para Sagar é serviços, pensamentos, arrogância estranha, Jen, colocamos se ou não nós de qualquer maneira, se estivéssemos fazendo isso manualmente, Teríamos que fazer isso. Mas porque foi gerado, mais
uma vez, não temos esse passo. Então ele irá gerar a arrogância e o documento. Ele suporta controle de versão. Então, se você tem a versão um, versão dois, et cetera, fora de sua API, você é capaz de manter o caminhão fora das versões estão em bom estado. Deixe que quem está lendo documentação versão Norwich fora da API que eles estão olhando, você pode definir certa inflamação aberta API. Esse é o título, a versão. Se eu clicar em vírgula aqui, você verá que você adiciona novamente informações de contato. Você pode adicionar uma descrição, licença, todo tipo de coisas. Assim, seus documentos ou alguém olhando para sua documentação API sabe exatamente quem se você quiser fornecer esse nível de detalhe e assistir esta API é de parafusos. Mais tarde. Além disso, não o faça ou outro. Na seção Configurar, temos o uso swagger e UI use swagger. Assim, a interface do usuário swagger significa que ele criará seu próprio endpoint para ter seu próprio tipo de arquivo de configuração, e ele chamará seu de listagem de hotel v1. Não, certo? E não, isso é no final é o desenvolvimento. Então n é apenas uma variável que nos
permite rastrear qual ambiente onde em nosso início no desenvolvimento, quando pão, leite, Schon, certo? Não, qualquer coisa que entre aqui. Basicamente, é ver. Estamos em desenvolvimento. Então, quando publicamos isso para dizer como seu IIS ou para a Internet, seja lá o que for, onde quer que esteja, não faça nada disso. Isso é o que esta declaração diz basicamente. Não, acho que futebol é útil. Então, embora eles possam tê-lo colocado na parte de desenvolvimento, o que eu entendo, eu acho que é mais fácil apenas incluí-lo na API em todos os momentos. Assim, quando eu publiquei minha API ADL e difícil de fornecer tanto suporte técnico para
outra pessoa para ensiná-los a usar a API porque é para isso que a documentação swagger serve. Então eu vou apenas tomar essas duas linhas todos difíceis que se declaração e colocá-los
na área geral onde tudo vai ser feito independentemente do ambiente. Então essa é a minha modificação. Mais uma vez, o contexto é tudo o que posso entender que por razões
de segurança ou apenas a necessidade geral de Lakoff para troca de informações. Eles provavelmente disseram, bem, você só olha para ele em um ambiente de desenvolvimento porque os desenvolvedores podem ser internos. Mas se for para desenvolvedores terceirizados, então eu vou torná-lo externo e publicamente acessível. Então vamos dar uma olhada em um de nossos controladores. E bem, o controlador que temos, e você vê aqui nos dá a previsão do tempo e defesa eu recebo método. Tudo bem, agora se eu rodar o aplicativo e a página aparecer, estamos vendo nossos documentos arrogantes. Tudo bem, então o hotel listando versão um, todas essas coisas foram definidas na inicialização. Então, se você precisa mudar o nome ou torná-lo mais atraente, fácil de usar, legível por humanos. Você sempre pode alterá-lo dentro das áreas de configuração aqui e aqui, bem ali está, título. Então, se você quiser adicionar
descrição, descrição, ele aparecerá na página. Agora aqui ele está nos mostrando o que está na API e o que está na API seria nosso endpoint para obter, direito, voltar para o controlador para obter previsão do tempo. Tudo bem? Então ele está gerando contextualmente este documento com base no que ele vê no projeto. E quando você clicar nisso, ele mostrará exemplos do que
vai voltar quando você tentar recuperar qualquer coisa. O que é exatamente certo porque isso está retornando uma lista de previsão do tempo e previsão do tempo. Terrorismo é uma classe que tem alguns campos de dados definidos em cada um tem um tipo de dados de data. Então datetime, int, int e string. Então você vê se swagger está realmente tomando todos eles, veja o que está mostrando que você está indo para obter campo MCA chamado temperatura de batida, temperatura do
mar f. e resumo vai mostrar todos eles. E ele dá, mesmo dando-lhe uma idéia do tipo de dados, Datetime. Int, int e uma string. Então eu estou apenas mostrando a vocês o quão poderoso Sagar é sem qualquer esforço de nossa parte para já ter documentação de API, que mais uma vez é muito importante quando você está indo para construir em aplicativo cliente, consumindo qualquer API. Ou se você é o único que está construindo a API, você torna mais fácil para alguém que tem que consumi-la. Assim, da mesma maneira que você gostaria de ser tratado como um consumidor da API de alguém para ter todas as informações que você precisa para saber como construir sua própria API. Você quer ter certeza de fornecer essas informações a pessoas que interagem com a sua. Então arrogância torna isso fora da caixa muito fácil. E apenas para empurrar o envelope um pouco, quando vamos tentar é antigo, podemos realmente clicar em Executar e swagger nos permite realmente testar nossa API bem aqui. Então esses, esses dados que estão voltando com o código de status 200, nós entramos em tudo isso mais tarde. Mas você vê o corpo de resposta. Isso é porque ele é realmente executado o código que está aqui. E só para provar que se clicarmos sobre e este p e obtivermos esses pontos vermelhos, que é um ponto de ruptura. Então eu vou apenas clicar em Executar novamente. E então você vê o Visual Studio pausas e ele atinge esse breakpoints ac, você sabe, tem essa seta amarela nele. E isso nos permite pressionar FL f 11 e ir linha por linha. Então eu não estou tentando mostrar a vocês como depurar NANDA mostrando que isso não é fluff, ele realmente vai nos ajudar a testar. Então não há utilitários de teste F2, arrogância e carteiro. Tudo bem, então eu pressiono F5 ou eu posso clicar em continuar aqui em
cima, qualquer que seja, então ele vai continuar com a execução e vai trazê-lo de volta. Tudo bem, então isso é toda arrogância nos ajuda em nossa busca de testes. Agora eu só vou fazer para cair em especial e vamos incluir ou madeireiro aqui. Então, em cima, eu já, bem, por padrão, ele é injetado. Então, porque estamos usando semilog como um logger padrão quando
fazemos log usando nosso objeto aqui, ele vai usar o logger serial. Então eu só vou mostrar a vocês pequenos trechos de buracos torcendo esperanças que eu possa dizer pontos de cerveja. E então eu permitiria que a informação dissesse previsões meteorológicas acessadas. Tudo bem. Então isso é apenas inflamação para ver acessível a previsão. E então eu posso ver mais tarde em previsões meteorológicas retornou algo assim. Sabe, pode não ser. Isto, esta é uma bala elementar, é apenas mais uma vez, por exemplo, Sikh. Então, basta ver o madeireiro. Blogueiro. Oh, bem, desculpe, eu coloquei isso para encontrar oh, aqui está um depoimento de retorno, então eu vou deixar como informação para não mais tarde nós vamos começar a experimentar teia turbilhão ou atestar aspas para isso. Então eu vou apenas executar este aplicativo uma vez. E então eu vou em frente e experimentá-lo. Clique em Executar. Posso remover o ponto de interrupção apenas clicando. Então, enquanto esse ponto vermelho estiver lá, ele vai parar quando chegar nessa linha, basta remover os pontos vermelhos e pressionar F5 para continuar. Tudo bem, então executado. Deixe-me ver se meu diário vai me mostrar algo útil, maduro e fã. E lá vamos nós. Então estes são agora os arquivos de log todas as vezes que nós realmente abrimos e ele fez algo que você vê aqui, está bem nos pulmões. Então, aqui está o nosso primeiro aplicativo de blog está começando e, em seguida, é dados registrados. Isto fez aquilo. E aqui está o que acabamos de escrever, acessou a previsão do tempo, certo? E depois está a dizer-te todos os detalhes do que está a fazer e a ter um descendente. Certo. Então isso é tudo um trabalho de madeira, isso é tudo obras de Sagar.
10. Configuração CORS: Bem-vindos de volta, rapazes. Nesta lição, vamos configurar nossa política de coro. Não, é claro, é um acrônimo para compartilhamento de recursos de origem cruzada. E este é apenas um mecanismo que permite que você permita nossas restrições. O compartilhamento de recursos através de entretanto significa. Deixe-me dizer isso em um pouco mais de inglês. Quando alguém que não está em sua rede tenta acessar sua API, por padrão, sua API foi rejeitar essas solicitações de acesso. Tudo bem, então se eu desenvolver uma API interna para ser usada na minha empresa e alguém de fora da
minha empresa com um endereço IP completamente diferente e tudo tentar consumir a API ou falar com a API, então ele vai para saber automaticamente que, hey, bem, eu não posso te enviar nenhuma informação porque eu não te conheço. Portanto, queremos configurar esta política para facilitar alguma conversa com fontes são solicitantes. Isso é que eu não estou necessariamente na nossa rede. Tudo bem, então eu realmente encontrei isso antes onde eu desenvolvi uma API para minha empresa, para uso de terceiros. E passei algum tempo a depurar porque esta empresa não podia aceder à API que estava claramente a trabalhar na minha máquina e em todas as outras máquinas, a nossa própria B. E depois de escavar, percebi que era a correspondente a c. aceder à API que estava claramente a trabalhar na minha máquina e em todas as outras máquinas, a nossa própria B.
E depois de escavar,
percebi que era a correspondente a c.
às vezes você deixa um e-learning aprendido através da experiência. Bem, eu estou aqui apenas para que você saiba quais configurações você pode
colocar em prática desde o início para tipo de evitar certo trabalho atarefado. Então, a fim de adicionar esta política, o que vamos fazer é em nosso arquivo de inicialização dot cs e eu vou apenas adicioná-lo aqui. Ordem não importa até certo ponto, mas agora nós não estamos realmente focando
no auto só gostaria de obter nossas configurações em. Alguém acabou de dizer serviços, pontos, adicionar núcleos, e depois colocar o ponto-e-vírgula lá. Então, quando dizemos, é claro, que precisamos adicionar uma política como a corporação precisa de know-how para se comportar, certo? Assim, da mesma forma que quando estamos montando o outro arrogante Jin, desculpe, diria Ver, e então este lambda R0. E então podemos ter várias linhas com várias configurações. Você veria que é com endpoints e assim por diante. Vamos fazer isso aqui. Então eu vou ver tudo que você pode usar qualquer ferramenta pode realmente não é igual a b, c, o igual às opções de palavra. Como eu disse, você os vê usando a pedra Endpoints aqui. Então eu vou dizer “Tudo”. E depois o lambda R0. E então o que vou fazer é abrir e fechar chaves. Então isso significa que eu vou ter um bloco inteiro de configuração em algum este quebra na linha para que possamos ver claramente exatamente o que procurava. E então eu vou dizer todos os pontos adicionar política. Tudo bem, então eu estou adicionando política depois de dar um nome a ela. Então o primeiro parâmetro é uma senhora, eu vou chamá-lo de ferramenta política CORS, extravagante ou confuso. Então política CORS, em seguida, vírgula e depois definir outro lambda. Então eu vou chamar isso de construir sua causa normal para estar construindo as políticas. Então construtor lambda R0 e eu vou apenas quebrar a linha. Então eu queria dizer um construtor. Pontos permitem qualquer. Aqui estão todas as opções antes de eu começar a sentá-las. Estas são todas as opções que você pode permitir. Nea pode proibir, você pode definir. Então, se ele é branco listado ou com certos cabeçalhos, você pode definir hall. Sua API determinará quem tem permissão para acessar a mim ou aos meus recursos e quem não está. Farnell para fins educacionais. Mais tarde, talvez possamos olhar para a segurança dele e mistura sagrada e combinar. Bem, então, mais uma vez, contexto é tudo. Se você está desenvolvendo uma API para internet e uso de terceiros, então você não pode ser muito Street com a API se alguém infravermelho deve ser capaz de entrar. Caso contrário, você vai ter uma sobrecarga administrativa de tentar descobrir quem é quem o tempo todo. Então eu vou dizer uma baixa qualquer origem. E eu estou indo para encadear ao longo de um método baixo qualquer, significa que eles podem acessar cada método que o endpoint é definido aqui. E então eu fui dizer olá, qualquer chefe DAR, desculpe, um baixo, qualquer cabeçalho. Tudo bem, e então feche a chave para a política e, em seguida, use ponto-e-vírgula. Então essa é a minha política de curso que está definida. Então eu estou fazendo siloing todo e qualquer um. Uma vez que você está vindo para acessar minha API, você pode ir em frente e usar os recursos. Mais uma vez, o contexto é tudo o que determinará o quão rigoroso você é com sua política de curso. Agora, depois de fazer tudo isso, eu não vou descer para configurar. E eu vou deixar o nulo que fez deve usar as políticas do curso. Então, bem aqui, eu só vou dizer usar núcleos. Lá vamos nós. E então ele vai dizer, ok, ele faz algumas sobrecargas. Vou dizer o nome da apólice C. E então, apenas colocando aspas,
é um velho ditado, ok, qual é o nome da apólice? Então o nome da apólice como eu acabei de delinear em cima é política grosseira. Então talvez você possa torná-lo um pouco mais informativo. Você pode ver um baixo. Certo, porque é só isso que está fazendo. Esta política está nos permitindo, eu vou dizer usar a política que diz olá. Tudo bem, então é para isso que a política é realmente para. Então, nesta situação, não
fomos ver completamente os benefícios disso. Mas, em seguida, se você fez qualquer outro projeto onde você tem a API e, em seguida, você tem um projeto totalmente diferente, que é os projetos do cliente, que significa que ele está sendo transmitido em um endereço IP diferente da nossa porta, do que o projeto API atual. Uma vez que eles tentaram falar, isso não funcionará até que você tenha essa política em vigor.
11. Analisar e adicionar mudanças no GitHub: Bem-vindos de volta, rapazes. Neste curso vamos adicionar ou citar o controle de código-fonte e todo o controle de código-fonte é uma ferramenta maravilhosa que é usada para nos ajudar a manter o controle de todas as mudanças que estamos fazendo em um aplicativo. Ele também nos ajuda a trabalhar bem em equipes porque em vez de ter 34 versões diferentes de um projeto, o repositório de controle de origem atua como uma área de armazenamento central para todos. É uma assinatura para verificar alterações Ian comparar com outros, resolver conflitos e muitos outros benefícios. Então vamos configurar nosso controle de fonte para o nosso projeto. E depois de concluirmos cada módulo vai apenas ir em
frente e verificá-lo e certificar-se de que temos árvore
consistente de todas as grandes mudanças se encontram em nossos projetos à medida que avançamos. Portanto, nossa ferramenta de escolha é o GitHub, que é nulo que a Microsoft possui. Então isso o torna uma ferramenta maravilhosa. Fácil integração em tudo é maravilhoso sobre o YouTube. Ele também nos permite hospedar projetos publicamente outros
possam vir junto e ver seu trabalho e nos ajudar, ele nos ajuda a construir um portfólio de projetos para ser usado até mesmo para nosso próprio currículo. Então, se você ainda não tem uma conta do github, você pode ir em frente e clicar em Cadastre-se. É muito fácil criar um que você só precisa de um nome de usuário, endereço de
e-mail e senha, e alguma verificação e então você está dentro. Então eu já tenho médico e então eu vou em frente e assinar. E eu só estou dando uma prévia da minha página web. Você vê que o repositório está à esquerda do que as pessoas que seguiram. Dá um bom feed de notícias sobre o que as pessoas estão fazendo ao longo do caminho. Quem está seguindo seu QI e os seguiu. E é apenas uma ferramenta maravilhosa para criar um relacionamento com outros desenvolvedores e comunidade de código aberto geral. Agora voltando aos nossos projetos, o que vamos fazer é apenas adicionar esse controle de fonte. Então, a maneira mais fácil de fazer isso é olhar para baixo para o canto inferior direito e você vê que adicionar ao controle de origem. Então, se clicarmos nisso, você verá gets e o que acontece é que você tem uma versão do Git em seu computador, mas então também podemos sincronizá-lo com o GitHub. Então, uma vez que você fizer
isso, ele vai dizer, ok, enquanto o caminho local por favor entrar, você disse é o destino principal. Então, como eu disse, é propriedade da Microsoft. A integração é muito fácil. Então você pode ir em frente e entrar em silos, adicionar meus cones GuitarBot, e eu já lá segundo está autorizado. E uma vez que isso é bem sucedido, eles tinham acabado de voltar ao Visual Studio. E você vê apenas sentir carga tudo. O nome do repositório, você pode adicionar uma descrição alguém para ver que esta é uma API Web educacional criada usando o.NET Core 5. Então alguém tropeçou nele. Eles vão chegar a um pouco apenas de coisas. Oh, isso é o que alguns parafusos. Não, eles permitem repositórios privados. Certo. Então, se você está trabalhando em um projeto escolar ou algo que é confidencial, eu não quero que o mundo seja capaz de acessá-lo. Vá em frente e deixe esse estado simulado. Caso contrário você está na multa. Então eu queria compartilhar isso com vocês. Deixe-o marcado e, em seguida, ele irá mostrar-lhe que este será o link direto para o repositório. Então, eu vou apenas ir em frente e clicar em Criar e empurrar. E uma vez que isso é feito, eu vou voltar para o GitHub e Trend View it. Não, você pode encontrá-lo facilmente aqui eu tenho alguns repositórios à minha esquerda. Então o que eu vou fazer é clicar na minha imagem de exibição, ir para seus repositórios, e então eu vou ver todos eles listados tipo de na ordem em que eles foram atualizados pela última vez, certo. Aqui está minha lista de hotéis e todos nós estamos aqui, OTA listando os controladores, tudo em que trabalhei. Então estas serão as primeiras galinhas. Então, como eu disse, ele mantém fora de todos os commits. Toda vez que fazemos uma mudança, podemos ir e ver o que exatamente foi feito. E este foi o primeiro commit, então não tivemos que adicionar uma mensagem, mas mais tarde você verá que podemos adicionar mensagens para que possamos anotar cada vez que pegamos código e dizer, isso é o que aconteceu nesta versão. Então, com isso feito, concluímos esta primeira fase de colocar nosso aplicativo no controle do código-fonte. Você pode ir em frente e adicionar um Leia-me para que as pessoas recebem alguma quantidade de instrução a menos que o todo Para usar o seu projeto. Se é algo que está lá para cada n alguém usar.
12. Implementar aulas e Entity: Bem-vinda de volta. Nesta lição, vamos começar a configurar nossas classes de dados. E por extensão ou banco de dados que estaremos usando Entity Framework, que é Microsoft.NET núcleos flagship Object Relational Mapper ou ORM para abreviar. E eles nos permitem realmente modelar ou classes de
banco de dados são nossas tabelas de banco de dados em vez de classes C-sharp,
e, em seguida, projetar nosso banco de dados com base em nossas definições de classe. Então o que vamos fazer para começar as coisas é criar uma nova pasta em nosso projeto. Então, basta clicar com o botão direito do mouse, vá para adicionar e clique em Nova pasta e vamos chamar isso de beta. Agora, dentro de dados, vamos começar a colocar em nossas aulas. Então, nossa lista de hotéis ou bem, APA vai realmente, apenas para fins educacionais, ter
apenas duas aulas ou duas mesas, uma para o país e uma para a caixa inteira. Então, basicamente, quando olhamos para o nosso país, devemos ser capazes de ver todos os hotéis que estão associados com o referido país. Essa é basicamente a ideia que vamos buscar, certo? Então eu vou apenas ir em frente e clicar com o botão direito do mouse em dados, clique em Adicionar. E a nossa primeira classe será o país. Então note que vou nomeá-lo de uma forma singular, país. O próximo seria Hotel. Então, cada classe representa uma unidade, país e um hotel. Antes de começarmos a definir os campos para qualquer um deles, eu só queria colocar todos os arquivos no lugar e então nós podemos apenas trabalhar nosso caminho de volta e ver como tudo está ligado. Então, depois de termos definido nossas classes, pelo
menos esses dois, eu queria apenas ir em frente e criar o que chamamos de nossa classe de contexto de banco de dados, certo? Então eu vou chamá-lo de contexto de base de dados. E vá em frente e adicione isso. E então essa classe realmente vai representar nossa ponte entre nossas classes definidas ou
nossas classes de entidade e o banco de dados real. Então país, essa é uma entidade que vai ser transformada em uma mesa, certo? O que quer que definamos como campos em breve voltará e fará isso. Mas o que sentirmos que colocarmos no país
será campos em uma mesa chamada seja lá o que for pego. Então vamos chamar os países da tabela, porque a tabela é efetivamente uma coleção de registros do tipo país. O mesmo vale para o hotel, eo mesmo vai para tantas outras entidades barra tabelas como você pode ter que definir. Então isso é tudo o que vamos chamar de
engenharia de código primeiro onde nós realmente escrevemos todo o código para um corredor, acho que nossas mesas devem olhar. E, em seguida, avançar engenharia nosso fazer ajustes para a tabela em conformidade. Então, depois de criar esse contexto de banco de dados, precisamos tipo de equipado com coisas que ele precisa saber que é a ponte para o banco de dados. Então, a primeira coisa que ele precisa saber é que ele herda do contexto de banco de dados. Não, isso vai dar um erro porque eu preciso ir buscar algumas ferramentas. Mas quando eu controlo pontos. Você verá o Visual Studio sugerindo que você instale o pacote ausente,
que é o Microsoft dot Entity Framework Core. Se você não estiver vendo esse aviso, SEM problema. Você sempre pode clicar com o botão direito do mouse no projeto obtido, gerenciado New gets, e então você pode procurar o mesmo pacote, basta ir para navegar e digitar o nome do pacote e você iria vê-lo listado lá. Então pensei em trabalhos, mas enquanto estou aqui, vou pegar todas as bibliotecas daqui. Isso é que eu sei que vou precisar, então eu definitivamente vou precisar desta biblioteca, então não carregue essa. E, mais uma vez, eu sei que definitivamente vou precisar do driver para o SQL Server porque usaremos bancos de dados do SQL Server. Dito isto, existem outros para
outro motor de banco de dados para que você possa usar uma luz de sequela. Você tem, eu vi postgres não vendo listados aqui, não imediatamente, mas eles estão todos aqui. Então, vamos usar o SQL Server. Então eu vou em frente e pegar aquele. E o último que estamos recebendo, pelo
menos para este período, é o conjunto de ferramentas porque precisamos das ferramentas para poder executar alguns comandos no futuro. Então eu vou em frente e instalar esse também. Tudo bem, então agora que terminamos em New gets, se aqueles salão para verificar e instalado, se você limpar o filtro, você vai ver tudo o que você instalou. Isso é bom. Então eu vou voltar para meu contexto DB e, em seguida, eu fui para o controle e pontos novamente e, em seguida, o prompt, NO gene ainda inclui a instrução usando porque já temos a biblioteca neste ponto. Agora dentro de um repositório distante, bem, desculpe, ou contexto de banco de dados, o que precisamos fazer é definir um construtor. Então eu vou ver o contexto do banco de dados público, ou eu poderia ter acabado de ver Tar tub, tub. Lá vamos nós. E então eu vou tomar as opções de contexto de banco de dados parâmetro. Então, isso será transmitido a partir do plugue de inicialização. Nós definimos tudo isso ainda, então estamos apenas ajustando. Escrever nulo. E então a água que eu preciso fazer é também inicializar o controlador base, desculpe, um construtor para o contexto DB tomar as mesmas opções. Para não, não precisamos colocar mais nada dentro
do construtor para que possamos deixar isso em branco e seguir em frente. Então eu disse que isso representa a ponte entre nosso aplicativo em nosso banco de dados. Então é aqui que nós realmente
listar o que o banco de dados deve conhecê-lo quando ele está sendo gerado. Assim, em termos mais curtos são termos mais práticos. Eu queria dizer que um conjunto de banco de dados público dar dados deste banco de
dados, tipo de dados, que neste caso poderia ser país. E então eu vou dar o nome da propriedade, que seria países. Então o nome que você daria aqui é o nome que o banco de dados usará. Então o tipo de dados, tanto quanto C-sharp é Gunter, em causa é o país. Mas então o banco de dados vai. Defina uma tabela chamada países e sempre que estamos acessando ela irá acessá-la como países. Então isso é uma coisa menor. Quero dizer, todo mundo tem suas próprias convenções de nomes sobre as pessoas usam uma letra comum para seus nomes de tabela. Eu não gosto de fazer isso. Eu gosto de manter meus nomes de tabela plural e o tipo de dados singular porque este é um país e o que faz uma coleção de países depois de agosto é que dB? É um conjunto de países, não importa como você queira justificá-lo, essa é a minha justificativa. Mais uma vez, o contexto governa tudo. Então eu vou fazer o mesmo para hotéis e hotéis. Depois de fazer tudo isso, precisamos deixar nossas coisas perturbadoras sem cadeia de conexão. Assim, a cadeia de conexão é basicamente apenas como o nome sugere, como string, que todas as linhas furam para chegar ao banco de dados que o aplicativo precisa se conectar. Então, o que eu vou fazer aqui é criar uma nova seção e ver que ela é automaticamente dar-lhe uma cadeia de conexão, certo? E lá dentro eu vou chamar isso, vamos chamá-lo de conexão SQL. E conexão vai ter Server igual e temos banco de dados local que é tipo de incorporado no Visual Studio. Então, neste ponto, você pode ter seu próprio banco de dados que você deseja usar. Se, se não, você é um iniciante e está apenas acompanhando-os, você pode usar esse que é padrão para fazer muito mais instalação, na verdade, ele já está incluído com sua instalação do Visual Studio. No entanto, neste ponto, se você tem como um servidor SQL localhost começando com um endereço IP, isso é o que você colocaria em como um valor de servidor em vez do que eu tenho aqui. Tudo bem, mas continuando, também definimos nomes de banco de dados. Então o banco de dados que devemos procurar barra criar, eu vou chamá-lo de listagens de hotéis. Listagem de fotos na pontuação dd. Certo, então esse é o nome do banco de dados que eu
gostaria de interromper nesse servidor. E, em seguida, apenas mais uma opção muito importante são relativamente importante que é a segurança integrada. E vou dizer que é igual a verdade. Então isso é tudo para a nossa cadeia de conexão. Isso parece. Então tudo se juntará depois de um tempo. Estamos apenas fazendo isso pouco a pouco, construindo até quando tudo está integrado. Então, nosso próximo passo é passar para uma startup. Então eu disse que quando definimos um contexto, está recebendo
suas opções a partir da inicialização. Portanto, a inicialização precisa saber que quando o aplicativo é iniciado, ele deve estar carregando sua configuração
de banco de dados a partir daqui e usando este arquivo como a violação. Certo, então o que vamos fazer é adicionar uma nova seção. Na verdade, podem ser só três. Eles estão submetendo alma? Gosto de adicionar controladores como último ou próximo da última coisa que faço em configurar serviços. Então eu gostaria de fazer tudo o resto antes. Eu adiciono controlador para que você possa simplesmente ir em frente e mover essa linha. Então serviços ponto DB contexto. Certo, então eu chamo de contexto de banco de dados. O código, as funções é, ele está procurando por contexto DB. E, em seguida, o que levou picos é algo do tipo de contexto de banco de dados. Então este é do tipo de contextos de banco de dados. Este é o meu contexto de banco de dados. Isso é eu estou criando alguém,
vamos passar isso como esse tipo de dados está procurando, é
claro, incluindo quaisquer referências faltantes. Lá vamos nós. E então aqui estão as opções de peças. Então aquele inicializador lambda que já estava acostumado ou não é estranho para nós por nulo. Então, para opções, eu vou dizer usar o SQL Server. Tudo bem, e lembre-se que quando você obter esses
snowadd intuited que as bibliotecas do SQL Server, se eu apenas controlar pontos, você vê aqui ele vendo incluir a instrução de uso, tudo bem, então use o SQL Server. E então ele vai querer saber K. Então, de onde estou obtendo a configuração? Então eu vou dizer configuração. Obter sua cadeia de conexão, cadeia de conexão. Lá vamos nós. E então isso também quer ir. Eles vão olhar para as configurações do aplicativo. Então ele diz dar cadeia de conexão porque ele já sabe que pode
haver uma seção para cadeias de conexão. E estou dizendo para pegar a cadeia de conexão com esse nome. Então você pode realmente definir várias cadeias de conexões aqui você só precisa de uma vírgula, separá-los, e cada um precisa ter seu nome exclusivo. E nesse ponto, você poderia configurar de forma diferente. São contextos óbvios para necessidades diferentes. Nossas bases no aplicativo CME, que poderia ser útil se você é API precisava da extensão de vários bancos de dados. Então, há uma série de benefícios em ter uma API
porque não se limita a uma ação é baseada em um conjunto de interações, certo? Então, obtenha cadeia de conexão. Vou em frente e passar em nome fechando todas as chaves que precisam ser fechadas. E Farnell, acredito que temos tudo mais tarde. Voltaremos e modificaremos este. Precisamos de outras funcionalidades adicionadas, mas sem ponto-e-vírgula extra. E lá vamos nós tão longe, não, temos tudo o que precisamos. Agora, antes que eu vá mais longe, eu vou apenas dobrar para trás e nós vamos completar nossas definições de classe. Então temos hotel e temos país. Tão country. E eu só vou dizer banheira, banheira vai ter uma identificação. Assim, estruturas de entidade é, se você criar um campo chamado ID, assumir
automaticamente que esta é a chave primária. Tudo bem, então você tem duas opções. Você pode ver ID ou você pode dizer o nome da entidade, ID. Ele vai dizer automaticamente, OK, bem, eu vou apenas usar isso como uma chave primária. Tudo bem, então identifique bem ali. Essa é a chave e digamos que o país também tem nome. Então nome do país e mais um slide. Use o controle D para duplicar essa linha. E vemos Talvez área ou nitidez. Isso é apenas em breve. Então, no meu caso, a primeira escultura que eu colocaria em sua Jamaica e o nome abreviado seria j m. E então baseado no país, claro que o nome curto é diferente, certo? Então esses são os campos que espero que a tabela de países tenha quando o banco de dados é gerado. Então eu vou salvar essa e eu estou disposto a olhar para o hotel No. Então, para começar, podemos pegar e nomear porque, quero dizer, temos que ter a chave primária. Cada buraco tem um nome, mas então eu tenho alguns outros campos aqui,
incluindo endereço, que é string, a classificação que é um duplo,
e, em seguida, referência chave estrangeira para o nosso país. Então deixe-me explicar isso. Então, se você souber sobre bancos de dados, você sabe que a chave primária é um identificador exclusivo para qualquer tabela específica. A chave estrangeira representa referência única ou pode não ser única, mas é uma ferramenta de referência forte. Outro recorde em outra tabela. Em outras palavras, qualquer hotel tem que estar em um país. Então nós temos o hotel, nós damos o nome, o endereço, a história, comer, mas então nós informamos. Nós, nós damos um ID aqui que corresponde a um ID de país. Certo, então temos que definir dois campos. Temos na anotação de dados aqui. Então quadrado, onde é chave estrangeira e você dar-lhe o nome que você quer. Então você poderia realmente dar este campo de chave estrangeira com um nome diferente se você quisesse. É igual a colocar manualmente em seu nome ou neste caso, eu só vou dar o mesmo nome que a classe que está se referindo. Então diga o nome de qualquer classe, certo? Então temos duas propriedades. Temos país como um objeto
e, em seguida, temos ID do país como um inteiro. Então Id país é a referência mais difícil que é o ID valorizado na ferramenta faz três et cetera. Quem quer que o país represente os objetos reais. Então podemos incluir todos os detalhes aqui. Quando olhamos para um hotel, se quiséssemos saber o nome do país,
tudo o que temos nativamente dentro do Hotel é o ID do contêiner. Mas então podemos preencher este objeto com todos os detalhes. Então, podemos dizer Hotel dot country, dot qualquer propriedade que é que queremos incluir em nosso beta. Então esta é uma maneira agradável e fácil de Juan cria uma referência chave estrangeira para outra tabela. E para ter certeza de que quando puxamos uma consulta para uma tabela que tem chaves estrangeiras em todo o lugar, podemos incluir todos os detalhes aqui mesmo sem escrever muitas junções internas bagunçadas e ter que saltar através de aros para ser incluído. - Ele. Então, agora que temos todos esses detalhes definidos, deixe-me apenas fazer uma análise rápida apenas para ter certeza de que estamos todos na mesma página. Temos a nossa pasta chamada dados em que vamos estar armazenando todos os domínios de pagar ou objetos relacionados ao banco
de dados e puxado tudo o que será armazenado dentro desta pasta chamada beta. Mais tarde, podemos olhar para talvez colocar em em seu próprio projeto. Mas para nulo, são apenas três arquivos que são um pequeno número de solo, não
precisamos fazer tudo isso. Então os dados têm um arquivo chamado País, que está definindo a tabela do nosso país. E um chamado Hotel, que está definindo a mesa do hotel. Nós também temos o contexto de banco de dados, que está herdando de contextos BB cortesia de Entity Framework Core, que está mais uma vez atuando como nossa ponte entre já em classes e o banco de dados real. Tudo bem? Como é que chega à base de dados? Bem, primeiro, temos a cadeia de conexão que define onde procurar, o que procurar e sim, procurar sua segurança, certo? Então essa é a nossa cadeia de conexão. Caso contrário, na inicialização, queremos adicionar o contexto de banco de dados ou adicionar essa ponte ao banco de dados cortesia desse arquivo. E este arquivo deve estar usando essa cadeia de conexão. Ok, desculpe, eu só tinha uma cinta extra, apenas removi-a. Tudo bem, então vamos fazer uma compilação rápida antes de prosseguir para a engenharia do nosso banco de dados. E fazer uma construção. E você pode segurar Control Shift e pressionar B, ou você pode ir para construir aqui e construir solução. Mas temos um projeto de lei bem sucedido. Então vamos para o console do Gerenciador de Pacotes. Se você não estiver vendo lá, você sempre pode acessar as ferramentas e o novo gerenciador de pacotes e o console do Gerenciador de Pacotes. Tudo bem, então aqui é onde o Entity Framework Core dot Tools Library vem a calhar porque nos permite executar certos comandos aqui para facilitar o andaime. E isso é o que se chama arrastado para o banco de dados, ler a geração do banco de dados. Temos que executar certos comandos. Então, o que temos que fazer é primeiro adicionar ao que chamamos de migração, diz isso, adicionar migração traço. Se você começar a digitar uma guia de imprensa, ele será uma espécie de preenchimento automático. E então eu vou dizer criação, vamos dizer banco de dados criado. Tudo bem, então nós adicionamos migração, B2B é criado. Então isso é basicamente vai gerar como manifesto ou um arquivo preliminar para ver que ele está gerando e CM recebendo um erro. Então isso é bom. É bom quando vemos essas flechas e trabalhamos através delas porque, às vezes, quando passamos perfeitamente, não
sabemos qual é a minha cobertura. Esta seta tem a ver com a propriedade rural na classe do hotel. E acredito que isso nos diz a ordem. Então o que eu fiz foi reordená-lo. Por isso tive a ideia debaixo da propriedade. Isso é o que parece inicialmente. Então eu só vou reordenar pegando a propriedade, a propriedade inteira, e colocando-a diretamente abaixo da anotação para uma chave estrangeira e movendo isso não. E assim como você pode ver, pode ser sensível nossos tomates com algumas coisas. Então vamos ver se isso funciona. Só vou reexecutar este comando e a migração. E estamos tendo uma vibração completamente diferente onde está vendo o moinho começar com sucesso. E isso é neve suficiente que você quer desfazer fim de semana em torno disso, o que significa que foi feito certo? Então aqui temos nosso arquivo de migração e, em seguida, vemos que temos uma nova pasta chamada Migrações. E o que ele faz é tirar instantâneos de cada instância do banco de dados. Então, neste ponto, estamos definindo nossos países de tabela com esses atributos de coluna e essas propriedades. E se você olhar, se você olhar para ele de perto, eu não quero que a analisemos muito porque pode ser esmagador. Mas se você olhar para ele como alguém que está familiarizado com a linguagem C afiada, você percebe que ele não está vendo nada fora do comum. Vendo que temos uma tabela ou onde criar uma tabela, escreva o nome dela é países com base no que definimos no contexto DB, certo? Países, que as colunas na tabela devem ser id, que é coluna do tipo int. E estamos definindo como identidade para incrementar por um. Tudo bem, isso é tudo o que realmente está fazendo. Nome é uma string que deve ser definida como invar char, porque
em, no SQL Server, uma string é realmente invar char e short_name invar char, certo? Ali. Podemos ter controles que podemos colocar nosso tamanho “Talvez Day “e se for anulável, certo? Mas então essas são coisas que podemos olhar mais tarde. No entanto, em última análise, vemos aqui que temos a nossa migração. E parece bom. Então o próximo passo seria realmente criar o banco de dados. Tudo bem, então o que vamos fazer é voltar para o nosso console do Gerenciador de Pacotes e rho e atualizar o banco de dados e dar alguns. E, em seguida, quando for feito, ele vai apenas AGORA com um simples feito. Então, como vamos verificar? Vá verificar. Assim, você pode ir para o SQL Server Object Explorer. Eu tenho aberto aqui. Se você não quiser tê-lo. Lá você vai para Exibir e você escolhe SQL Server Object Explorer. Então, no Explorador de Objetos do Servidor, vamos para o servidor que eu disse que foi incorporado no Visual Studio, que é barra de banco de dados local MS SQL, banco de dados local. Tudo bem, então você pode expandir isso, ir para bancos de dados e, em seguida, você verá o banco de dados listado lá, listagem de hotéis DB. E quando fizermos o empréstimo do Andrew, verão os nossos países. Você também verá que eles estão rastreando todas as migrações acontecendo. Então, cada vez que fazemos uma mudança na classe que diz, alguém veio e disse tudo, precisamos estender o país, precisamos colocar em código de discagem,
certo, ou área de código, o que quer que seja, então você adiciona um novo campo, você cria uma nova migração, você atualiza o banco de dados, você criará mais um 5A. Isto para dizer que esta é a mudança deve ser feita e, em seguida ,
atualizações obviamente irá em frente e fazer essas alterações em seu nome. Isso é bom em um ambiente de desenvolvimento, em um ambiente de produção, nem tanto. Haveria muito mais controles em espera. Atualizações para o banco de dados são manipuladas. Comprou Farnell, quando estamos construindo do zero, é bom entender todo para fazer isso de forma eficiente. Então é isso para não, o que fizemos hoje foi definir nossas classes de dados são classes de domínio. Nós configuramos nosso contexto de banco de dados. Fizemos tudo isso do zero. Tudo bem, e isso é bom. É bom entender como tudo clinica. Então nós temos o contexto do banco de dados, as classes ou os conjuntos de banco de dados, e memes respeitados, eu me lembro do que você chama as propriedades aqui, isso é o que a tabela será chamada. Se você precisar desfazer a migração, isso se torna um pouco complicado. Porque se você apenas fizer uma migração de remoção, você receberá uma seta onde ela informará que a migração já foi aplicada. Então você teria que reverter essa alteração para o banco de dados em um todo, que já que ele está nos estágios do Yom, você poderia muito bem apenas, você poderia realmente apenas ir em frente e excluir o banco de dados, pode obter alterações, criar um nova migração e fazer um banco de dados de atualização, certo? Então, se você não precisa do banco de dados, então Entity Framework não estará apenas dizendo que algo foi aplicado, então eu preciso ser avaliado não lá, ele permitiria a migração inter move. Você pode obter alterações em qualquer classe do que você faz tudo novamente, adicionar migração, atualizar e, em seguida, ele iria combinar o banco de dados com alterações de IA. Caso contrário, se não for tão grave quanto a migração, você só queria adicionar ou remover algo. Vá em frente e faça suas alterações em suas classes de domínio de acordo. Em seguida, você adiciona migração, banco de dados atualizado, e ele terá um instantâneo mais uma vez em cada ponto. Então, quando voltarmos, vamos olhar para o fim de semana inteiro c, d, eta para as mesas. Ou seja, quando a migração acontece, nós apenas colocamos dados antes mesmo entrar na API porque é bom ter dados de teste lá antes de começarmos a colocar dados através de nossos testes reais da API.
13. Dados de semente em tabelas: Ei pessoal, bem-vindos de volta. Então nesta lição vamos passar por um processo chamado semeadura. Então semeadura é onde fornecemos alguns dados iniciais para o banco de dados. E o que realmente vamos fazer é apenas codificar alguns registros que quando realizarmos uma migração depois, a migração terá instruções que criam esses registros. Fiz o banco de dados com esses registros. E não dependerá necessariamente da entrada do usuário. Então, pelo menos, isso fornecerá uma boa base para nossos testes quando começarmos a desenvolver os endpoints da API. Então o que queremos fazer é ir para nossos contextos de banco de dados e vamos substituir um método protegido que está realmente dentro dos contextos de banco de dados. Tão protegido no vazio na criação de modelos. E estamos passando o parâmetro ModelBuilder e eu estou apenas chamando de construtor. E então o que veremos são alguns pontos do construtor do laboratório em dy. E então eu tenho que especificar qual entidade eu estou lidando com soul. Temos países de hotel web contrários auto para existir, para hotéis para existir. E isso é realmente por causa de como definimos nossos cartões vermelhos, certo? Então ele disse o contrário e no hotel tem uma chave estrangeira, então temos que ter o contrato antes que possamos colocar essa chave estrangeira. Então vamos apenas dizer Entidade, país ponto tem dados. Oh, me desculpe, eu estou perdendo um par de raquete lá. Certo. Então entidade contrária. E, em seguida, abrir e fechar chave tem os dados ITER, desculpe, abrir e fechar chave. E, dentro disso, vamos definir um pouco de consciência. Então, podemos definir como muitos porque ele leva um array, então ele tem o, ele realmente leva uma matriz do tipo país. Então podemos definir alguns registros aqui. Então, vou definir três. Tudo bem, então novo contrário necessário com ID é igual a um. E mais uma vez, estamos colocando os dados para
que tenhamos que fornecer manualmente todos esses valores. E este é o primeiro decisivo que estou iniciando e o nome curto é
JM. E eu só vou copiar isso e colá-lo. Meio que reduz a digitação. Então este será dois e este seria três. E o próximo, vamos ver, Bahamas. E o nome abreviado para Bahamas, se não estou enganado, é B, S. E então o próximo seria Ilha Cayman. Alguns não escolher algum destino, alguns destinos turísticos populares onde você
provavelmente gostaria de saber quais hotéis existem, certo? Então o nome abreviado para Ilhas Cayman seria CI. Tudo bem. Se eu não sou tão preciso, então mais tarde podemos adquirir um livro infantil para nulo. Mais uma vez, estes são registos isentos, certo? Então fiz isso pelo país. Eu só repito que se alimenta para os hotéis, certo? Então eu sou apenas, eu apenas copiei MPI, é que a maioria do código. E observe que quando eu mudar isso para hotel, ele vai mudar os parâmetros esperados para digitar hotel ou se ele está vendo objeto porque ele não está recebendo hotéis aqui. Então, tudo bem. Vamos mudar essas fotos antigas. Tudo bem, nome de identificação. O que mais tínhamos para o endereço do hotel? Então deixa-me ver isto. Então este é um desses resorts no local. Então não estou familiarizado com alguns deles. Vestido nos permite mantê-lo curto e C e a grelha. Já conhecemos o país. O país é Jamaica subcultura ID seria um. Tudo bem. E então a equipe de ataque é a última. Ouvi dizer 4,5, mas sei que é um resort de cinco estrelas. Então eu vou apenas copiar esses detalhes, não faça isso. Tudo bem. Temos um hotel para a Jamaica. Quero dizer, basta colocar um hotel por país só para ter certeza de que estamos espalhados. E vou inventar algo para Sunda, nas Bahamas. Então, Bahamas, digamos que eles têm Grand Paladium. Sei que Grand Palladium é um hotel na Jamaica. Mas, por exemplo, doentios, estamos colocando lá ou colocando em sua própria polícia, sinto muito. Portanto, esta deve ser uma ferramenta country, deixe-nos fazer isso. E isso é um quatro estrelas. Mais uma vez, isso não é treta para fazer dados abertos, certo? Então, para homem das cavernas, eles têm assentos confortáveis. E os juristas, digamos George Tone, o crachá é 34 homens das cavernas e eles comem 4,3. Tudo bem. Então isso é um ceder alguns dados para o banco de dados para que isso possa ficar corroído. Você simplesmente desmoronaria assim. Então não ocupa muito espaço. Ou o que eu costumo fazer também é realmente movê-lo para abaixo das definições do conjunto de banco de dados. Para que quando eu venho fazer modificações nos conjuntos de banco de dados, eu sempre possa empilhá-los no topo. Eu não tenho que percorrer todo o caminho além disso. Há maneiras de extrair isso pode não assuntos e chamar as configurações também. Mas então isso é apenas uma vitória rápida, uma maneira rápida de ver os dados no banco de dados. Então, agora que definimos alguns testes para registros, a próxima coisa que queremos fazer é adicionar migrações. Então, estou disposto a migrar. E este aqui nós vamos chamar isso de dados cedidos, certo? Então note que cada morte de migração ADA e eu tentei ser descritivo o suficiente com o nome tal que você pode dizer, oh, isso é o que aconteceu naquele momento. Então é quase como o controle de fonte para os dados, certo? E se você olhar para este, este arquivo de migração, você realmente verá aqui onde ele diz inserir dados nesta tabela. E estas são as colunas, e esses são os valores de dados, certo? Então vai em frente e fazer tudo isso, certo? Eu não sei por que eu virar meu quatro pontos três para 4.299 e não sei por que, mas é assim que ele vai ser reformatado para que ele possa fazer as inserções. Então a próxima coisa que queremos fazer é atualizar o banco de dados para que um possa efetivamente executar os comandos na migração. Então ele fez disse feito. O que eu queria fazer é voltar ao meu Explorador de Objetos e, em seguida, vou clicar com o botão direito do mouse. E V estaria na mesa do país. E lá vamos nós. Temos dados em nosso banco de dados, então criamos com sucesso ou três países. E podemos olhar para os hotéis correspondentes. Tudo bem, então é assim que você pode colocar dados iniciais em seus
aplicações.NET principais usando Entity Framework Core e o contexto de banco de dados.
14. Configurar Repositories e injeção de dependência: Bem-vinda de volta. Então, em nenhum lugar no ponto de criar nossos repositórios e o que estaremos implementando é o padrão de desenvolvimento realmente. Então deixe-me apenas dar um pouco, mas crescer e nós para o porquê de nós precisamos passar por isso. Quando estamos fazendo nosso trabalho com nossa API, é fácil apenas escrever as consultas usando Entity Framework, Core e link. E nós apenas escrevemos especialmente como balão. Eles têm duas mesas que lutam com o qual o nosso país e todo Ito. Bem, o que acontece quando temos mesas 891020? Torna-se meio tedioso tentar escrever consultas cada vez que temos uma tabela e, em seguida, isso vai levar à repetição. E então, se tivermos a mesma consulta vários lugares, então isso é um pesadelo de manutenção, R3. Então é por isso que vamos implementar um padrão. E vamos usar o padrão de Repositório genérico ao lado da ferramenta padrão de valor ONU tipo de cria um contêiner para definir a funcionalidade básica que será compartilhada em todas as nossas tabelas e todas as nossas operações de banco de dados em nosso projeto. Então, para começar, vou criar duas novas pastas. Um seria chamado i, i repositório e o outro será chamado repositório, certo? Então temos eu repositório. E isso vai ser um I. maiúsculo e então vamos ter outro que eu vou chamar de repositório. Portanto, há um conceito chamado separação de preocupações, onde você vai querer ter certeza de que você está sempre arquivado sabe que ele está fazendo uma coisa. Então é por isso que nos certificamos de definir duas classes diferentes. Para isso, vamos definir uma quantidade de classes individuais ao longo do caminho do que eles queriam ter certeza de que certas coisas são genéricas não estavam repetindo certas coisas, certo? Então, em nosso repositório de olhos, vamos criar uma interface. Alguém cria uma classe porque isso é rápido. Mas vou chamá-lo de repositório genérico. E vá em frente e clique em Adicionar. E eu só vou mudar para a interface. E se escolherem a interface, ficaremos bem. A única coisa é que você tem que se lembrar de colocar em público, certo? Então essa é a outra razão que eles são utils classe foi esquecido de colocar em público no passado e que não conseguia entender por que eu estava recebendo a flecha está recebendo. Então essa é a minha pequena segurança baseada na minha experiência. Então o que vamos fazer é fazer este repositório genérico tomar um parâmetro genérico e na forma de t, onde t vai ser uma classe. Tudo bem? Então eu vou falar sobre genéricos. Isto só diz, bem, estou preparado para fazer qualquer tipo de aula que você mandar para mim. E isso nos ajuda na criação dessas operações de abelhas para diferentes situações com diferentes tipos de classe. Tudo bem? Então o primeiro que vamos criar uma função chamada obter Sowell recebe. Tudo bem, então eu vou dizer a tarefa I, lista do tipo T recebe, tudo bem, e então eu vou estar definindo certas coisas. Então deixe-me explicar exatamente o que está acontecendo neste cabeçalho de função. Então tarefa, enquanto estamos lidando com uma programação síncrona, temos que usar presas se você está recebendo uma seta, porque você não quer ter aquela biblioteca que está destacada lá. Que pontos, você sabe, você só faz ponto controlado e vamos em frente e em usar declarações. Então a tarefa I, uma lista do tipo t, mais
uma vez genérica e o nome SHA-1 completo é obtém tudo. Então, obtém tudo tem um parâmetro para o qual eu vou incluir a referência ausente, que é de tipo, expressão, função e expressão, e estamos tornando-o um parâmetro opcional. Ele também vai levar e eu consultável, I questionável do tipo T, Eu pedi querable. Tudo bem, então você pode apenas reescrever os hábitos do Havaí e ordem BY que também é opcional. E então temos a capacidade de incluir se precisarmos. Tudo bem, então eu vou ter uma função de acompanhamento para obter. Então a tarefa T fica, então este vai ter uma lista. Este só está pegando um, certo? Então é por isso que é tarefa t e tarefa desonesta que eu lista. Então este só vai obter um registro e ele está tomando o mesmo parâmetro shun. E ele vai ter o incluir assim por diante onde barcos de pesca, o,
a função real então você vai entender o que o parâmetro é realmente atordoado para. Teremos um Sean formal similar para nossas operações crud. Então eu vou ter tarefa inserir T e T D. Então este vai ser o único para criar. Vamos inserir o alcance. Então eu gosto de manter este aqui perto. Às vezes, sai das duas operações. E em vez de chamar isso várias vezes, você poderia definir um que leva pelo menos e apenas aqueles o pulso. De qualquer forma, temos Delete e chumbo de três polegadas. Tudo bem. E atualize. Mas não gosto de fazer isso. A lesão na árvore no livro, temos a atualização. Então observe que a tarefa que exclui é tarefa, todos esses são pensamentos, mas esses dois são operações nulas. Tudo bem, então é isso para o nosso repositório genérico. Então, mais uma vez, isso está sendo definido como b esboço em não importa qual o tipo de dados, se introduzirmos mais cinco tabelas e um classes de domínio que acompanham, nós realmente não temos que mudar muito aqui porque essas funções
seria bom para lidar com qualquer outra tabela nosso domínio. Custo que passa. Então, sabendo que temos a interface, vou em frente e criar o concreto. Então, qual é o objetivo? O que é uma classe de repositório? Eu sou apenas horários na classe real e eu estou chamando-o repositório
genérico sub i repositório genérico. E não, eu tenho apenas repositório genérico e repositórios genéricos indo para o mesmo genérico T. O que também vai herdar do repositório genérico IEEE onde t é um GAS. Eu só vou para ir em frente e incluir a referência que faltava bem ali. E então ele vai para a empresa não, porque uma vez que nós estamos herdando, nós temos que ter certeza que nós implementamos. Então eu vou apenas ir em frente e implementar a interface. E então ele gera todos esses métodos stubs para mim também gentilmente. Então, deixe-nos frescos. É exatamente o que precisamos aqui. Então vamos ter que fazer isso e não teremos injeção de dependência. Então eu mencionei que, se eu já disse antes, eu não mencionei muito. Injeção de dependência é basicamente o conceito pelo qual
tudo o que carregamos na inicialização está agora disponível aplicativos brancos. Então não precisamos instanciar cada vez que precisávamos. Tudo o que fazemos é fazer uma referência
ao objeto já existente porque ele foi definido em nossa startup, certo? Então, mais contextos cedo demais ou conexão são nossa ponte para o banco de dados. Podemos saber, basta obter uma cópia disso para usar em nosso arquivo aqui em vez de tentar criar uma nova ponte inteira, estão segurando uma instância desta ponte. A alavancagem de Kendall, aquela que existe como resultado de ser incluída no procedimento de inicialização. Tudo bem, isso é, isso é em poucas palavras. O que a injeção de dependência lê nos ajuda a fazer. Então o que vamos fazer é definir apenas uma leitura privada. É privado, só é lido porque eles não precisam fazer nenhuma modificação nele. E vai ser uma instância de base de dados. Contextos. Os direitos incluem quaisquer referências ausentes. Lá vamos nós, privado somente leitura, e eu vou chamá-lo de contexto sublinhado. Tudo bem? E então da mesma forma eu vou apenas duplicar este nove porque eu queria entrar EDL Andy. Eu quero DB set. Lembre-se dv set vindo do mesmo contexto de banco de dados. E vai ser definido para um genérico. Então eu vou apenas ir em frente e incluir a referência ausente lá também o conjunto b do tipo T, e eu vou chamar este um dB. Não, estes são definidos para esta classe. No entanto, a injeção de dependência AGORA exigirá que eu crie um construtor. E ele vai tomar um parâmetro do tipo de contexto de banco de dados. E eu vou mudar na ínsula, o privado como honesto marcou este não faz. E depois de ter tomado esse parâmetro, é não, ele não está acessando o que é a cópia dos lados ou procedimento. Então, para o meu uso local, eu vou inicializar meus contextos atuais que eu tenho minha leitura privada apenas para ser o mesmo valor que o que está sendo injetado. Então isso é praticamente injeção de dependência no caso de ser um mistério para o seu ponto. Sabe, é assim que basicamente funciona. Existem outras nuances para isso. Mas para nulo, não precisa ficar muito mais complicado do que isso. Então o próximo é na pontuação DBE vai ser igual ao contexto embora eu inicializei contextos. Posso dizer contexto, dê-me um conjunto do que quer que seja. E lembre-se que neste ponto, T precisa ainda basicamente correspondem a algo que foi delineado em nosso dB. Sente-se, no nosso DAW é contexto. Tudo bem? Então é por isso que eu posso dizer com confiança, ir para os contextos e me dar um conjunto de qualquer coisa que seja isso. Porque um contexto não deve saber sobre isso quando estamos construindo este repositório. Portanto, saibamos que temos essa parte feita, deixa-nos ir para a nossa implementação. Então vamos fazer a exclusão, que é bastante fácil sozinho ganha. Esta é a entidade var é igual a. E então eu vou, eu vou esperar. Então porque eles estão fazendo programação assíncrona depois de um trigo. Por isso, deitei-me com cuidados. O que eu estou faltando é a palavra-chave assíncrona antes de tudo bem, sempre que você tem uma tarefa que você está indo para estar usando, o it nafta assync, Ok, note quando um clique um, o outro é destacado, Eles andam de mãos dadas. Tudo bem? Então você diz, oh, ele enfatiza DB dot find, e eu só vou encontrá-lo, encontrar assíncrono. Então doutrinate core, desculpe, no Entity Framework ou para quase todas as operações que você tem uma operação assíncrona correspondente. Então, neste ponto, ele está lá, use-o. E se você estiver usando assíncrono, Você tem que precedê-lo com aguarde. E, por extensão, o método em que esta palavra-chave aguarde está sendo usado precisa ter um dissipador nas paradas do método. Então não está na interface, não está na interface, mas na definição. E você tem que ter isso. À medida que escreves mais e mais, vais apanhar o jeito. Então vamos encontrar é afundar e vamos passar na identificação para o registro que queremos encontrar. E então vamos dizer db dot remove. E estamos movendo a entidade que não foi encontrada com esse ID. E isso é tudo para a nossa exclusão. Excluir intervalo é praticamente uma linha. Ele só vai ser o intervalo de remoção de ponto de banco de dados. Então temos uma lista de entidades. Então eu vou dizer db dot, remove, range e removedor e diz, bem, me
dê a lista de entidades. Bem, há as únicas coisas que as entidades simplesmente removem. Tudo bem. É isso para o intervalo de remoção. Então eu vou em frente e meio
que passar pelos mais fáceis. Então inserir é fácil, inserir raiva é fácil e atualizar é fácil. E então vamos voltar para a busca e eles ficam todos porque eles podem ficar mais complicados. Então eu vou apenas prepend cada tarefa no cabeçalho do método com a palavra-chave assíncrona. Aquele é vazio. Eu não preciso assíncrono lá. Certifica-te de que não me deparei com dificuldades mais tarde. Tudo bem, então para inserir que um é bastante simples. Tudo o que vamos ver é um ponto de banco de dados peso adicionar assíncrono, e nós adicionamos a entidade, que quer que tenha surgido como dados nele. É tudo o que precisamos fazer, certo? E, em seguida, semelhança para o intervalo de inserção vão fazer é banco de dados de ponto assíncrono. Então este tem um assíncrono, aviso ou movimento organizar não tinha um assíncrono. Certo. Então, em organizar uma pia e a lista de entidades que você tem que adicionar. E então, para nossa atualização, temos uma operação de duas partes. Um, vou anexar a entidade ao banco de dados. Então, em outras palavras, quando os dados chegam, ele pode não ser anexado ou pode ser um objeto que existe na memória sem conexão direta com o banco de dados naquele momento. Então eu toco significa prestar atenção a isso e verificar se você já tem verificado, se há alguma diferença entre ele e o que você tem no banco de dados porque o wearable para fazer uma atualização, certo? Então ele começa a camionar para ver que, ok, há certos campos que são diferentes. Então estes são dois diferentes, digamos cartões vermelhos, certo? E, em seguida, a próxima linha diria contextos entrada ponto. E, em seguida, nós referência estado ponto entidade é igual para modificá-lo. Assim que dissermos que tudo bem, não foi modificado, então ele saberá disso. Ok, eu preciso fazer uma atualização para ele. Então vamos para o nosso Git. Git é realmente mais fácil de fazer do que chegar a todos. Mas uma vez que você começa, em seguida, obter todos os ômega um pouco mais de sentido. Então, a primeira coisa que vou fazer é ter um olho questionável. Eu queria chamá-lo de consulta do que está no servidor de banco de dados. Mas os DBs já definidos para ser o tipo de dados que estamos lidando, certo? Então ele recebe todos os registros basicamente que estão nessa tabela. Praticamente é isso que isso vai fazer. E depois vou verificar se houve um “inclusivo”. Tudo bem. Havia e inclui requisito, o que
significa que o usuário são fez o código de chamada, quem chamou este GetMethod, eles
gostariam de incluir detalhes adicionais? Então eu disse antes que quando ele vem a um hotel e país, em vez de procurar o hotel e, em seguida, obter o contra ID e, em seguida, chamar o banco de dados novamente para obter o contrato com esse ID. E então isso é dois banco de dados porque você pode fazer uma chamada de banco de dados e nós estamos recebendo o hotel e incluindo o país para que ele irá automaticamente preencher esta propriedade com todos os detalhes de países correspondentes, Certo, então isso é o que isso inclui é longe. Então este trecho de código basicamente diz que se include não é igual a null,
então, por padrão, não é, é opcional. Você não tem que dar valor a eles. Se, no entanto, você optar por colocar o valor dela. Se não for igual a null, em
seguida, para cada propriedade em inclui, eu quero incluir para a consulta qualquer propriedade foi solicitada. Então eles disseram país, então este loop foreach vai correr uma vez. Se você tem cinco chaves estrangeiras e você colocar todas as cinco delas em que inclui isso, então isso vai ser executado cinco vezes, incluindo cada uma. Praticamente isso sempre vai servir. Tudo bem? Portanto, é completamente opcional, mas pode haver momentos em que você precisa incluir em sua Tanzânia não precisa para fins de velocidade, você não quer incluir o tempo todo para uma consulta, para um pouco de informação quando Você não precisava. Então isso nos ajuda a manter o aplicativo
mais rápido do que seria normalmente se incluísse tudo o tempo todo. Em seguida, a próxima coisa que queremos fazer é retornar nosso ponto de consulta de pesos. E depois vou dizer que não há camionagem. Então é aí que entra o negócio do caminhão porque qualquer registro que é recuperado aqui não está sendo rastreado. Cópias tiradas e enviadas para a memória central para o cliente, o banco de dados e em palavras diferentes são realmente terríveis nisso. Então é por isso que eu não aqui nós vemos um toque nele para que nós pegamos aquele disco que não estava sendo deixado cair. Dois estão sendo examinados e eu sempre digo começar a olhar para ele e apenas note que ele foi modificado no momento em que ele chega aqui, ele foi modificado. Então ficamos tão pequenos caminhões. Mas depois disso é o que eu realmente quero fazer é obter o primeiro nosso registro padrão e há um padrão assíncrono de primeira ordem. Lá vamos nós. E então eu posso ver a expressão. Então deixe-me explicar qual é a expressão. Então expressão é definida como Express na função t Boolean, e esse é o nome do parâmetro. Então esses dados que basicamente nos permitem colocar hoje à noite uma expressão lambda porque então uma expressão lambda nos permitiria ver alguns que QI. E, em seguida, o lambda R0 e, em seguida, diria ponto de consulta algo é igual a outra coisa. Então foi por isso que eu disse bool, certo? Qualquer condição. Então, quando quisermos recuperar o cartão de andarilho, qual é a condição que queremos usar para recuperar o Ricard? É por ID, é pelo nome? Então isso permite que ele seja muito genérico e flexível porque então
podemos escrever ou expressões diferentes com base no contexto, mas chamando um método a qualquer momento. Tudo bem, então é isso para o próximo, para o, obter, desculpe. Então o próximo que temos que fazer é pegar tudo. Tudo bem, e obter tudo vai ter todo esse código com alguns ajustes ao longo do caminho. Então, em primeiro lugar, nós não vamos estar olhando para nenhum primeiro nosso padrão. Então deixe-me apenas modificar esta linha da era. Nós temos a consulta osmo caminhão eo número vai torná-lo lista VO2 é afundar. Tudo bem, então é isso, oh, é 1-0. Chamando uma função assíncrona, você tem que precedê-la com ervas daninhas. Tudo bem? Então estamos virando nossa lista. Então vamos analisá-lo para listar em vez de este onde acabamos de obter os primeiros padrões de estrelas? Não, temos o mesmo parâmetro para o Include, mas temos outro para o Ardor Bay. Então eu vou colocar outros pequenos trechos lidos depois. Bem, na verdade, vou colocar trechos de ferramentas. Então, em primeiro lugar, temos a consulta. Então eu vou verificar se havia uma expressão, alguém para filtrar a consulta primeiro antes mesmo de eu olhar para ela inclui. Tudo bem, então eu vou dizer se a expressão não é igual a nula porque nós poderíamos estar procurando por uma lista de cartões vermelhos. Mas queremos dizer que estamos, o país é um sobre o sol. Dê-me a lista de fotos da Jamaica para que pudéssemos colocar
na expressão para ver onde qualquer condição é necessária para especificar da Jamaica. E, em seguida, se não for, mesmo que não seja igual a nulo, significando condição está lá,
em seguida, filtre a consulta para mim por favor. Então consulta é igual à consulta inicial que era todos os registros d2, nós somos, essa expressão é verdadeira. Então, depois de você ter feito isso, porque poderíamos ter tido 500 e saber que o filtro reduziu para 20. Então vá em frente e coloque as inclusões. Tudo bem. E então, finalmente, depois de colocar as inclusões e tudo mais, eu gostaria que você encomendasse, se necessário. Então, se a pessoa Boston em arte ou por petróleo quer em R decrescente ou ascendente, este R que você só vê se ele, se o comando veio em, o inquérito é igual a R2 por consulta. Tudo bem, então isso é realmente tudo o que há que, uh, subir, sair. Então, tiramos a maior parte do trabalho do caminho. Temos cerca de dois passos a percorrer e, em seguida, terminamos com esta tarefa. Então a próxima coisa que queremos fazer é criar aquilo que vou chamar a essa unidade de trabalho, certo? Então nós temos o repositório genérico saber quando dar-lhe a unidade de estrutura de trabalho no solo superior no repositório ire, eu só vou ir em frente e adicionar o que será outra interface. Então eu só estou adicionando, eu estou chamando de unidades fora do trabalho, mudando isso para interface. E este vai herdar do descartável. Tudo bem? E então o que vamos definir em nossas unidades são quatro, seria ele vai coletar nosso registro para cada variação do repositório genérico ou relativo à classe T, certo? Por isso, neste momento só temos duas mesas para servir. Então eu só vou ver um repositório genérico para o país. Desculpe, pelo país. E incluir qualquer desaparecido ou amigos. E eu vou chamá-lo de país é tão diferentes pessoas têm diferentes convenções de nomenclatura aqui. Eu chamaria o contrário. Algumas pessoas diriam repositório contrário ou seja lá o que eu sou países Claudia. Porque quando eu chamo as unidades de trabalho, eu posso ver esses países pontuando qualquer operação que eu queira realizar. Tudo bem. Então vamos fazer isso também para hotéis. São do hotel e eu estou ligando para os hotéis da propriedade. E então vamos ter mais uma operação, que é a tarefa C. Tudo bem, então quando estamos realizando todas essas operações, a Corregedoria para atualizar, estamos fazendo mudanças nos contextos. Neste ponto. É apenas encenado, certo? Então, quando vemos Salvar ou Salvar alterações,
em seguida, ele será afetado. Então é para isso que isso serve, mas isso está fora do repositório porque se houver várias alterações a serem feitas naquele momento, então todas elas podem ser capturadas em uma operação
em vez de fazer vários custos ou o banco de dados. Então temos as unidades são para. A próxima coisa seria criar a classe concreta. Então, em um repositório, vamos adicionar classe, chamá-lo unidade fora do trabalho. E então você adicioná-lo para o trabalho vai herdar de i unidades O4. E mais uma vez, inclua quaisquer referências ausentes e, em seguida, implemente a interface. Tudo bem, então o que isso realmente vai fazer saber é dizer, Tudo bem, seus países normais, o que devo retornar quando você chamar países de mim? O que devo chamar aqui? O que disposed dual, o que faz salvo? Essas são as coisas que precisamos definir. Então, primeiro vou incluir uma referência ao contexto do banco de dados. Muito bem, semelhante ao que tínhamos antes. E então eu vou definir meu construtor. Porta C0. Tente isso de novo. Lá vamos nós. E eu vou colocar em datas até contextos, aqueles roubados para escrever para caixa de transporte novamente. Então eu vou apenas copiar as partes deles lá e colar. Lá vamos nós. Então eu estou inicializando o contexto de dados dentro da célula unitária para uma cura e preciso saber disso. Ok, eu tenho uma cópia dos dados do contexto também. Então eles provavelmente estão se perguntando, então por que eu preciso dos contextos aqui? E isso é realmente porque o que precisamos fazer é retornar uma instância do Depositório, mas então temos que recuar um pouco. Então eu preciso rezar eventos da mesma maneira que nós teríamos definido sobre este lado como privados. Ver se consigo fazer isto rapidamente. Então eu só vou pegar isso e eu vou definir duas propriedades privadas
dos respectivos Holt e países, mas não quero renomeá-los sobre quando tirar o acessador. Então isso vai ser países. Neste vai ser hotéis. Tudo bem? Então não há dados como essas propriedades privadas, eu vou dizer embora aqui,
que se a propriedade privada está vazia, em seguida, retornar uma nova instância do genérico ou depositantes. Eu só vou fazer aquele gráfico porque C afiado nove é muito legal. Segundo, vai dizer algo como países e, em seguida, ponto de interrogação. interrogação é igual a. Então, é o cara da música dizendo, se isso é nulo, então o que eu devo fazer desde que fora de uma declaração se todo? Certo? Agora, basta ver se ele é nulo, em seguida, retornar um objeto do repositório genérico do tipo país. E, claro, com base na nossa definição é que você precisa de um contexto de banco de dados, é por isso
que temos injetado aqui. Então passamos no contexto. Tudo bem, e então eu basicamente vou fazer a mesma coisa para uma foto. Então este é o nosso registo. Não, isto é como um rolo de êxtase que todos estes são potenciais repositórios genéricos sobre a Síria e a unidade de trabalho a que tenho acesso. O contrário é que o hotel está na mesa para sempre que você define. Você precisa ter certeza de que você colocar
É você fazer representação para ele na unidade de trabalho I, bem como a unidade de trabalho. Mas tudo o que fizemos com o repositório genérico e eu repositório genérico, não
queremos ter que refazer nada disso com
qualquer outra tabela de dados que possamos adicionar no futuro, certo? Então é apenas um parafuso manter esta lista e essas funções para garantir que temos acesso ao que precisamos. Bem aqui em nossas unidades, um registro de garfo. Certo, então a próxima coisa que precisamos fazer, ou bem, mais duas coisas. Então eu quero definir essa pose e então nós precisamos configurar um Save e então nós terminamos com isso. Então esta pose que eu vou gerar dispor verdadeira. Então é assim que eu faço. Pode ver variações da unidade de trabalho em outro lugar. Mas esta é a maneira que eu vim para fazê-lo por várias razões. Mais uma vez, o contexto é rei. Então o que estou vendo aqui é que vou chamar outro método. Então eu vou definir um método aqui, apenas que Visual Studio gera um método ou ajuda no Neith ele para esse propósito. E então eu só vou dizer,
bem, na verdade, agora é que eu estou fazendo isso. Eu só vou dizer aqui neste contexto andar. Então essa pose é realmente como um coletor de lixo. Ele só de ver que quando termino as operações são feitas, por favor guarde a memória. Esse é o propósito. Então DC aqui é realmente classificada para coletor de
lixo se você olhar para o coletor de lixo descrição. Então isso significa que quando disposes chamado,
então, por favor, livre-se do contexto e significado matou qualquer memória que a conexão com o banco de dados estava usando, matar a conexão, matar todos os recursos que ele estava usando, e vá em frente e faça o que ele faria por padrão de qualquer maneira. Então é isso para se livrar. O próximo seria o nosso Salvar Alterações. E este é realmente muito simples porque é realmente apenas uma linha, pelo
menos agora onde vemos um peso, ponto de
contexto salvar muda uma pia. Aqui está a flecha. Eu estou vendo. Oh, mas o que eu não tenho eu não tenho o assíncrono. Uma vez que eu coloquei isso lá, tudo está bem no mundo. Então deixe-me desenhar construído para ver se eu quebrei alguma coisa ou se há algo fora do lugar e ter uma construção bem sucedida. Então isso significa que eu coloquei com sucesso no código para minhas unidades são garfo, pelo
menos código são sintaticamente. Mais tarde, descobriremos se funciona ou não. Mas sabe, este é um bom recurso para ter e esta tarefa é feita.
15. UPDATE: contém fortemente para a unidade do trabalho: Ei pessoal, bem-vindos de volta. Então acabamos de configurar nossa unidade de trabalho que foi um pouco de trabalho e um pouco de explicação e de discussão entre um monte de arquivos. Então eu mantive isso simples. E o parceiro a que me refiro é a parte com os Includes. Então nós mantivemos simplesmente o suficiente usando apenas uma lista de string tipo. E então no repositório genérico nós apenas
implementamos este loop foreach para dizer para cada propriedade que está na string, em
seguida, ir em frente e incluir,
bem, agora nós queremos refatorar isso é um pouco porque o perigo de tê-lo desta forma é aquele. Isso é chamado de string mágica, por isso é propenso a um erro tipográfico e o compilador nunca saberá que é um erro tipográfico que você pode ter inadvertidamente digitado em SEO e TR Y em vez de COUNTA RY, e então compilaria, mas daria uma seta uma vez que você atingiu este ponto final porque Entity Framework Core não
saberia o que fazer com a propriedade incorreta. Outra questão pode ser que eu possa mudar esta propriedade de navegação dentro do próprio hotel de classe, certo? E se eu mudasse o nome de país para outra coisa? E se eu fizer isso, então isso também levaria a quebra quando nós, quando tentamos acertar o endpoint, não durante a compilação, assim por diante para ter certeza de que se algo mudar no código, ele quebra outra coisa para que possamos corrigir é nulo em
oposição a mais tarde quando um usuário se queixa de tensão, certo? Então vamos modificar os parâmetros dentro do repositório. Então eu vou para o repositório genérico olho primeiro e
vamos mudar essa ferramenta de tipo de parâmetro. E eu incluo uma tabela do BigQuery. Então eu vou apenas remover essa lista de cordas. E eu vou colocar esse novo tipo de dados que parece muito semelhante ao
que eu pedi consultável, mas é eu questionável do tipo T. E então é que eu incluí o querable e nós vamos ir em frente e incluir qualquer falta referências. Então isso é mais como uma função, certo? Então eu vou fazer isso para o gueto, lista
do Good PJ, bem como para o Git. Então tudo é nulo vai ser este mais fortemente digitado dados. Agora, como de costume, qualquer coisa que
mudamos na interface, temos que mudar na implementação. Então eu apenas fui em frente e atualizei esses parâmetros no genérico ou cartaz com o mesmo tipo de dados. E é claro que estamos vendo que estamos recebendo um monte de flechas neste momento. Então a primeira seta é porque nós chamamos isso, eu chamo esses incluem, eu chamei isso inclui antes. Semântica. Você pode fazer essa mudança se quiser ou não, mas tudo bem. Ainda vamos verificar se é nulo ou não. Então eu só vou fazer essas mudanças por atacado, certo? E então, em vez de um para cada loop, o que eu vou fazer é simplesmente dizer consulta. Se não for nulo,
em seguida, consultas igual a incluir, que não é, na verdade um telefone Sean o inquérito. Então, em outras palavras, ele vai ver se eu tenho conteúdo, então eu vou aplicar minhas inclusões para a consulta, e esse é o novo valor da consulta. Então isso tira esse loop foreach e faz o código parecer muito mais limpo na minha opinião. E isso é realmente para modificar nosso repositório genérico e
eu repositório genérico agora dentro de nossos controladores onde estamos realmente interrompendo com ele. É aqui que a grande mudança tem que acontecer. Então este método foi incluindo o país. Então eu vou remover isso. E com o que isso vai ser substituído. E eu vou apenas nomear o parâmetro. Então sabemos que estamos lidando com o parâmetro include. O que é substituído por uma expressão lambda. E então eu vou dizer q dot. E então eu veria incluir, incluir, que é um método. E então dentro desse método há outra expressão lambda. Mas antes de irmos em frente, precisamos incluir Entity Framework Core para possamos ir em frente e adicionar essa referência de biblioteca faltando, e então podemos continuar nossa digitação com outras expressões lambda. Então olhe de perto. Nós temos Q ou eu estou começando uma expressão lambda não tem que ser q, e poderia ser, eu, poderia ser tinta. Realmente não importa. Nós sabemos que por eu sei, mas eu estou apenas começando a expressão lambda e então eu estou chamando o método incluir. Se você olhar para ele, você verá que você tem um osso Jia Trulia de quase todos os métodos disponíveis para você, mas nós estamos apenas focando no Eu incluo no incluir. Então Q dot incluir. E então temos outra expressão lambda dentro do método include onde eu vejo x ponto e então eu posso ver a propriedade de navegação relativa à classe que estamos prestes a consultar. Então, a importância aqui mais uma vez é que se alguma coisa mudar para a classe de domínio, isso é apenas código. Então, se eu mudar a referência do nome aqui, então este país não existe mais. Essa é a nossa linha vermelha. Não vai compilar. Temos que consertá-lo antes que possamos empurrá-lo para a produção. E esse é o benefício de fazer esse tipo de mudança digitando fortemente suas inclusões. Tudo bem, então eu vou em frente e deixe-me chamar o controlador de contrato. Por isso, temos uma situação semelhante aqui com os nossos hotéis e será o mesmo princípio. Então eu vou apenas colocar nesse parâmetro incluir,
incluir as referências ausentes. E então, desta vez, são hotéis. Então é x dot e eu posso apenas ver hotéis dessa forma. Sem erros de digitação. Se eu tiver um erro de digitação, então isso é um erro. Se eu colocar algo que não existe, é um erro, certo? Portanto, é melhor usar apenas esses parâmetros fortemente digitados. Parece um pouco mais complicado, sim, mas a longo prazo atenderá a Manutenção muito mais fácil. Só estou compilando para ter certeza de que nada mais foi quebrado com esses dados e temos uma compilação bem-sucedida. Então você pode ir em frente e continuar e vê-lo na próxima lição.
16. Configurar o AutoMapper e DTOs: Ei pessoal, bem-vindos de volta. Então, nesta lição, vamos configurar nossos objetos de
transferência de dados e estaremos usando o poder máximo para tipo de automatizar o processo de vincular nossos detalhes aos nossos objetos de domínio. Então deixe-me dar um pouco de fundo sobre o que eu D fazer são objeto de transferência de dados é nulo. É realmente uma parte de um padrão onde tentamos dissociar nosso objeto de domínio, significa Lembre-se que isso representa uma tabela de banco de dados. Tentamos dissociar isso da interrupção do usuário. Portanto, ele vai querer que os usuários interajam diretamente com esta classe quando enviarem e receberem informações através da nossa API. Então nós temos detalhes como uma camada do meio que irá impor certos desvios finalmente na parte frontal. E podemos fazer algumas coisas e isso amplia a flexibilidade. Então podemos usar isso para desinfetar os dados antes de realmente chegar à nossa classe de dados e, por extensão, nosso banco de dados. Não, outono superior é uma biblioteca que vai realmente facilitar ou criativo ou vamos chamá-lo mapeamentos para dizer que este detalhe, tanto quanto esta classe de dados, Vamos primeiro tentar configurar nossos objetos de transferência de dados. Então, em nosso projeto eu vou criar uma nova pasta. E essa pasta eu vou chamá-la de modelos. Os detalhes são como modelo. Então, se você está acostumado a usar MVC ou até mesmo páginas Ariza ou algum outro corpo não-dominante ou estamos familiarizados com a palavra modelo, i d t, o é apenas uma maneira extravagante de ver um modelo, mas geralmente é usado em termos de APIs, certo? Então você pode nomear esses modelos de pasta se você quiser nomear
detalhes para que você saiba exatamente o
que ele faz, tudo bem, mas eu vou ficar com os modelos. Agora, em vez de pasta Foreign Models, geralmente
temos um número de classes que representam cada pode ser variação de uma solicitação relativa a cada objeto de domínio. Então vamos começar com países. Então o país tem três campos. Tudo bem? Então eu vou criar uma ferramenta legal que
nos permitirá interagir com o contrário ou ter outra camada. Então eu vou chamá-lo de Country D T O, e essa é a minha convenção de nomes. Eu coloquei detalhes até o fim do mesmo nome, certo? Porque eu não quero nosso coordenador aqui e evocar lá em cima. E eu fiz uma modificação em um? E depois acontece que é sempre o errado. Então, nomeando um detalhe, você pode ver claramente qual deles não é o DTU em que está certo. Então vá em frente, crie país dto. Andrei Linde. Verdadeiramente o dto precisa olhar ferramenta semelhante, o conhecimento real do domínio que você provavelmente está dizendo, ok, então por que a duplicação? Porque você acabou de criar outra classe em outra pasta apenas para lhe dar as mesmas propriedades. Bem, neste momento eu disse que podemos adicionar validação para que eu possa ver que o nome é obrigatório, certo? Então isso significa que quando um usuário vai interromper com o detalhe, esta anotação vai dizer que você não pode me enviar informações para este dto sem este valor. Então, se não estiver lá, a validação vai caçar. Também podemos estipular outras coisas como. O comprimento da string. E então podemos dizer que o comprimento máximo é 150, ou se este é um país. Então, digamos que nenhum país deve ter um nome com mais de 50 caracteres. Não fiz a minha pesquisa, mas deixa-nos trabalhar com 50, certo? E se eu quisesse dar uma mensagem de erro específica, se isso foi violado, não
consigo ver mensagens de erro iguais à árvore de milho. O nome é muito longo. Então, se esta validação para o comprimento da string para o nome for violada, então este é o erro falha. Assim, você sempre pode anotar o cerco de forma que quando o usuário está interagindo com a ferramenta, desgaste, manuseamento de certas coisas para garantir que não estamos excedendo estão saindo da banda fora do que queremos que nossa qualidade de dados seja. Depois de terem passado por essa validação com êxito. Então vamos em frente e fazer o mapeamento entre o BTO e o país. Então o princípio é que o usuário nunca veria o país quando verá a classe de dados e o banco de dados nunca veria os detalhes. Então os usuários interrompem aqui. E então, no meio, nós transferimos para d eta daqui para aqui. Depois passo para os obesos da Beats. Então todas as validações que podemos adicionar e apenas adicionar isso ao nome abreviado. Aqui, eu vou ver um nome curto também é necessário
no comprimento máximo para o nome curto seria escrever e mensagem de erro nome curto ou nome curto país. E dizemos que um nome de país curto ainda não pode, é muito longo, certo? Podemos sempre fazer sol muito e GND Zope. Há outras anotações que podemos adicionar ao longo do caminho, mas esses dois são os que vou usar racional para os detalhes. Agora há também uma extensão ou estender esta manteiga e um pouco mais onde criamos BTUs por operação. Então, quando começamos a desenvolver nosso controlador, nossos controladores vão começar a olhar para os diferentes tipos de operações em verbos e no que as pessoas fazem ou estão fazendo. Alguns casos que eles têm um detalhe por operação. Digamos que eu tenha um detalhe para ler os detalhes para criar um detalhe para atualização. Porque a realidade é que há
momentos em que você não precisa fornecer certas informações. Então alguém está criando um país. Não preciso que eles tenham o campo para identificação, certo? Então o detalhe com o qual eu gostaria que eles interrompessem seria criar a ferramenta do país D. E você não terá a oportunidade de fornecer um valor para o ID porque realmente não precisamos do valor para o ID. Então, de um modo geral, tenho que ter o país ou eu tenho o detalhe base. E então R14 criado porque mais uma vez, cria não precisa do ID. Tudo bem, então 1aqui, fazendo verbos ar, você vai realmente ver a diferença entre Hall. Usamos qualquer um. Reparei que estou colocando no mesmo arquivo. Partes de responsabilidade única são e podem ter precedência aqui. E você faz cada um em seu próprio arquivo como fizemos para as classes de domínio. Ou uma vez que este é um pequeno aplicativo, eu vou apenas colocar todos os detalhes que estão relacionados a um domínio dentro do pó sujo CM em classes separadas com seus nomes apropriados. Então eu vou fazer uma pausa aqui e eu vou
desafiá-los a ir em frente e fazer a mesma coisa para o hotel, criar os detalhes, e ir em frente e colocar em algumas validações para o campo. Tudo bem, então espero que você tenha assumido esse desafio e eu estou aqui para mostrar o que eu sabia se você fez isso e você não tem flechas, isso é muito bom. Eu fiz um pouco diferente. Então, eu vou apenas guiá-lo através do
que eu fiz aqui para o DTO do hotel. Então eu viro o script em vez de criar o até inteiro, o til e, em seguida, criar a versão Criar, o que eu fiz foi criar a versão e, em seguida, eu deixei herdar o detalhe que BaseOne herda do Criar e eu vou Explique essa decisão. Agora voltando ao que acabamos de fazer com o acordo contraditório, você percebe que repetimos os campos, certo? I IDs em um, mas não no outro, mas houve nome repetido e eu realmente refatorar este também repetimos nome em short_name, certo? Então o que eu fiz foi dizer quais são os campos comuns? Quais são os campos exclusivos de outra forma. Então ID, eu realmente preciso ID quando eu estou indo para fazer uma atualização ou eu vou olhar para os detalhes ou algo que não é uma operação de criação, certo? Então eu tenho a criatividade para vocês, que vai ter todos os campos que são absolutamente necessários para a criação. Eles também são absolutamente necessários se você está procurando os detalhes ou se você vai ser ele. Tudo bem? E mais uma vez você tem variação. Então, se é que você queria um ponto dto só permite que você atualize o nome. E isso é o que você quer usar explosivo comportamento para atualizar
apenas o nome do país, mas não o meme curto,
você sabe, apenas por exemplo, c_k, então você poderia criar uma necessidade TO que diz atualizar o nome do país, BTO, e tudo o que leva poses é o campo de nome. Então você tem todas essas opções. No entanto, eu não estou fazendo essa granola nele. Então o que estou fazendo é definir uma onde as idéias não prisões, e é isso que vamos lidar. As operações de criação são as operações necessárias não ideais. E então eu tenho a base um que está herdando daquele que tem todos os outros campos. Então, a base tem ID e está herdando, então automaticamente tem acesso a tudo o que foi definido. Dessa forma, não preciso repetir minhas validações porque inicialmente eu tinha as mesmas validações duas vezes no arquivo. E por tantos outros detalhes que eu possa ter definido, eu teria tido essas validações uma e outra vez e outra vez. Então esse foi o meu pensamento aqui. Então eu estendi essa ideologia. Para os detalhes do hotel. Então a criação de detalhe total, que tem suas validações para o nome, certo? E veja eu copiei e
colei, eu nem mudei essa mensagem. Então o nome do hotel é muito longo, endereço é muito longo, e você tem o comprimento máximo. Podemos adicionar o mínimo de emprestado. Você provavelmente deseja adicionar comprimentos mínimos, o nome curto, porque eles precisam fornecer pelo menos 11 caracteres ou mesmo nome. Um personagem é necessário, certo? Voltando ao DTO do hotel, temos a validação do nome, a validação do endereço, o tumulto. E deixe-me colocar um pouco de espaço para vermos onde tudo começa e pára. Lá vamos nós. Então, para a classificação, é necessário. E eu defini nosso alcance de um para cinco porque eles estão comendo precisa ser entre uma classificação de 1 estrela ou uma classificação de 5 estrelas. Claro, estamos usando o dobro porque você tem 4.54.11.5, etc. Então, a reengenheira, Jill vê qualquer valor numérico que precisa haver entre esses números. E, em seguida, o ID contrário é necessário. Não, não o que eu tenho ID de contorno, mas ao contrário da classe de domínio, eu não defini país. E também falta do criador é o id. Então esses dois estão faltando porque na criação tudo que eu preciso é o ID. Todo o banco de dados vai ver é o id. Ele não vai ver a entidade real ou qualquer coisa vindo desse campo. Saiba que o campo se torna necessário, no entanto, quando eu preciso ver os detalhes, então como nós descrevemos em vez de ir e executar outra consulta para descobrir qual país tem o id que foi fornecido aqui. Eu posso apenas fazer uma inclusão e obter os detalhes do país incluídos. Então é por isso que no detalhe básico, e eu não gosto de chamar este a base geralmente herda da base. Então, quando eu disse BS, eu só quero dizer aquele que não é necessariamente tão específico para uma operação. Então, estou usando vagamente, mas acabei de me explicar para não confundir vocês. Então o hotel dto está herdando todos os campos que estamos alinhados na versão Criar dele. Mas, em seguida, ele inclui o ID e inclui um objeto do tipo país dto. Então teria sido fácil copiar os campos e você não estaria errado. Você não precisa especificar uma chave estrangeira nos detalhes. Mais uma vez, isso é voltado para o cliente. Não é centrado no banco de dados, então ele realmente não se importa se é uma chave estrangeira ou não apenas dizer, Ok, eu preciso de um inteiro porque eu fui definido como um int. No entanto, não estavam usando País porque no BTO nunca deve França um objeto de domínio diretamente. Então os Beatles superaram os detalhes. Doumani um objetos pensados para dominar objetos, mapeador
automático é a única ponte entre os dois. Tecnicamente falando, um dto de madeira nem sabe que tem um objeto de domínio. Portanto, não deve haver correlação com objetos de domínio e id2. Então a BTU é definida aqui, e a propriedade aqui também é uma DTU. Depois de tudo isso, vou fazer uma construção e ver se há algo fora do lugar. E eu tenho um construções bem sucedidas. Então tudo parece não, parece saber onde deveria estar. Vou apenas adicionar mais duas coisas e então podemos ir em frente e instalar e configurar o mapeador automático. Saber, quando procuramos um país, às vezes
é mais fácil procurar o país, ou às vezes mais fácil procurar o país. E você verá os detalhes de todos os hotéis que fazem parte deste país. Então nós meio que fizemos essa ligação aqui onde
podemos ver os detalhes do país para qualquer hotel. Mas quando eu conjurar, tem vários hotéis, certo, precisamos ser capazes de dizer, procurar o país com o ID um. E eu quero ver todos os hotéis que estão lá, que não é incomum em qualquer lugar na internet. Se você procurar, você sabe, em um site de reservas para olhar para a Jamaica, por exemplo. E vai mostrar-lhe a lista de hotéis. Então, o que precisamos fazer em nosso objeto de domínio, e estaremos replicando dados através também. Mas precisamos ter uma propriedade que é lista virtual
pública e outros usam a lista íons porque isso é uma extensão do tipo de dados da lista. E é uma lista do tipo hotel. Tudo bem? E vai chamar-se Hotéis. E nós temos que desdefinir essa propriedade. Então esta propriedade, quando não precisamos fazer uma migração para
isso, realmente não é para onde ir para o banco de dados. Isso é apenas dizer ao objeto de domínio que quando você está recebendo dados para todos estes, se for solicitado, então você também pode incluir a lista de hotéis associados com o país. Então lembre-se em nossas unidades de trabalho que dissemos que você pode fazer uma inclusão. Então teria incluído os detalhes de um país com qualquer hotel. Ou podemos procurar o nosso país e incluir a lista de hotéis. Então é isso que essa propriedade está lá longe. Agora o que eu vou fazer é permitir que os detalhes realmente tenham esse comportamento também. Então, em nosso país dto, eu vou colocar esse dentro do não-específico,
não-Operação Específica VT0. E mais uma vez, os detalhes aceleram aos detalhes. Então, detalhe do hotel, esse é o tipo de dados com que estamos lidando. E mapeia de volta para o hotel. Isso não precisa ser virtual. Tudo bem, então temos um público onde o potencial de
olhar para um país dto e obter a lista de hotéis. Além disso, os nomes de campo têm muito entre o dto e nosso objeto de domínio se quiséssemos que um mapeamento funcionasse perfeitamente. Caso contrário, há muitas configurações. Eu tenho que ir e ver, oh, este membro ou esta propriedade tanto quanto este aqui acima que
diz que nós não queremos passar por tudo isso baseado no que estamos fazendo aqui. Tudo deve mapear para o outro são dois seu homólogo, quieto, bem, tudo bem, então eu tenho visto mapa, mapa, mapa, mapa. Então vamos instalar outono causa superior que é o que vamos usar para fazer este mapeamento. Tudo bem, então clique com o botão direito do mouse no projeto, vá para NYU ainda pacotes. E depois vamos para Burroughs e procuramos o mapeador automático. E o que realmente queremos ser, em última análise, extensões de ponto superior dot microsoft dot dependência injeção porque este é especificamente para dominar núcleo que, embora ligado, não
é otimizado para.net core, certo? Então este é o que queremos. Podemos simplesmente ir em frente e instalar o outono superior não é o padrão lá, embora ferramentas lá fora que fazem coisas semelhantes ao outono superior, mas este é muito popular. Eu usei muito. Ele não me falhou, pelo
menos em tempos muito recentes não falhou. Assim, podemos ter muito trabalho feito com o outono superior. Então, agora que o instalamos, oh, eu pensei isso na seta. Agora tudo o que precisamos para configurar uma inicialização, certo? Então o que eu vou fazer é apenas criar uma pasta. E você percebe que eu amo criar pastas é meio que segrega o que está acontecendo onde alguém é uma chamada esta configuração de pasta, configurações xy. E nesta pasta eu vou criar uma classe que é, eu vou chamá-la de inicializador mapeador. Tudo bem, então nós temos que criar que a configuração na classe que o último per sabe como ele deve se comportar e vê-lo deve prestar atenção. Então mapeador, inicializador mapeador. E vamos herdar desta classe chamada perfil. Agora, uma vez que eu faço isso, eu preciso incluir a instrução de uso para mapeador automático. E então isso me permite criar o que eu preciso para criar um construtor. Então, uma vez que é chamado para desfazer as inicializações. E então neste construtor, eu preciso definir todos os mapeamentos, certo? Então, em outras palavras, eu preciso ver que essa classe de domínio chamada Country. E depois vamos em frente e incluímos qualquer biblioteca desaparecida. Seu objetivo é mapear diretamente para o país TOO. Tudo bem, vá em frente e inclua isso. E então abrimos e fechamos a cinta. E então eu vou apenas seguir isso até com Dot River Smog, que também é uma função. Então isso está dizendo que o país tinha classe Nieto tem uma correlação direta ou os campos no país precisa de uma classe como um direto, têm uma correlação direta para continuar dto campos e eles vão em qualquer direção. Tudo bem, então eu vou querer fazer isso para todos os detalhes que eu tenho. Então foi o que eu disse. Você pode ser concedido. Mas quando ficar granular, tem que se certificar de que está cobrindo os mapeamentos potenciais, certo? Então, ao contrário de criar e país para país,
e, em seguida, hotel para manter o T0. Tudo bem? E, em seguida, o mesmo comportamento ou tratamento Cmd para o hotel para o criar Toto BGO. Tudo bem, então agora que temos a configuração do inicializador do mapeador, precisamos saber, incluí-lo na inicialização do nosso aplicativo. Então vamos para a inicialização como de costume, e então nós vamos incluir um leão e algas incluí-lo aqui mesmo no bom núcleo do anúncio onde eu fui ver Serviços, dot add, auto, mapeador. E então isso vai exigir que eu inclua algo. Deixe-me terminar de escrever. Primeiro. Lá vamos nós. Então eu preciso incluir ou tinha a declaração de uso para automotivo. Lá vamos nós. Então, eu finalmente superior e eu vou ver tipo fora. E eu vou passar o tipo de dados associado com o inicializador por. Então mapeie __init__ e obtenha o laser direito ortográfico. E mais uma vez, inclua a referência que falta, certo? Inclua a instrução using. E quando eu fizer isso, parte superior do
outono está pronta e nós vamos. Então, quando estamos realmente desenvolvendo ou pontos finais, vamos realmente ver o polar do operando de outono segurar os detalhes, trabalho e todo tudo relacionado com as classes de dados, mas é bom para obter essas configurações vai dizer a onda desde o início, então, você define o padrão para seu aplicativo e, mais tarde, não
há muito retrabalho que precisa ser feito porque esse padrão foi definido, você está mantendo esse padrão à medida que seu aplicativo fica maior. E todas essas coisas já estão no lugar.
17. Analisar e adicionar mudanças no GitHub: Ei pessoal, bem-vindos de volta. Então estamos no segundo ponto de verificação para o nosso projeto. Então, depois de cada módulo, vamos apenas rever o que
fizemos e, em seguida, ir em frente e atualizar nosso repositório de acordo. Por isso, é sempre bom manter Collins mais curto fora suas pequenas vitórias para que se você está frio fique corrompido mais tarde, você sempre pode reverter para a versão de trabalho mais recente do seu aplicativo. Então, em primeiro lugar, podemos sempre saber que as mudanças que foram feitas olhando para os arquivos são um deque significa que ele estava lá e não é diferente da última coisa que foi chutado em. E um sinal de mais significa que foi adicionado desde o último frango. Então Git está sempre mantendo caminhão fora
do que o arquivo parece e informando que
não é diferente através da porta no pau estão informando que isso foi adicionado desde a última vez. Se você quiser ver o que muda, você pode realmente clicar com o botão direito do mouse ir para obter e você pode ver Ver Histórico ou comparar. Então, quando você se compara a dizer,
bem, a última versão que eu tinha é a esquerda e as páginas me acertam? Então a versão permite que eu tinha é para a esquerda e a nova versão é para a direita. Então ele vai mostrar a vocês que este nove foi modificado dessa maneira. E em todos os lugares que você vê um verde destacado significa que algo aconteceu. Então, ao trabalhar em uma configuração de equipe no entanto, é sempre recomendado que vocês não trabalhem nos arquivos de costura para verificar porque então se você modificar algo em seu triste eu modifiquei o mesmo arquivo do meu lado, então nós vamos acabar com isso esmagador tipo de situação discutindo onde ele vai dizer, Bem, as duas linhas estão vendo duas coisas completamente diferentes. Qual deles devo usar? Eu não vou ter que gerenciar o que você chama de Conflitos. Estou citando por massa Osaka realmente mostrar que quaisquer conflitos não são Não. Mas espero que vocês não codifiquem isso. Então o que vamos fazer é fazer o check-in. Então, para fazer isso, eu posso clicar com o botão direito do mouse ir para obter que está incorreto. Mudanças. Lá vamos nós. Então manobras e eu vou Visual Studios em diferentes layouts. Só não queremos ter mudanças. Mais uma vez, se você não estiver vendo isso, você sempre pode clicar em Exibir e você será capaz de ver esse item de menu adequadamente. Então você sempre quer colocar em uma mensagem que retrata o que era. Então minha mensagem é o meio dizendo a quem quer que veja os doentes, que eu não fiz o banco de dados de unidades superiores de outono para o negócio. Então você não precisa ser, você não precisa escrever uma redação. Mas pelo menos deixe-me ter uma idéia ou quem quer que tenha uma idéia do que você fez. Depois disso, podemos clicar no carro. Então dizemos “cometam tudo” e cantam. Então ele irá confirmar as alterações um, e ele irá pedir-lhe para salvar, apenas jogá-lo e salvá-lo irá confirmar as alterações localmente e, em seguida, ele será tipo de sincronizado com GitHub. E nesse ponto, se houver mudanças aguardando do outro lado, o significa que seu membro da equipe fez algumas alterações e registre-as antes. Quando você diz cometer todas as inafundáveis empurrar para cima suas alterações, obter as mais recentes. E mais uma vez, se você modificar o mesmo arquivo com conteúdo diferente, é aí que esse conflito pode surgir. Se você não fizer isso, então este é um processo realmente perfeito. Então, aqui vamos informá-lo de que ele foi sincronizado com sucesso e você pode avançar para a próxima tarefa.
18. Visão geral - Configurar pontos: Bem-vindos de volta, rapazes. Neste ponto, basicamente concluímos pelo menos a maior parte de nossas configurações. À medida que avançamos, podemos ver a necessidade de incluir outras coisas. Mas agora nós queremos começar realmente a fazer nossa API funcionar porque fora de bater F5 e ver arrogância e ver as alças, nada funciona, certo? Ainda não temos uma API. Então, o que queremos fazer é realmente começar a configurar nossos endpoints get. E eu vou explicar exatamente o que os endpoints get significam. Então, para começar, vamos apenas olhar para este controlador de previsões meteorológicas que veio com o nosso projeto. Mas na verdade é apenas um código de exemplo que tipo de fornecer algum contexto o que precisamos fazer para obter o nosso ponto final para cima e em execução. Então, nosso controlador, e como eu disse antes, realmente controla o que acontece quando um usuário solicita inflamação e ensina o controlador. Os pontos finais são geralmente determinados por, são o que vamos chamar axônios, que são essas funções que vão ser definidas dentro do controlador. E o que ele responde com R quando o controlador as opções, é sim ele faz computação e, em seguida, responde de uma maneira que o aplicativo de chamada ou o aplicativo cliente que está tentando acessar a API saberá que este foi uma chamada bem-sucedida. Talvez. E, de um modo geral, sempre que alguém faz com que eu chego às mercadorias, a fim de recuperar informações ,
daí a palavra começa, eles estão recebendo algo, eles esperam obter alguma coisa? Então, dentro do contexto deste controlador de exemplo, vemos que nós, quando chamamos este endpoint, ele vai retornar dados. Então estamos recebendo beta, dado que são dados muito aleatórios. Não é nada muito sério. Mas a realidade é que é o comando simples que está recebendo, então nós temos o que chamamos de atributos HTTP, certo? E está vendo, está definindo o comportamento da função. Então, quando nós realmente testamos os resultados, e nós podemos fazer isso aqui mesmo no futebol, e você apenas ir em frente
e puxar isso para baixo e nos mostrar todos os exemplos do que podemos comer. Em seguida, clique em Tentar Toyota e clique em Executar. E então ele vai saber mostrar que este foi o pedido que foi enviado. Então note que não há nenhum indicador real aqui para dizer, oh, essa barra chegar lá é conhecer as crianças e para ver qual era o ponto final, conhecemos o servidor baseado no fato de que quando executamos o aplicativo, esse é o endereço do nosso servidor. E então sabemos o controlador que estamos interagindo com as previsões meteorológicas, certo? Esse é o nome do nosso controlador. controlador de previsão do tempo é uma palavra-chave estática já controlada e convenção de nomenclatura SSI. Mas então eu não sei o que atua sobre
ele, então o que realmente aconteceu é isso, e eu vou apenas definir um ponto de interrupção aqui para que possamos ver agora quando clicamos em executar, ele realmente atinge esses pontos de interrupção. Está chamando este método. E chama-se Get. E quando pressiono F5, ele retorna com todas as informações que estavam sendo recuperadas disso. Então o que realmente está acontecendo aqui é baseado
no protocolo e certas definições que vamos fazer aqui em cada opção. A forma como formulamos nossos pedidos, ele irá, o controle saberá automaticamente qual deles devemos acertar. E o contexto para isso superado por trás disso é que você não quer ser muito granular com seus nomes para suas ações que você não quer ver, obter 4x e obter um, um por ID, obter um pelo nome. Você pode ligar, bem, você pode realmente chamar o axônio, basicamente qualquer coisa que você quiser dizer. Posso dar-lhe o seu próprio nome. Claro, existem padrões que possuem isso. Mas a realidade é que se você tem vários são comidos, nomeie todos eles para vê-lo obter. Mas você, com base nos dados que são necessários para recuperar as informações, você pode estipular qual get deve ser chamado. Então tudo isso, mais
uma vez, esta é apenas a introdução. Então, e no próximo vídeo vamos criar nosso próprio controle. Agora vamos começar com os hotéis,
desculpe, com os países. E vamos ver exatamente como ele vai e você quer recuperar o país é a lista de países a partir das necessidades de sua através de uma chamada de API.
19. Construct GET: Tudo bem, então agora estaremos construindo ou primeiro controlador e nossas primeiras operações GET. Então eu vou clicar com o botão direito do mouse controladores, vá para Adicionar controlador, e então nós estamos indo apenas para fazer um controlador vazio API. Então, esta escolha API para a esquerda e API controlador traço vazio. E vamos clicar em Adicionar. Não, só para alguma clareza. Nós fomos em frente e abstraímos muitas
das operações de banco de dados em nossas unidades de trabalho para que não
estamos interagindo diretamente com nosso banco de dados através de nossos controladores, certo? Se fizéssemos controlador de API com ações usando framework Entity,
em seguida, ele iria realmente gerar um controlador que tem um objeto ativo fora do contexto DB, que é a conexão de banco de dados. E nós seríamos capazes de fazer todo o nosso trabalho de estrutura de entidade aqui mesmo. Esse perigo fora que, no entanto, é perigo a longo prazo, pode se tornar menos sustentável como a garota requisitos, porque então você vai acabar repetindo muito legal, e é por isso
que fomos todo o caminho até R Eu unidade fora do trabalho, abstraído de distância. Tudo isso o tornou muito genérico. Para que tenhamos uma base de código para a qual estamos fazendo chamadas mais dinâmicas. Então, por enquanto, eu só vou lidar com o M21 porque nós realmente não precisamos ir em frente e brigar com essa coisa. Mas à medida que construímos o aplicativo, você verá a praticidade de tudo o que fizemos. Então, um traço controlador PI vazio, vá em frente e clique em adicionar
e, em seguida, o nome. Você geralmente quer, mais uma vez, o neem até que ele reflita os endpoints porque, assim como com as previsões meteorológicas, nós não temos cuidado quando aquecemos URL cortar previsões meteorológicas. Esperamos lidar com as previsões meteorológicas. Então, se eu espero estar com os hotéis, desculpe, eu estou começando com clincher é eu manter uma única dose. Então vamos ter país são, dizem países controlador. Tudo bem. Eu queria dizer “country”. Certo, controlador de país. E depois temos o nosso controlador em branco. Não, eu pareço crescer atrás do que você está olhando neste controlador, a raiz. Então, temos dois mecanismos de roteamento que podemos usar no desenvolvimento APA neste desenvolvimento API MVC. Um deles é o convencido sobre roteamento base, roteamento, certo? Esse é o lugar onde nós realmente temos que ir para a inicialização. E nós configuraríamos nos endpoints dos EUA. Nós meio que configuramos nossas raízes. Então Quincy endpoints, pontos, esfregão, controlador, raízes
do controlador. Lá vamos nós. E então eu meio que definiria a convenção de nomes. Então eu poderia dizer nome, dois pontos, e eu vou apenas dizer um padrão. E então a Convenção para o roteamento seria o padrão. relógio deve parecer. E estou só a mostrar-te que este não é o que vamos usar. Só estou a certificar-me de que compreendes exactamente todas as opções que existem. Então vamos ter controlador e então a amostra seria igual a casa, certo? Leilão de corte. E, por exemplo, índice. E depois lama. Quaisquer parâmetros que seriam necessários não estão na forma do ID. Tudo bem, então isso deve ser encorajado com chaves também. Então esta seria a nossa maneira de definir convencido no esquema de roteamento base. Dessa forma, sempre que eu solicito entra, esse pedido precisa de um Alistair específico que estamos procurando por um controlador de disco com esse nome. Por exemplo, o controlador de previsões meteorológicas, ou faz um endpoint que esperamos procurar. Mas queremos essas ações específicas. Então eu mencionei que não queremos ser muito específicos com nossas ações. Nós não queremos dizer obter países, obter país,
país pelo nome, chegar ao contorno, você sabe, nós apenas listamos todos os 1250 leilões. E então você estava chamando o cliente contra nós para lembrar o axônio a ser usado em cada chamada. Então é isso que isso nos forçaria a fazer até agora. E, e isso é, isso provavelmente é mais útil para uma aplicação web em nosso aplicativo MVC regular. Mas quando consideramos os padrões da API Arrest, o
que eles querem é que o verbo determine o que você vai fazer. Então vamos usar o que chamamos de atributos rotativos, certo? O que basicamente vai dizer: “ Procure o controlador”. E se quiséssemos modificar a sequência, digamos controlador de barra api. Então, o que quer
que você coloque aqui, o que virá depois dos nomes dos
servidores, nome do servidor sendo localhost, dois pontos, qualquer porta dois de barra, qualquer rota que esteja aqui, certo? Então, se você olhar para trás, tem previsões meteorológicas, petróleo onde previsão do tempo, isso é o que está lá. Então foi isso que cortou o controlador sendo previsão do tempo. Se olharmos para o nosso novo, vemos que temos barra controlador de barra api. Então, os links parecerão um pouco diferentes. Então, quando gerarmos o doc do futebol, você verá isso vindo à tona. Mas agora o que vamos usar é o roteamento baseado em atributos. Tudo bem? Assim, ele nos permite mapear diretamente para o nosso controlador e diretamente para as ações em tudo sendo muito específico sobre qual exatamente. Mas, em seguida, o verbo vai determinar quais endpoints devem ser chamados com base na solicitação abaixo. Então agora que ficamos todos iluminados, mas crescemos e vamos, na verdade, juntar ofertas e conseguir. Então, antes que possamos fazer qualquer outra coisa, temos que incluir nossa unidade privada de leitura somente i de trabalho para que possamos tirar proveito do acesso ao banco de dados. Tudo bem, e eu só vou ligar para este na unidade de trabalho de pontuação. Então esta é a minha convenção de nomenclatura onde eu uso um sublinhado e você veria que é usar um sublinhado para variáveis privadas. E você vai ver como nós avançamos, então precisamos disso. E eu vou colocar o madeireiro. Então eu logger para isso, precisamos ir e configurar ou injeções. Então eu vou simplesmente copiar e colar rapidamente
estes para que eu não tenha que digitação monetária para fazer. Então. Mais uma vez, injeção de dependência significa que uma vez que tenhamos registrado e nessa nota, precisamos ir para a inicialização e completar uma configuração. Bem, uma vez que você registrou algo na inicialização como um serviço no bootstrapper, ele se torna disponível para quatro na injeção de qualquer forma na maioria dos casos, certo? Até agora nosso controlador, podemos injetar a instância da unidade de garfo e vamos apenas fazer uma cópia dele para uso local estrangeiro. Então é isso que este é quatro. E faremos o mesmo com o madeireiro. Certo, então temos nossas cópias locais disso. Não, a coisa que precisamos fazer em uma startup é realmente registrar a unidade de trabalho. Então criamos um intervalo, fizemos um registrá-lo no bootstrapper. Então eu vou deixá-lo e eu vou mostrar-lhe o erro
que você cometeria e então nós podemos resolvê-lo juntos. Tudo bem, então seguindo em frente, depois de fazer essas coisas preliminares para configurar meu construtor, eu vou definir que eu quero em HTTP. E você pode ver todos os verbos potenciais sendo listados lá. Então HTTP Get operação. E para completar esta operação, vou usar público. Só vou assíncrono. Então público assíncrono, tarefa do tipo axônio resultados. Tudo bem, então se você, se você tivesse gerado o controlador com o,
com o Entity Framework, eles
são adicionados a ele? Todos eles teriam sido presas de resultados de ação. Então, basta chegar ao código assíncrono do bloco. Então, é bom apenas começar a usar lseek do, do get-go agora eu posso nomear obter país. Tudo bem. Isso é bom. Quero dizer, bem, neste caso eu quero todos os países, então países porque eu estou recebendo múltiplos, certo? Mais uma vez, com base em nosso roteamento, não
precisamos especificar isso. Bem, você vê isso mais tarde. E então nossa tarefa nula vai fazer uma tentativa de captura. Tudo bem, então vamos tentar operar e lidar com qualquer erro que possamos obter. E eu vou estender isso com x para que nós estamos realmente pegando o objeto exceção. E então aqui eu vou dizer países var é igual a o ou unidade fora do trabalho para chamar os países. E então eu posso dizer, pegue tudo. Tudo bem, parece bom. Agora lembre-se com o nosso método, nós poderíamos colocar e especialistas aqui se você quisesse adicionar um filtro e todas as empresas onde poderíamos fazer algumas coisas a partir deste método sozinhos, mas agora só precisamos de tudo. Tudo bem, e então eu vou voltar. Então os tipos de retorno são muito importantes. Você quer devolver todas as chaves quando tudo foi para o nosso, bem, é por isso que se chama “ok”. Ou 200. Então, para começar esse número é 200 e podemos devolver o velho garoto com os dados. Tudo bem, então isso parece bom. Até agora, vamos modificá-lo até pouco combustível, mas é o que vamos tentar fazer. E se tudo correr bem, voltamos. Ok, e ele vai enviar de volta para o cliente que ligou os dados que vieram desta chamada. Saiba em nossa captura, neste
momento, nosso madeireiro torna-se muito importante. Então logger ponto log erro. E então eu posso ver algo como cifrão. Algo deu errado. E eu posso ver que eu posso colocar em mais detalhes
no e alguém usar minha interpolação. Será que aquele cifrão lá no caso de você não está familiarizado com ele, não atribua string. Ele fez aqueles destinados a super impor qualquer variável neste momento. Então eu vou apenas especificar o nome fora do método onde
o que deu errado, certo? Então, diga o nome dos países. Tudo bem. E então eu vou mandar no objeto de exceção. Na verdade, tenho isso ao contrário. A exceção deve vir primeiro no erro de log, exceção vírgula, então algo deu errado com nossa exceção, então nossa mensagem. Então log Assíria com realmente apenas limiares são impressos todo o rastreamento de pilha. Assim, você pode ver todos os detalhes da seta a partir da exceção que tem sido verdadeira. Não, se houver um erro, eu não quero apenas jogar o que eu queria fazer é alertar o cliente que algo deu errado,
Lee, então sim, o madeireiro vê é que é para todos os fins internos. Mas então eu quero devolver algo que o usuário veja, você sabe, isso é o que acontece. Então, um código de status 500 é o código universal para ver que havia um problema no servidor. Certo, então isso está dizendo ao usuário que isso, algo deu errado em todos os lados. Não é você, sou eu. Tudo bem. Então, o código de status 500 significa Erro interno do servidor. E outros dizem, por favor, tente novamente mais tarde. Certo, então é isso que nossos clientes são. Olhe pode eu e consumir a API vai ver quando há um erro. Caso contrário, eles devem obter a lista de países. Então vamos testar isso. Tudo bem, então a primeira coisa que você vai notar é que, não, nosso novo ponto final foi adicionado à arrogância. A segunda coisa que você vai notar é a diferença entre Holden links loop. Então cortar previsões meteorológicas para nós mesmos barra país api barra. Mais uma vez, isso tem a ver com a rota que definimos aparecem se é api barra controller ou é apenas o nome do controlador. Tudo bem, então é, é dinâmico. Então, a qualquer momento, podemos ir e remover a API se for muito incômodo, mas vamos deixá-la por enquanto. Então vamos vê-lo, experimentá-lo
e, em seguida, clique em Executar. E o que ganhamos? Então, em primeiro lugar, Essa é a URL de solicitação, então o servidor, Tudo bem, barra api barra país. E estamos recebendo esse erro, certo? Então ele está realmente cuspindo para fora Tool ou ostentar toda a resposta. O mar incapaz de resolver ponto de serviço ativando este ponto e você vê que ele está recebendo 500 erro. Certo, então dissemos para devolver 500 quando algo ruim acontece. E a outra coisa a notar, porém, é que eu não estou especificando o nome da função que está sendo chamada. Então, antes de corrigir esse erro, observe que eu não estou dizendo barra api barra controlador barra obter países. Ele só está chamando slash api slash país. Você, o usuário não sabe o nome do método que está sendo chamado e sendo, você sabe, enviando de volta a resposta. Então isso é outra coisa que quando falamos sobre a convenção de roteamento, porque nós especificamos que é, eu obtê-lo formado automaticamente. Deve ser um comando Git. Então nós vamos corrigir a era e então eu vou testá-la novamente usando o Postman, que deve fornecer um pouco mais de contexto sobre
o que queremos dizer por GET versus post, et cetera, et cetera. Então, para corrigir esse erro, precisamos registrar nosso serviço e eu acho que antes em nossa inicialização, não cs. Então, na inicialização, precisamos dizer algo como Pontos de serviços e adicionar unidades i
transitórias ou quatro unidades de trabalho. Então você veria as diferentes opções de escola são transitórias, adicionar escopo e adicionar o singleton. Sim, às vezes eu esqueço, certo? Então adicione a coisa que fizemos, um sinal de adição TA1 antes, nem nós não fizemos. Tudo bem, então eu sou trans. Isso significa que toda vez que é necessário, uma nova instância seria criada no escopo significa que uma nova instância é criada por um período ou durante o tempo de vida de um determinado conjunto de solicitações. E adicionar singleton significa que apenas uma instância onde eles existem durante toda a duração do aplicativo. Então, com base em suas necessidades, você pode acabar fazendo outras diferentes. Então adicionar transiente aqui significa que sempre que alguém atingir meu controle, eu sempre criarei. Isso sempre vai fornecer uma cópia nova. A IU e está fora do trabalho. Então deixe-me ir em frente e incluir as referências que faltam. E então vamos tentar esse pedido novamente. Então, desta vez vou usar o Carteiro para lidar com este pedido. Então eu ainda vou tentar votar apenas para mostrar isso. Ok, então estamos recebendo um erro para o madeireiro. E tudo bem, vamos consertar isso. Então estes são, é bom ver esses erros. DC pode dizer o porquê. Nós não podemos. Podemos rastrear o sapato até onde conseguir isso. Então eu acho que o problema com o logger é que ele tem ser injetado com o contexto da classe está sendo injetado em. Então, neste caso, seria o controlador. Então eu vou apenas trocar este Alyssa I um madeireiro dentro
do contexto desta mudança onde vemos o tempo para conjurar con Schrodinger. Tudo bem, e então vamos tentar mais uma vez. Certo, então vamos tentar com o carteiro desta vez. Então eu vou apenas inserir o URL do pedido, que mais uma vez é apenas o é o localhost dois-pontos, o número da porta que você tem. E, em seguida, barra API país barra. Ninguém falaria sobre GET versus post versus spots. Boltzmann, podemos tentar mudar o tipo. Então lembre-se que nós construímos para ser, eu entendo que é isso que ele foi projetado para ser. O que significa que se eu tentar chamar este mesmo endpoints sem post, ele vai me dar um não poderia obter resposta. E OK, estou recebendo algo por causa do SSL. Então você pode simplesmente ir em frente e desativar a verificação SSL e se você está tendo esse problema, tudo bem, lá vamos nós. Então método Mata carregar. Método Mata load significa que ele enviou algum pedido e o verbo que foi solicitado. Essas nozes existem. Tudo bem, então se eu tivesse tentado obter e, em seguida, enviar novamente nonce, eu estou recebendo um 500 e eu estou recebendo outra flecha. Tudo bem? Oh, estamos recebendo um bom erro. Então esse conceito de bons erros, onde é bom ver esses erros e entender como corrigi-los, certo? Então este está dizendo que System.Out leva ponto JSON está dando uma exceção porque um potencial ciclos detectado. Então, o dólar cresceu para isso é que por causa da dependência do hotel, Hotel tem uma dependência de país em país. Tem esse dinheiro de dependência para o Hotel. Uma vez que está dizendo é que bem, Eu estou recebendo hotel que tem o contrário, Eu sou hotéis de Andrea. Estou vendo muitos dados de como ir de um lado para outro. Então eu vou, vamos consertar este. Já encontrei este antes. Então vamos em frente e consertar isso. Para fazer isso precisamos de uma biblioteca, gerenciar, fazer obter pacotes. E nós vamos ter a nova biblioteca JSON soft dot, mas não aquela que queremos. A Microsoft é b-a. Deixe-me apenas digitar uma nova virada suave. Esse não é o que queremos. Queremos este, o que é otimizado. Para o nosso propósito, certo? Então eu vou apenas ir em frente e instalar o out1. Tudo bem, e uma vez instalado, o que precisamos fazer é ir para a inicialização. E nós vamos adicionar controladores. Vamos adicionar novo TEN soft JSON. Lá vamos nós e definimos algumas opções. Então todos lambda RO, quero dizer, você pode chamá-lo de opção se você quiser qualquer. Tolkien está bem. Lambda R0. E, em seguida, defina que ponto OP serialize essas configurações do serializador. Referência de pontos, manuseio de loop é igual a dois leões análogos, então não fique muito longe da tela. Assim, as configurações de serializadores de ponto referência manipulação de loop é igual ao soft dot JSON de Newton, não manipulação de loop de referência. E então isso é uma enumeração, assim por diante para dizer “ignore”. Então, onde você vê isso, estamos basicamente vendo onde você pode ver um loop de referência acontecendo. Não sei, fazer um grande negócio com isso, apenas ignore. Fechou os olhos. Deixe o programa funcionar. Tudo bem, então outra coisa que eu estou apenas passando e corrigindo quaisquer pequenos erros que são cometidos aqui. Estamos chamando “tudo o que eu não fiz era esperar uma regra cardinal sempre que estamos chamando uma função assíncrona ou algo que é uma tarefa, garante que somos pesos”. Certo, então vamos tentar de novo. Certo, então voltando para o carteiro, vamos tentar enviar mais. E isso parece um pouco melhor. Lá vamos nós. Status 200, certo? Certo, então mais uma vez, nosso status 200 é uma areia universal que está tudo bem. E em vez de termos que dizer código de status 200, Knidos nos deu um método para que infelizmente eles não têm um método para o motor FIFO ou pelo menos eu não vi um ainda. Então é por isso que este parece assim. E podemos apenas dizer ok, com os dados a serem retornados e ele será automaticamente serializado em. Lá vamos nós. Certo, então observe que cada propriedade está
voltando e hotéis vazios, Farnell, certo? Porque não incluímos os eleitores. O que podemos fazer isso mais tarde. Então é assim que lidamos com eu não tenho 7x mais uma modificação para fazer e que é fazer o mapeamento. Portanto, lembre-se de que não queremos retornar os objetos de domínio reais. Eu estava certo, não. Obtém que tudo está voltando ao país. E país é o objeto de banco de dados. O que queremos devolver é o dto. Então, queremos voltar, contribuir com acordo. E mais tarde veremos como podemos estender o detalhe para ser um pouco mais, fazer com que faça sentido por que eu vou passar por toda essa pá porque claramente
o modelo de dados que o modelo de domínio como um tipo de retorno funcionou. Mas ainda queremos essa segregação. Então eu vou apenas dizer continuidade ou nós vamos mapear para ele. Então precisamos do nosso mapeador de outono para fazer isso. E para obter o outono superior, eu tenho que definir um privado de leitura apenas chamado fora do tipo. Eu sou superior, então eu vou apenas ir em frente e incluir isso e em seguida fazer a injeção. Certo, então nós, depois que injetamos, então vamos separar os sujeitos. Então, vamos dizer países var é igual a essa chamada. E então eu saí de outra variável sob isso e chamá-lo via resultados é igual ao mapa de pontos
mapeador que eu fui para especificar o tipo de dados que eu quero mapeá-lo para. Então eu quero mapeá-lo para a nossa lista de país dto para o qual eu tenho que incluir uma referência ausente, certo? E divulgue esses colchetes angulares. E mapeamento de tempo de guerra são países que já estão voltando como uma lista. Tudo bem, então seja qual for o tipo de dados que você está, você está voltando para se certificar mapear para o tipo de dados apropriado e depois tudo isso. Então, não vai apenas pegar todos os objetos de domínio e convertê-los em objetos dto país e armazenados lá. Então, se eu não especificou ion-list, eu iria receber um erro porque esta é uma lista. E eu estou tentando, bem, ele daria um erro independentemente, ele pode não dar um erro de sintaxe, mas você pode ver que o tipo de dados não é bem o que eu estou esperando porque eu preciso dessa lista, certo? Então, apenas seja muito explícito no set off desta seção do mapa. Esse é o seu mapeamento. Eu listo isso, ou você está recebendo que eu espero mapeá-lo para uma lista desse tipo de dados. E então, em vez de retornar, os países retornarão resultados que são do tipo País D TO. Então, neste ponto, se é que queríamos deixar de fora alguns detalhes são incluir mais detalhes. Poderíamos ter definido esses campos adicionais aqui, não faça os cálculos que quisessem fazer aqui. E então eles nunca iriam realmente ver o que está dentro, o que está vindo diretamente do banco de dados. O que teríamos desinfetado, transformado, embelezado o quanto quisermos antes de devolvermos os dados. Então vamos apenas ir em frente e testar e ter certeza que este funciona e então terminamos com essas coisas. Então, de volta ao carteiro, vamos dizer “enviar”. Então ele vai acertar o mesmo método. E certo, não, está trazendo de volta. Aqui está a prova de que está trazendo algo diferente porque lembre-se, hotéis estavam no final da lista inicialmente, sem nome de hotel de identificação que nomes curtos. Então você sabe que esses dados são reestruturados apenas porque os campos em contradição você está em uma ordem diferente da que eles estão nos objetos de domínio. De qualquer forma, podemos ver que ainda está funcionando e é assim que realmente deve ser. Então, quando
voltarmos, vamos ver como podemos obter um país específico com base na identificação. Vamos começar com a identificação.
20. Construct GET por Id Endpoint: Tudo bem, então anteriormente nós configuramos nosso método get, e isso é realmente como get all method, mas não é o tempo todo que nosso aplicativo cliente quer obter tudo. Às vezes eu queria obter dados específicos, tudo bem, então queremos pelo menos fornecê-los em pontos finais onde eles podem obter um país com base em um identificador único específico. Nesse caso, o ID. Tudo bem? E apenas para o contexto, já que estamos cobrando para API com o contexto desse cliente. Se você visse uma lista de países e ele quisesse ver os detalhes de um desses países e você clicar em exibir, então o que aconteceria é que ele iria voltar para o banco de dados e obter esse país específico para exibir a inflamação específica são detalhes desse país em particular. Certo, então essa é a mesma coisa para a qual queremos fornecer um endpoint. De modo que quando do lado deles, quando o usuário clica no país, eles estão propensos a bugs, vamos dizer qual país foi clicado aqui, quais IDs lá? Aqui está a API de ID. Por favor, pode me dar os detalhes? E depois dizemos, OK, vamos fazer a pesquisa. Aqui estão os detalhes desse país em particular. Então, sem mais demora, vamos chegar a ele. Então, na verdade, eu vou apenas copiar aquele “get “original. Tudo bem, e nós só vamos fazer algumas pequenas modificações. Assim, a primeira modificação em seriam os atributos. Então, sim, eles são os dois e fica, certo. Mas este Get em particular precisa saber que ele pode tomar um parâmetro, certo? E isso é realmente, ele faz muito a ver com documentação sobre propósitos em sua madeira para que quando as pessoas a vêem, eles podem inferir ao mesmo tempo watts como ele difere como ele vai ao longo. Então você pode definir o Git,
mas, em seguida, você abre e fecha chave,
e, em seguida, dentro que você define o modelo para o bem. Então eu posso dizer aqui que eu estou esperando alguns ambientes são chamados ID e deve ser do tipo int. Então, se quiséssemos obter pelo nome, poderíamos fazer algo como nome do tipo string. Tudo bem, então, então você sabe que este get vai pegar este nome de parâmetro. E os nomes são muito importantes. E esse tipo de dados, que também é muito importante. Em seguida, vamos ter que renomear isso. Quero dizer, obter países, isso não está recebendo países, isso é ter um país. E ele está tomando um ID de parâmetro. Assim como com qualquer outro método em qualquer outro lugar em c-sharp, uma vez que eles estão chamando um método que tem ambientes estão em, você tem que defender apartamento que é isso que está esperando. E note que o nome aqui, muito é o nome que está nos atributos. Certo, então pegue a identificação do país, nulo. Temos a mesma try-catch. Bem, então vamos mudar a consulta e os objetos de mapeamento. Então, primeiro, não estamos recebendo países onde chegar país e trabalhar nele da mesma maneira. São unidades, todos os quatro países, o que chamamos de método get. Tudo bem, e nosso GetMethod, observe a linha vermelha, o método get requer a expressão é a estipulação por trás do que exatamente ele deve estar recebendo. Portanto, temos que definir nesta expressão. Então lembre-se que eu disse que a expressão realmente vai ser uma expressão lambda. Vou passar nesse mesmo tipo de expressão lambda. Sempre diga Tolkien lambda R0. E então o que estou procurando? Ponto Q. E então eu tenho todos os campos fora da mesa. Então isso foi projetado para países, certo? Então, qual é o campo nas mesas do país que eu deveria estar procurando? Estou à procura de um IB. E minha condição é que o ID na tabela
do país corresponde ao ID vindo através do parâmetro. Tudo bem, e então da mesma forma, eu posso incluir, porque eu estou apenas pensando sobre isso. Se você me perguntar pelo país dentro do contexto disso, alguém clicou em um país. Descobri que talvez queira ver todos os hotéis daquele país em particular. Então, ao olhar para a lista de países, você só queria ver talvez a lista de países. No entanto, quando você olha para um país, você provavelmente quer ver a loteria inteira, certo? Então nossos hotéis, então eu queria dizer uma nova lista, alguém é Abbas em uma nova lista de string tipo. E eu vou adicionar a ele. Então isso é tudo que inicializamos uma lista e podemos dizer que eu quero incluir todos os tos. Então, mais uma vez, isso agora vai passar por cima, é nossas unidades fora do trabalho vai bater o, deixe-me encontrar o método que está no repositório genérico. E vai acertar o jogo. Então esta é a expressão, este é o Include. Então, fica com todos os cartões vermelhos. Então ele diz, se houver um inclui, vá em frente e inclua o que você precisa incluir, inclua os hotéis, certo? E então vamos olhar na consulta,
tirar o caminhão e retornar a primeira estrela padrão para exigir que muito é, e padrão realmente significa apenas retornou afinidade Neolítica. Bem, o primeiro registro que corresponde a essa expressão, então eles expressam em seria onde q dot id é igual ao valor ID. Faremos todo o cálculo e retornaremos. Eles querem que a Guarda Vermelha tenha tomado o país com todos os hotéis que estão disponíveis. Então eu vou apenas verificar novamente com o meu domínio apenas para ter certeza de que a coisa é chamada Hotéis causar este sistema muito da mesma forma no ETO consciente, ele tem que ser chamado de dedos dos pés. Tudo bem, então agora que fizemos essa fiação, eu só vou mudar meu mapeamento. Então eu estou recebendo sobre um objeto country, Juan Objects. Por isso, não vou subir à nossa lista. Estou apenas mapeando para contribuir com cerco. Então isso é um mapeamento um-para-um. E estou tirando os “S “e consertando os plurais
e os singulares só para que um código seja auto-explicativo. Não devíamos ligar para esses países quando só temos um, certo? Estou só a tentar ter a certeza de que é legível. Tudo bem, e então nós vamos ver algo deu errado em nome do país get. Tudo bem, então vamos dar
uma volta para você ver que o get é muito simples, certo? Nós não queríamos lá e nós apenas pegamos a cota com algumas modificações. Potencialmente, não com ele. Então vamos ver. Então a primeira coisa que eu queria chamar a sua atenção é a documentação. Então, você vê API barra país e idiotice APIs barra país ID barra. Assim que o ID que está sendo exibido lá é cortesia da nossa anotação aqui. Tudo bem? E, em seguida, se aprofundarmos em seu, você verá que eles estão realmente vendo que o parâmetro ID é necessário. Não há duas maneiras sobre isso. É um obrigatório. Tudo bem? E se dissermos Experimente tudo, você pode colocar isso. Mas eu vou colocar, eu vou usar o Carteiro para testar este. Tudo bem? Então, quando eu digo ficar bem com carteiro e o mesmo endpoint e CSS e eu estou recebendo a origem agora obter, que é obter a lista. Não, quando eu modificar este ponto final e eu digo barra um,
tudo bem, e, em seguida, clique em enviar, olhar o que eu recebo caixa, então eu estou recebendo apenas um resultado. E esta é a identificação. E é a lista de hotéis que só
há um hotel associado ao hotel número um. Comece com o país número um. Só há um buraco no que é isto no IRI. Então, se houver mais do que todos eles serão listados sob essa propriedade ou atributo. E, em seguida, o nome é conta fictícia de short_name é GM. Então você vê que nosso segundo Git está funcionando. Então deixe-me colocar o nosso ponto de interrupção. E certamente exatamente o que está acontecendo quando atendermos a esse pedido. Então, colocando o nosso ponto de interrupção lá e, em seguida, clicando em enviar novamente, o ponto de interrupção é ativado. Se olharmos na listagem de parâmetros, vemos nosso valor, um chegando. Tudo bem? E então podemos ir em frente e eu vou usar F 10. Então, notícias se ele não entrar em todo o método causa que se eu olhar para um objeto país voltando, você verá hotéis e isso é pelo menos com apenas um id,
o nome, o nome abreviado, e então nós fazemos o mapeamento. Portanto, nenhum resultado tem todos os dados que estavam apenas no país. E, em seguida, ele vai retornar a todos k com resultados é automaticamente vai
desserializá-lo em serializá-lo em layouts JSON. Certo, e bem ali, terminamos com nosso segundo “get”. Então agora nós sabemos chegar a todos, e agora nós sabemos como obter por linha de base separados requisitos específicos.
21. Configurar os pontos de ponta para hotéis: Certo, pessoal, então estou apresentando um desafio para vocês. Quero que pause o vídeo. Sim, ele só começa, mas vá em frente e pause. E eu quero que você vá em frente e crie um controlador para os hotéis. Você pode ligar para o controlador do hotel. E a funcionalidade que acabamos de passar com o nosso controlador de país. Quero que você o reproduza no contexto dos hotéis. Então eu já o tenho aqui. Mas eu quero que você pare onde o vento passar por isso juntos. Mas eu quero que você pare a atividade para si mesmo. E então comparamos notas. Certo, Buck e eu somos Sagan Buck porque eu estou assumindo que você pausa o vídeo e sabe que você está retomando. E agora podemos passar por isso juntos. Então aqui temos o controlador do hotel e eu passei pelos mesmos passos. Eu cliquei com o botão direito do mouse em controladores, cliquei em Adicionar Controlador de Dados, controlador API
em branco chamado o controlador total. Eu fui em frente e injetei música sob os mesmos serviços que não estavam
no controlador de contato e inicializá-los no construtor? Não, tudo é praticamente idêntico. As únicas coisas que realmente mudaram onde meus nomes variáveis, porque obviamente eu não vou chamar este país se estamos recebendo hotel. Então, obter hotéis em vez de obter países receber tele, em vez de obter hotel x2 e semelhança, você gostaria de chegar a um hotel por ID. Outra coisa que eu gostaria que um ponto contado seria o mapeamento onde mapeamento para manter o T0. E a última coisa seria que eu meio que adicionei mais atributos. Então, como vemos esse atributo tipo de Éden, indica a arrogância de Elis. E eu quero dizer, ele dita o comportamento, mas swagger não depende de sua também para saber como LTL formula essa documentação. Então aqui eu estou deixando ela saber que este método produz 200. Também produz 500, porque se você se lembra, quando olhamos para a arrogância e ele voltou para 500, você teria visto algo vendo indocumentado por baixo desse erro 500. E assim queremos apenas ter certeza de que swagger contextualmente informa o máximo possível de informações para o desenvolvedor em qualquer momento. Então, e eu mencionei arrogância. Você vai ver o país da segregação diferente do hotel. Tudo bem? Espero que estejas a ver isto. E se olharmos para o hotel ou qualquer um destes, que os atributos eram ambos os atributos foram adicionados. Você veria que os 500 não estavam lá inicialmente e veria que os 200 nulos 500 não estavam lá inicialmente. Tudo bem, então isso funciona ou alguém usar o Carteiro para fazer alguns testes. Então eu ainda tenho meu teste desde o momento. E o problema é que com Bozeman, você sempre pode começar uma nova conta, certo? Então, em vez de usar uma banheira para mudar continuamente, eu queria ter uma para o gueto sem parâmetros e distribui por aqui. Então este não é um parâmetro que veja se isso funciona. Tudo bem, desculpe, eles não testaram meu código antes. Não, eu escrevi e não testei e fico feliz em ver que está funcionando. Tudo bem? E então aquele com o parâmetro que também funciona. E, por enquanto, isso é tudo o que há para configurar os nossos controladores. Tudo bem, então, por mais que você possa ter, é claro, variações e com base em contextos, certas coisas podem diferir. Mas temos um bom modelo sobre o qual podemos construir nossas operações Git. Tudo bem, então você pode ir em frente e apenas fazer isso fora. E então, quando voltarmos, estaremos empurrando nossas alterações para nossos repositórios.
22. Títulos finais e adicione mudanças no GitHub: Certo, pessoal, então estamos de volta ao nosso projeto e nossa tarefa hoje é simples. Onde fazer cisne para verificar em todas as nossas mudanças? Portanto, qualquer coisa com o nosso SDK teria sido modificado ao longo do caminho mais uma vez, e qualquer coisa com um sinal verde de mais foi adicionado. Então podemos ir em frente e ir buscar mudanças. E eu vou apenas atualizar o que eu não preciso atualizar, compartilhar todas as minhas alterações. E em vez disso, alguém colocou a minha mensagem. E minha mensagem é apenas deixar todos saberem que eu
adicionei o contorno e o hotel obter métodos também corrigir as unidades fora do trabalho
DI dependência referência porque lembre-se que fizemos essa modificação na inicialização. Então eu posso ir em frente e cometer tudo e afundar. E uma vez feito isso, estamos prontos para passar para o nosso próximo módulo.
23. Segurança à API - visão de seção: Bem-vindos de volta, rapazes. Nesta lição, faremos uma rápida visão geral
do conceito de segurança em relação à sua API de descanso. Agora, quando falamos de segurança, mesmo que seja uma espécie de auto-explicativo. Quando falamos sobre o que é segurança, temos que entrar em alguns detalhes ao discutir buraco, fazemos uma API segura. Agora, algumas dessas coisas já são levadas em consideração e saem da caixa com pelo menos a API Núcleo.NET. Eu realmente não posso viajar para outros frameworks de desenvolvimento de API. Mais uma vez, voltagem para a API .net, onde eles tipo de impor ou encorajar fortemente certas considerações de segurança desde o início da criação do projeto. E então cabe a você se você quiser continuar com isso é realmente e realmente eles fazem isso tão incorporado que você está fazendo amanhã perceber que toda a segurança pode estar fora da caixa. Portanto, o primeiro e provavelmente mais importante seria usar SSL. Portanto, o SSO é um SSL padrão, TLS. Existem padrões para comunicação HTTP e o que eles fazem é impor alguma quantidade de criptografia em todas as comunicações que atravessam o tubo, certo? Então, quando você está criando o projeto, eu acredito que havia uma opção lá para habilitar ou desabilitar SSL e bem, eu não trouxe muita atenção para ele. Mas se você quiser ver se SSL está habilitado, você sempre pode clicar com o botão direito do mouse ir para o projeto de réplica de propriedades, muitas propriedades vão para baixo para depurar. E então você veria aqui que habilitar SSL está lá por padrão. Então, mesmo no modo de depuração, eles estão encorajando você a usar SSL. E, é claro, quando você vai em frente e publica, você é incentivado a usar certificados SSL apropriados do AS. Caso contrário, você também tem acesso a um sistema de autenticação de usuário muito poderoso na forma de núcleo de identidade, que estaremos sentados, que permite que você autorize, autenticar, e digamos que missões de desinfetante baseadas sobre quem você acha que deve estar acessando sua API. Agora, você nem sempre precisa disso para uma API. Às vezes, sua API precisa ser acessível publicamente por todos e qualquer um. E então há algumas vezes em que alguém se inscreve para verificar quem
ele é antes que ele possa acessar informações com base em nossa API e não, qualquer um poderia ter acesso. A lista de hotéis são particular hotel agir vontade. Não há nenhuma restrição para autenticar e autorizar um usuário antes de permitirmos que ele faça isso, no
entanto, estaremos colocando coisas no lugar que nos
permitiriam tipo de controle quem tem acesso a um. Embora coisas como o que expomos em nossos URLs e quando dizemos URLs, quero dizer como Aqui estamos Lembre-se que quando queremos que ele chegue a um determinado hotel onde carregar o usuário topos que ID, isso não é dados confidenciais. No entanto, se foi algo como uma senha ou algo que,
você sabe, você não quer que o mundo veja, então você definitivamente não quer colocá-lo em apartamentos. E assim, a maneira como você cria, você tem uma maneira defensiva de projetar sua API de tal forma que você está implicitamente protegendo certas coisas. Então, com design ruim, você poderia introduzir falhas de segurança. Então, é claro, o que você permite ser a Páscoa tão bonita e leva os parâmetros de Laura. O que você silenciar É você criptografar ao longo do caminho todas essas coisas, ele, em tornar seu aplicativo seguro. Agora, com tudo o que foi dito, às vezes pensamos que precisamos ter uma coisa muito, muito segura para fora. Tentamos colocar todas as formas de segurança em nossa API, e isso não é necessariamente verdade, como eu sempre disse, o
contexto determina muito. Então eu vou dar-lhe um exemplo de uma vez que eu tive que
desenvolver uma API ou superior são propriedade de um terceiro. E o conceito era que esse serviço de terceiros fornecia alguns serviços de mensagens que minha empresa teria usado para vários aplicativos? - Não. O que não queríamos fazer era integrar o endpoint de terceiros em 5-6 obrigações diferentes. Porque se o fornecedor mudasse seu design ou algo assim, eles teriam cinco ou seis pontos de contato diferentes que teriam que manter. Em vez disso. Fui encarregado de desenvolver uma API que consumisse a API de terceiros
e, em seguida, os aplicativos internos consumiriam minha API de modo que, se o terceiro mudasse seu design, teríamos apenas o 1 para mudar porque todo mundo está consumindo nossa API já interna. Saber quando, quando, quando a empresa mencionou que, é
claro, a segurança estava muito alta na lista. E eu fui em frente e implementei todos os tipos de autenticação no Tolkien. E nós estaremos olhando para Tolkien também enquanto avançamos. Mas todos os tipos de protocolos de segurança e realmente e realmente foi exagero porque a API interna era apenas que era interna. Tínhamos listas brancas de IP e protocolos de proteção de rede
muito fortes torno do que estava operando internamente em nossa rede. Então, para ter um aplicativo interno precisa verificar quem é, a fim de acessar a outra API interna antes que ele sai para o terceiro. Tudo isso foi um exagero. Está nos dando um cenário onde eu pessoalmente, eu teria implementado algo que foi exagero. Depois de um tempo, construímos todas as coisas em excesso e tínhamos todos os protocolos de segurança para evitar o equilíbrio. Então, mais uma vez, o contexto determina muito. No entanto, para esta seção estaremos implementando a autenticação, significa que nossos clientes precisarão se registrar com nosso aplicativo, com nosso aplicativo API. E eles teriam que fazer login passando o nome de usuário e senha que eles teriam usado para se registrar. E depois disso, vamos assumi-los o que chamamos de JSON. Os tokens da Web são tokens do portador que terão informações que
nos informarão cada vez que fizerem um pedido de quem são
para que não tenham de continuar a iniciar sessão antes de poderem fazer as coisas que fazem isso uma vez, obter este Tolkien e passar esse token ao longo de cada vez para que verifiquemos e aceitemos ou negemos. Então é isso que vamos fazer nesta seção o suficiente do meu monólogo. Próxima parada, vamos estar criando nosso núcleo de identidade estão integrando núcleo de identidade em nosso projeto.
24. Configurar o núcleo de identidade de usuários: Ei pessoal, bem-vindos de volta. Então nossa primeira linha de segurança será para autenticação. E para implementar os recursos de autenticação em nossa API, vamos aproveitar as bibliotecas incorporadas de tomografia computadorizada. Então vamos fazer algumas modificações no nosso contexto de banco de dados, nossa inicialização e outras pequenas coisas aqui e ali. Então vamos começar com nossos contextos de banco de dados onde temos que alterá-lo de
ser contexto de banco de dados para nulo sendo contexto de identidade DB. Então esta é apenas mais uma classe que nos permite aproveitar esses serviços de entidade. E quando eu faço pontos de controle, você vê aqui que você tem a opção de instalar uma identidade
package.net se R em núcleo de trabalho diferente. Então, basta ir em frente e encontrar e instalar a versão mais recente. E então, uma vez feito isso, precisamos fazer mais uma modificação. Tour na criação de modelos, onde eu preciso dizer ponto BCE na criação de modelos. Tudo bem, então depois de chamar a mesma função na classe base, que é a nossa nova classe base, eu vou apenas passar ao longo dos objetos do construtor de costura que estamos usando no contexto de banco de dados atual. Agora esse é o primeiro passo feito. Vamos para o arquivo de inicialização e, em seguida, começar a fazer modificações aqui. Agora o que precisamos fazer é configurar nossos serviços de identidade para saber qual classe será usada para inferir as tabelas que serão geradas. Então, antes de seguir em frente, deixe-me recuar um pouco e explicar o que vai acontecer. Onde dizer a nossa aplicação desde o get-go que queremos usar nos deve serviços de identidade. É o que estamos prestes a fazer. Saiba que os serviços de identidade serão baseados em uma conexão de banco de dados para bem, uma conexão com um banco de dados que tem tabelas para facilitar coisas relacionadas à identidade, usa funções de armazenamento, declarações de armazenamento são conhecidas ambas as coisas. Então, o que precisamos fazer é configurar serviços de identidade para saber qual classe vai informar como a tabela de usuários deve olhar. E se potencialmente houver outro para papéis, regras de
detentor, vamos procurar, etc. Então, já incorporado é o usuário chamado nossa classe chamada Identity user. Tudo bem, deixe-me ir em frente e incluir,
digamos, ver se é um vidro legítimo que já está embutido, que pode ser usado. Nós olhamos para os detalhes do usuário identidade. Você veria que ele tem campos para locais e você não tem que vir aqui. Mas se você quiser chegar a esse ponto novamente, este controle clique e, em seguida, continentes ou controle clique até chegar a essa parte. Tudo bem? Então nós temos esses campos padrão que surgirão no banco de dados como você pode ver de ID, nome de usuário, e-mail e senha, hash senha, certo? Então, esses são campos comuns que qualquer tabela de usuário precisa ter seu lidar com o hash automaticamente. É tudo, sempre vai ter tudo isso embutido. Sem problema. No entanto, pode haver momentos em que precisamos de um pouco mais de inflamação de nossos usuários, em seguida, apenas e-mail, senha e nome de usuário potencialmente. Então eles nos permitem estender
a classe de usuário identidade e colocar em outros campos como fizemos o necessário. Então eu já meio que comecei esse processo em dados cria este usuário de API grama. Você pode ir em frente, clique com o botão direito do mouse em sua pasta, vá para adicionar novo usuário de API de classe E, em seguida, no usuário API, o que eu fiz foi herdar do usuário identidade. Lembrem-se que uma vez que a herança acontece, fizemos isso com os nossos detalhes mais cedo. Então estamos fazendo isso não, com administradores, é usuário, ele vai herdar automaticamente todos esses campos bem
como qualquer outro campo que eu veja que eu preciso. Então, neste caso, eu só preciso FirstName, LastName. Você poderia querer datas de nascimento iguais a um país de nascimento, código de
área, outras coisas, o que quer que seja que
você quer, você pode apenas estender esta grama e adicioná-los, mas ele sempre terá esses campos por padrão. Então, uma vez que você tenha essa classe criada, você pode fazer duas alterações. Antes de voltar para começar, eu queria adicionar essa classe como um contexto para o contexto de banco de dados, meus colchetes angulares e vendo o ano de contexto do banco de dados em relação à API utilizável porque por padrão é bom usar usuário de identidade. Então, se você não tem esse requisito onde você precisa de mais campos, então você não precisa dar esse passo extra. No entanto, seria bom fazer esse passo extra porque mais tarde, se você precisar estender, você pode fazê-lo sem muita dor de cabeça ou se apressar. Certo, então isso é mais uma mudança que podemos gostar. Contexto do DB. Não, precisamos configurar os serviços de identidade. Então eu poderia fazer isso a partir daqui, mas eu vou tipo de trazer mais uma jornada não, onde nós não queremos algumas vezes você não quer continuar colocando e colocar dentro e o início das pilhas é ótimo. E então você tem que rolar através de montanhas de aspas, um ventilador uma configuração. Então o que vamos fazer é ir até o nosso projeto para criar uma nova classe. Se você quiser colocá-lo em uma pasta, tudo bem, mas eu vou deixar a este nível. Então eu quero chamá-lo de extensões de serviço. E então dentro das extensões de serviço, eu vou ter um vazio estático público. E eu vou chamar essa de configurar identidades. Então esta classe vai ser como,
bem, é a extensão de serviço, digamos que eles vão configuração que passaria a sobrecarregar nesta largura de arquivo de inicialização, podemos abstraí-lo para isso e é chamado de método separado ME, bem, você verá Isso. Então eu vou dizer isso como um parâmetro, isso, e então eu serviço de coleta e chamá-lo de seus serviços. Inclua quaisquer referências ausentes. Houve um objetivo e, em seguida, isso não está disposto a dizer que eu preciso ter isso como uma estática. Gus, lá vamos nós. Tudo bem. Então, dentro deste método, eu vou ter um verbo, eu vou chamá-lo construtor. Então, basicamente construtores, haverá como amalgamação de nós construindo os mesmos serviços que teríamos adicionado aqui. Então, da mesma forma que você teria dito pontos de Serviços e você adiciona isso e aquilo. Podemos resumir isso a este copo. E agora nós apenas chamá-lo, ele está do outro lado, então você vai ver no devido tempo. Então vamos ser eu sendo r dot adicionar núcleo de identidade. E então estamos passando na classe de usuário. Então, mais uma vez estamos usando o usuário personalizado classe API usuário, API, usuário, certo? E então abra e feche a cinta. E eu só preciso incluir qualquer desaparecido ou referenciar seu objetivo. E então eu vou ter meu lambda Tolkien onde pode personalizar certas coisas sobre língua sagrada vai, interações
do usuário, eu posso definir meu escritor de políticas de senha. Eu posso ver que todos os bussers dígitos mais necessários ou têm um comprimento mínimo, usar caracteres únicos. Todas essas coisas estão bem ali, embora as caminhadas. No entanto, eu estou mais interessado em apenas certificar-se de que os meus usuários, assim q-dot usuário e exigem e-mail exclusivo é verdade. Certo, esse é um para um. Estou muito interessado em impor a retina. No entanto, você pode experimentar e você pode adicionar os outros que você acha que são necessários. Então essa é a primeira linha e então eu vou dizer construtor é igual a nova identidade. Então a maioria dos serviços virá com construtor especial, GAS em tias, tudo isso. Então eu vou apenas dizer construtor de densidade e incluir a referência que falta. Lá vamos nós. Então, novo construtor de identidades, me
dê o construtor, certo, então esse é o objeto que acabamos de começar, esse tipo de usuário. Tudo bem, então qualquer tipo
que foi especificado, o que foi busing lá, e depois digite fora porque eu quero usar rolos. Assim, da mesma forma que há um usuário de identidade embutido, há uma função de identidade integrada. Roland quer dizer que você é administrador, você é usuário, o que quer
que seja, é isso que o papel significa, certo? E depois de especificar essa linha deve estar lá, então eu sou passado para i serviços de coleta. Objeto sob a forma de serviços. Depois de tudo isso, não
vou dizer pontos construtores. E precisamos dizer onde ele deve estar armazenando são quais
necessidades são necessidades básicas para interromper para os Serviços de Identidade para marido. Então eu vou dizer o contexto base, certo? Então, o contexto de banco de dados que estamos usando como nosso banco de dados, estamos passando o objeto correspondente para isso. E mais uma terra para os provedores de token padrão. Eu disse que usaremos o livro de Tolkien mais tarde com as partes oficiais de Tolkien. Eu só estou colocando tudo isso lá. Então, apenas para o contexto, mais uma vez, este objeto construtor está realmente apenas dizendo, eu estou construindo tudo o que precisa fazer de cima para adicionar aos serviços. Isso é basicamente o que temos feito todo esse tempo. Então aqui nós dissemos Serviços, pontos, e nós adicionamos todas essas linhas e opções em curso não parece coisa seria uma política central e assim por diante. Então, agora que extraímos, extraímos todas essas linhas. Então este método ou para discutir e este método que eu posso saber na inicialização veja Serviços ponto na autenticação porque essa é a primeira coisa que eu preciso adicionar, autenticação. Tudo bem, há autenticação no núcleo também, mas eu estou usando na autenticação deles teve qualquer problema com esse até agora, então eu vou ficar com ele. E então eu vou dizer serviços, configurar identidade. Tudo bem, agradável e simples. Então os serviços não configuram a identidade é basicamente o que acabamos de fazer aqui. Então você pode começar a olhar para ele desta forma sempre que temos que adicionar em algo para a inicialização, se não é o único forro como este, talvez possamos começar com akin para extrair essas coisas para esse arquivo e ter o para enviar sobre o objeto sempre que ele é chamado. Não é o fim do mundo, mas pessoas diferentes gostam de ver coisas diferentes. Algumas pessoas, inclusive eu, que não gostam de ver arquivos inchados. E pelo menos quando você tem que muito código, você tem que estar rolando através do inimigo um pergaminho passado a configuração em cinco vezes e 40 perceber estava lá. Essas são as coisas podem ficar irritantes quando o seu, seu aplicativo em cresce. Então eu estou apenas mostrando uma maneira que você pode obstruir muitas linhas de código de sua seção de configuração e tê-lo em um espaço muito confinado. Então agora nós fizemos tudo isso, e nós fizemos tudo isso. O que queremos fazer é fazer uma migração para lado nenhum com ADICIONAR as tabelas para a identidade, senhor. Então o que vamos fazer é dizer migração de traço. Sabemos que esta parte, dizem usuário adicionado são adicionados identidade. Ele só coloca dessa forma acrescentou identidade. E uma vez que fazemos isso, chegamos ao nosso arquivo de migração. Então, agora, quando você olhar através, você vê os diferentes nomes de tabela que temos a tabela de intervalos ISBN, temos é tabela de usuários de amendoim. E se você olhar muito de perto, você vê que, além de todos os campos padrão que vimos anteriormente, nós também temos os personalizados que foram adicionados ao gás. Tudo bem, Nome, Apelido. Então ele vai brigar e ainda vai colocar em nossos campos personalizados. Tudo bem, do mesmo jeito e as regras. E se quiséssemos mais informações sobre linhas feitas isso, poderíamos ter adicionado uma classe personalizada, estendido seu, e teria sido o mesmo. Então vamos em frente e atualizar nossas necessidades obesas. E com tudo isso feito, terminamos nossa configuração para nossos serviços de identidade. Então você pode dar uma palmada nas costas. No entanto, a maior parte do que fizemos está em segundo plano. Se você em evidência tangível de algo sendo feito, você sempre pode verificar seu banco de dados e você verá as tabelas que foram geradas em conformidade. Tudo bem, mas nosso próximo passo é realmente configurar os endpoints de modo que os usuários podem
inflamação possível e se registrar como usuários de nossa API e também para que eles façam login. E depois disso, falaremos sobre como continuamos a verificar se
esse usuário deve ter acesso depois que ele o amou.
25. Ponto de ponta de registro para usuários: Porque bem-vindo de volta. Então, vamos continuar nossa jornada para configurar nossa autenticação para nossa API. E nós estaremos configurando esse ponto de extremidade para o usuário vaguear, uma distribuição e para fazer login e por autenticação de extensão. Não, eu já meio que trapaceei e fui em frente e configurei o novo controle para que você possa pausar, ir em frente e ficar atualizado, certo? Poderia controladores, mas cria novo controlador que está em branco e chamá-lo de um controlador contras. E eu já fui em frente e meio que comecei a fazer minhas injeções. Então, dois anos familiarizados com você estaria vendo pela primeira vez. Então você já conhece o madeireiro e o mapeador, então eu não preciso explicar isso em nenhum grande detalhe. No entanto, você estaria vendo o gerenciador de usuários e gerenciador de
login potencialmente pela primeira vez. Estas são duas bibliotecas integradas cortesia do núcleo de identidade. Então, quando você digitá-los, você pode querer incluir a referência ausente e você verá que eles começam a aparecer no topo. Agora observe que o contexto para o gerenciador de usuários e para o gerenciador de login é usuário API são qualquer que seja a classe de usuário personalizada que você
teria usado quando você estava configurando a identidade. Se você não usou um, então você continua a usar usos de identidade. Então, seja qual for a classe que você se sente como seu contexto em sua configuração, e esse arquivo de configuração estaria aqui. Seja qual for a classe que se senta aí, continua a usar a aplicação da garganta. Tudo bem? Então gerenciador de usuários nos dá acesso a um monte, nosso conjunto de funções que nos permite gerenciar, entrar, recuperar inflamação do usuário, eu tinha usuários. Então nós não queremos ter que escrever qualquer código personalizado para ser adicionando ou eu não tenho que ir e colocar em qualquer unidade de funções de trabalho para o usuário, interação tabela
usuário são relativamente interação. Todas essas coisas saem da caixa com o uso de dinheiro, basta entrar gerente e você tem outro chamado Gerente de Regras. Se precisarmos usá-lo, então usaremos. Mas eu sou apenas o adolescente ou a maioria dessas coisas são encapsuladas
nesses serviços que podem ser facilmente injetados em nossa aplicação. Então, agora que configuramos nosso controlador e injetamos tudo o que
precisamos, precisamos começar a escrever nossos endpoints são primeiro, endpoint vai ser para registro. Então, vai parecer algo assim. Assíncrono público, tarefa, ação e resultado. E o nome é Register. Para registro, uma vez que estaremos exigindo dados potencialmente sensíveis, não
será potencialmente exigindo nome de usuário, senha, e assim por diante. Eu não quero enviar isso através do tubo no parâmetro. Então nós discutimos isso no vídeo de visão geral onde eu vou vê-lo nisso. Usar o parâmetro é muito bom quando é algo assim, apenas uma identificação e nada para represar, certo? Mas quando você começa a pedir ao usuário para registrar e enviar informações confidenciais, você não quer apenas começar a ver e-mails de
string, senha de string, etc. Porque então tudo realmente se depararia em texto simples sobre o ponto final. Então o que vamos querer fazer é tornar este um post. Então nós, temos feito o trabalho com o verbo GET. Nós não fizemos muito trabalho ou qualquer trabalho com o correio. Então, uma postagem, assim como quando você está enviando um formulário na internet, quando você clica em Enviar para ir para,
digamos, inscreva-se no Facebook ou inscreva-se para algo online. Se você olhar no URL acima, não
verá nenhuma das informações que estão sendo listadas. Você só sabe que sua informação deixou uma página e supostamente foi para algum lugar e delta pH poderia representar isso é,
isso é o que é a operação pós-operatória. Certo, então a mensagem está encapsulada e meio que escondida de olhos curiosos. Quando o fizermos, ele é enviado através de quatro locais de implantes, assim como o que vimos aqui. Então não há razão para amarrá-lo. Então, é claro, quando a Índia com informações sensíveis, você não quer usar uma guitarra, qualquer coisa que não amarre a inflamação que está sendo enviada através. Então, com isso considerado, o parâmetro que vamos usar aqui vai ser um custo em um. Então eu vou colocar em uma anotação para dizer obter a informação do corpo. Portanto, o remetente precisa enviá-lo no corpo em vez de no URL e no corpo da solicitação. E então podemos especificar um tipo de dados que deve levar a informação. Então eu vou dizer usuário soberano detalhado cria um detalhe de usuário ainda, mas eu só vou dizer detalhes do usuário. Tudo bem. Então vamos em frente e cria este dto usuário. E então eu explicaria por que não funciona assim. Então, em modelos, clicamos em Adicionar classe. Estamos chamando o usuário precisa. E então os detalhes do usuário precisam ter,
no mínimo , os mesmos campos que precisamos para voltar ao nosso usuário do EPA. E dois, precisamos que o usuário forneça. Então é assim que eu estou projetando meus detalhes de usuário. Eles podem pausar, replicá-lo, mas eu vou orientá-lo através dele é de qualquer maneira, então FirstName, Sobrenome ao se registrar. Sim, a opção de passar esses dois campos. Repare que eu disse opção porque eu estou sentado nem como necessário. Temos o número de telefone. Então, se você quer contra a indústria ou número de telefone quando área, apenas dizendo para a API, mais
uma vez, não é necessário. No entanto, e-mail é definitivamente necessário e senha é definitivamente necessária. E, em seguida, para e-mail será realmente usar isso como o nome de usuário também. Então, se tivermos esse detalhe, como de costume, temos que ter certeza de que nosso mapeador sabe sobre o dto. Então inicializador mapeador, eu só vou ir em frente e ver esse usuário APA. E o usuário dto precisa saber um sobre o outro e reverter o mapa, certo? E é isso que vamos fazer. Então, o propósito do corpo aqui é ver que quando, quando eu solicito atinge este ponto final, você vai olhar no corpo da solicitação, não olhar na URL. Primeiro, não estou exigindo nada na URL. E dois, se o usuário passar alguma coisa na URL, eu não me importo. Não estou procurando nenhuma inflamação na URL. No entanto, o corpo da solicitação deve conter informações com campos que tanto para o usuário dto. Então eles enviam mais informações do que eu preciso. Será ignorado. Mas, no mínimo, devem enviá-los para que eu processe. Então é assim que tudo está ligado quando falamos sobre sanitizar os pedidos e tomar decisões com base no que está vindo através do tubo. Certo, então vamos voltar ao nosso controlador de cones. E então o que queremos fazer neste momento, e podemos fazer uma série de coisas. Então eu vou em primeiro lugar, tendência amou tentativa de registro NC veio para e eu copiei na Piazza, que é meio que me encheu. Mas vamos dizer tentativa de registro para o usuário dto, dot email. Tudo bem, então qualquer e-mail que veio sobre o dto usuário, isso é o que eu estou colocando lá. Então eu vou também verificar se o estado válido, se não é um estado válido. Então eu posso ver se modelos. Então isso é tudo o que verificamos formulários, certo? Se você fizer, se você tiver feito MVC e tonto ou apenas aprendendo API, é praticamente o mesmo processo. Estamos olhando para ver se o estado dos modelos é válido, certo? Então, neste momento, eu provavelmente diria que se não for válido, então eu fui devolver um pedido ruim. Isso significa que você enviou uma solicitação para se registrar, mas seu campo de validação, então você não incluiu o e-mail que eles não incluíram ou você não cumpriu quaisquer padrões que eu teria estabelecido para você em relação ao dados que você deveria ter enviado, certo? E então eu posso retornar o estado do modelo para que ele tipo de informar o remetente o que deu errado. Tudo bem, então se modelos estado não é válido, então nós fazemos isso. Caso contrário, podemos continuar a tentar. Apenas tente topo, topo, pegue essa exceção. Então deixe-me lidar com a exceção. Partes onde eu vou ver a seta de log, algo deu errado naquela seção de registro. E então, em tempos anteriores, o que fizemos? Voltamos com um código 500. Então, outro tipo de retorno que você pode fazer quando
houve um problema é literalmente o problema de retorno. E você colocou o mesmo tipo de mensagem. Para que eu pudesse colocar algo que deu errado. Tudo bem. E então diga que tem uma pontuação de 500. Então eu estou apenas mostrando a vocês que existem maneiras diferentes, você sabe, se você está olhando para outros recursos, você pode me ver fazê-lo desta forma e alguém retornando nosso problema, alguém está retornando o código de status manualmente. Há maneiras diferentes de fazer isso, certo? Mas, em seguida, para os que são built-in e eles já deram um método de que eu geralmente eu encorajo você a apenas usar esses. Então, cuidamos das situações ruins. Gostaria de dizer que se não estiver certo, faça isso. Não, o que faço quando está certo? Um, eu posso dizer var usuário é igual ao mapeador ponto mop em usuário API. E então eu estou mapeando detalhes do usuário. Então ele vai dizer, ok, muito todos os campos que já conhecemos. Sabemos como o mapeador funciona por um nulo. E então saiba que eu tenho o usuário. Posso dizer que os resultados var é igual a. E eu fui para o nosso peso, nossa chamada para meus pontos gerenciadores de usuários. E então aqui está, aqui está um monte de funções. Como eu disse, podemos fazer várias coisas. Posso dizer para criar uma cena. Então o gerenciador de usuários cria um coletor
e, em seguida, eu vou apenas passar os objetos de usuário. Tudo bem, então vá em frente e crie esse usuário. Ele irá automaticamente levá-lo para a senha, hash, armazená-lo, fazer tudo o que precisa fazer. Não precisávamos escrever nenhuma lógica complexa para facilitar isso, certo? Mas às vezes as coisas falham. Então eu vou dizer, se não resultado, não foi bem sucedido, certo? Então ele vai lhe dizer, se ele tiver sucesso não são, então eu também vou retornar um pedido ruim. Então vou dizer que algo deu errado. Desta vez. Não são as modelos, a coisa. Provavelmente é só uma flecha. Então a coisa é que o objeto resultado realmente lhe dá as setas. Se você realmente precisa listá-los todos para, você provavelmente pode colocá-los em um loop, listá-los, colocá-los em uma string e retorná-los se você quiser, se você quiser dar ao usuário tantos detalhes. Mas às vezes esses detalhes podem ser muito sensíveis, então você tem que ter cuidado com as informações que você está enviando ferramenta Bach, os clientes que estão chamando, certo? Então, neste ponto, eu só vou economizar solicitações de bateria. Era um 400. E é porque o usuário ou a distribuição em campo, isso é tudo que você precisa saber. Então tente novamente mais tarde porque isso pode ter sido minha culpa. Caso contrário, se você quiser, como algo sério teria lhes dado 500 anos e tudo mais. É do nosso lado que o problema é, e se é que você envia dados incorretos, então eu estou dizendo o que está incorreto porque um lema estados irá listar que grita. Tudo bem, e isso é praticamente tudo para a caixa registradora. Agora, uma vez que fizemos o registro, eu acho que podemos muito bem apenas fazer o login porque embora nenhuma maneira real de testar nosso login estatístico de registro. Então eu estou realmente indo apenas para copiar e colar este código logo abaixo. Mas o que precisamos fazer é mudar o nome da ação. Então esta é uma ação de login. Estamos usando a mesma necessidade de usuário TO foram retirados da mesma URL, do mesmo corpo, desculpe, ignorando qualquer coisa que venha na URL. E então o que vamos fazer é dizer tentativa de login para este usuário. Se for inválido, mais uma vez, restrições
de validação, e-mail, senha. Não. Uma coisa que podemos querer considerar é, precisamos do mesmo dto ou devemos usar o CMB TO para login e registro? mesmo princípio com os outros detalhes, certo? Porque para um login eu não preciso do seu nome, sobrenome, número de telefone. Só quero seu e-mail e senha. Então o que eu vou fazer aqui é rapidamente apenas fazer classe para dizer login ETO. E eu fui pegar esses dois campos, colocar em apenas o login porque é absolutamente necessário coisas de login Far. Mas então eu deixei isso herdar de logins. Assim, os campos são compartilhados em todo o quadro, independentemente. Tudo bem, então eu não deveria chamá-lo de usuário de login. Lá vamos nós. Deixe meu mapeador saber que é uma onda e o mapeador, Não, eu realmente não preciso deixar o mapeador sabível este porque a operação vai ser um pouco diferente. Deixarei os detalhes do usuário no Mapeador, mas não colocarei este e explicarei o porquê. Então, faça login detalhes do usuário. Então, mais uma vez, esta é outra parte da segurança quando limpamos exatamente o que queremos. Porque se o usuário pode ter incluído malicioso, desculpe, o cliente não está gritando com o usuário que está enviando a solicitação. O cliente que envia as solicitações pode ter incluído inflamação
maliciosa no corpo da solicitação. Ao fazer esta parte aqui, eu estou dizendo que eu estou apenas procurando campos que correspondem ao que eu tenho todos alinhado neste dto, dizer isso E mais informações do que eu preciso. Vai ser ignorado de qualquer forma. Então, essa é outra parte das considerações de segurança ao criar APIs. Então, obtemos o usuário de login dto. E então para o login, ok, bem, nós validamos. Ok, bom. Então vamos verificar o estado dos modelos e depois o que eu vou tentar. Então, nada mais para mudar aqui, exceto talvez as mensagens de registro para
ter certeza de que estamos representando com precisão onde assistiu Twin erroneamente. Tudo bem, então sob a trie, o que vamos fazer, eu não preciso fazer nenhum mapeamento, então deixe-me apenas remover o que está em tentar e começar do zero. Eu vou dizer var resultado é igual a, e este é o lugar onde usamos as senhas de ponto gerenciador de login assinar um coletor. Então você vê isso e você pode até mesmo fazer uma verificação. Você pode verificar para ver se a senha seria transportado as rajadas Australopitecine e, claro, que vai dizer realizada a situação neste momento. Porque queremos mesmo assinar, certo? Então, o login está vendo leva duas sobrecargas. Podemos passar em todo o objeto do usuário. Eu só peguei todo o mapeamento e a senha. Ou podemos escolher apenas colocar o nome de usuário e senha, que é o que eu vou usar. Então você vê que eu sou as duas opções. Então, se nós os mantivemos upping vai passar em todo o objeto de usuário, bem como a senha. Neste caso, isso é wiki embora. Então eu vou apenas dizer usuário dto dot, e estamos usando o endereço de e-mail como um nome de usuário e usuário dto dot senha. E depois é para assistência. Então vamos ler o que é persistência. Diz bandeira indicando se o cookie de assinatura deve persistir após o fechamento do navegador. Não. Eu isto é uma API. Eu não sei que tipo de aplicação está chamando. A API pode ser carteiro. Pode ser o navegador, pode ser um aplicativo móvel. Eu não preciso persistir em nada, então eu vou dizer falso. Tudo bem, e então o último, falha de Lacan, eu não quero bloquear ninguém quando eles falharem ao fazer login seria uma sobrecarga administrativa demais. Mais uma vez, o contexto é tudo, mas isso é o que nossos loops de código de login iluminam, nem o resultado será um objeto semelhante à tentativa de registro. Então, podemos apenas dizer se os resultados estão arrependidos, se não, resultado não bem-sucedido ou desculpe, isso é assíncrono. Então, quando falhamos em colocar a espera, então o resultado que vamos obter essas tarefas fora do tipo, não do tipo que estamos esperando. Então deixe-me ter certeza que eu coloquei Dewitt. E quando eu fizer isso, você verá que o intellisense me dá o que eu esperava. Então, se não for bem sucedido, deixe-me apenas verificar novamente o que fizemos quando não foi bem sucedido aqui. Depois dizemos, dizemos mau pedido por cima. Mas se não for bem sucedida, tentativa de login, não
é necessariamente uma resposta ruim foi
eu diria que são mau pedido ou o hotel diria que é não autorizado. Certo. Que é um para 01, se não estou enganado, certo, não autorizado. E eu provavelmente posso apenas retornar os detalhes do usuário para ver isso é o que eles tentaram usar. É não autorizado, sinto muito. Tudo bem. Caso contrário, se apanhar este fogo, significa
que está tudo bem. Então, vamos voltar. Eu poderia voltar. Ok. Já aceitei no passado, certo? Então qualquer coisa com 200 na faixa de 200 seria visto como um “ok”. Resposta. Então, OK. Como 200 você criou que é eu acho ferramenta para sim, eu aceitei que é pensado para et cetera. Você não precisa se preocupar em memorizar esses códigos necessariamente. Sabe que, em situações particulares, você quer usar este ou não tratado. Tudo bem? Então é assim que nossa função de login será parecida. E tudo bem, eu fiz uma mudança. Isto não é arte. Então vamos todos, o registro está vendo que nem todos os caminhos de citação, retorno de o. É por isso
que eu sinto muito que perdi este nó. Então lembre-se que você sempre tem que ter um fã outros retornos. Então, da mesma forma que dissemos que você ficar no Windows, este o que vai voltar aceito depois,
depois de fazer isso aqui. Então eu coloquei retorno aceito aqui em cima também, certo? Aceitei a sua tentativa de registo e, em seguida, está feito. Não. Antes de passar para o teste, eu queria trazer algo muito importante para sua atenção e que são as considerações de rotina para este endpoint onde estabeleceu que a regra seria controlador de barra api, neste caso, cones de barra API. Em tempos anteriores que dizem o controlador do hotel, teríamos determinado que não podemos ter duas operações get idênticas. O nome da ação é irrelevante, mas não posso ter duas operações. Como sendo verbos idênticos, o verbo pode ser o mesmo, mas então deve haver alguma nuance para uma implementação do verbo do outro. Nesta situação, eu tenho ambos como post. Ambos são postais. Mais uma vez, o nome aqui não importa o que eles são ambos posts também, que significa que se eu tentar fazer qualquer pós-operação vai não saber qual deles usar. Ambos são idênticos em termos do que esperam. A única maneira de
diferenciar esses dois é dar-lhes suas próprias raízes, certo? Então eu posso dizer que a raiz do registro é o registro. Tudo bem? E então a estrada para um login é login. De modo que nós, neste ponto, a única maneira de acertar o registro é dizer servidor barra api barra barra registradora. Como um pedido pós. Embora nós bater login é para ver qualquer barra api barra o login barra de dois pontos barra. Então eu estou especificando que uma rota para este endpoint é login e este é o registro. Agora nós, eles podem ter verbos idênticos, mas como existem locais diferentes, eles não interferirão uns com os outros. Tudo bem, então isso foi, que está tentando registrar um usuário bem rápido. Então, o que verificamos antigo, o que arrogância gerou para nós não acrescenta nada à sua chamada para identificação aqui e eu preciso lá. Eles são. Sem postagem, não obter, certo. E então se eu expandir, eles me mostrarão o que o objeto precisa. O olhar como o nosso Chan parecia quando ele está vindo através do tubo. Tudo bem, apenas para aqueles mesmos para login. Então você vê a diferença. Lembre-se que temos dois detalhes diferentes. Este tem senha de e-mail e os campos personalizados. Este. É preciso e-mail e senha. Então é isso que eu estava dizendo, que quando em uma situação em que você não precisa de todas as informações que você cria, eu preciso ceder para limitar exatamente o que você precisa nessa situação. Certo, então vamos tentar com a tentativa de registro. Então vou deixar aquele e-mail. Vou colocar uma palavra de ônibus que tem caracteres e um número. E eu fui deixar tudo em branco porque tudo o que eu realmente preciso do nosso e-mail e senha, no entanto, deixando estes como eles estão,
eles vão literalmente passar
por cima como String,
String e número de telefone. Então vamos ver o que acontece quando clicamos em Executar. É, esta tentativa está me dando um erro de 500. Portanto, esta teria sido uma das isenções que dizem que não pode resolver um serviço específico para o monitor de início de sessão. Tudo bem? Tudo bem, então o gerenciador de login está desistindo do problema e eu gostaria de entrar e solucionar problemas. Mas quando eu estou pensando é que eu realmente não preciso do gerenciador de login para esta API. E eu vou explicar. Então, quando eu coloquei em San no gerente e injetei e todas essas coisas, foi porque isso é como uma reação idiota. Sempre que temos autenticação para fazer, queremos todas as bibliotecas que podem ajudar com a autenticação. Tudo bem? No entanto, no caso de uma aplicação Web que
alguém enviaria tentativas de login através de um formulário, clique em Enviar e, em seguida, ser informado que eles são permitidos através de alguma mensagem ou alguma indicação que diz Olá nome de usuário. Isso é realmente o San no gerenciador criando algo como uma sessão ou um cookie com base na configuração de configuração para gerenciar essa sessão de usuário. Em termos de uma API, não
estamos dispostos a manter uma sessão para um novo usuário. Sim, o seu registo, o quê? Nós não sabemos quando você vai chamar o pulmão inteiro para a API. E não é como você vai ser um persistente dentro da API para 1R poucos porque o eBay vai aceitar o seu pedido,
dar a sua resposta em ser terminado. É por isso que estamos a usar o de Tolkien. Então eu não quero ficar muito, assim que eu me acertar e começar a discutir Tolkien. Mas por causa do Tolkien, nós realmente não precisamos do gerente de login no sentido tradicional
do que o gerente de Sign In faz. Então, eu vou remover todas as referências ao gerenciador de Sign In realmente. E eu vou comentar o ponto final de login para não. Então isso é controle, Casey, só um comentário. Tudo bem, então eu realmente não preciso de tudo isso só para chegarmos lá. Mas eu só tenho que me afastar e peço desculpas às vezes essas coisas acontecem. Mas vamos comentar o código e depois revisitá-lo mais tarde. Saiba como se relaciona com algumas das mensagens de erro que queremos enviar um Bock. O que eu vou fazer aqui é meio que eu tinha todo o lado da seta resultado. Você veria que poderia encontrar uma maneira de colocar as setas de resultados em um pacote e enviar alguém para dizer para cada erro nos resultados, erros. Não disse que não podia ser informação sensível. Então estou aceitando esse risco. Mas eu vou dizer que os estados modelo ponto e eu posso dizer adicionar seta modal, que então vai me pedir nossa chave. Eu não tenho que colocar a chave. E então eu vou ver o erro. Pontos, desculpe, erro é a mensagem que retorna do código de tentativa de resultado. Então aqui está o que eu faço. Coloquei o código como chave, certo? E então a chave aqui quer dizer qual é o nome da flecha. E então a descrição do núcleo estaria bem ali. Certo? Em seguida, podemos ver tentativa incorreta do usuário de solicitação falhou ou eles vão sentar o estado do modelo porque já é óbvio que ele falhou. Então é assim que procederemos com as mensagens de erro para o nosso registro nele. Então vamos tentar isso mais uma vez. Tudo bem, então use arrogância de pele com todos os logins e pontos. Mas vamos tentar colocar minha senha complicada mais uma vez e depois executamos. Tudo bem, e isso parece um pouco melhor. Certo, então primeiro não houve nenhuma reclamação sobre nenhum gerente de usuário ou um serviço de TI não sendo registrado. Isso é 12. Veja aqui agora nós estamos recebendo de volta um 400 e nós estamos recebendo de volta alguns detalhes como o relógio está errado. Portanto, em nome de usuário válido, nome de usuário,
em branco, em branco é inválido e só pode conter letras ou dígitos. Tudo bem, isso é porque fizemos um mapeamento, mas só estamos pedindo e-mail. O usuário de identidade real tem que ter um valor de nome de usuário também. Então, o que eu preciso fazer aqui é especificar o usuário dots nome de usuário é igual ao endereço de e-mail, então endereço de e-mail é obrigatório campo. Nome de usuário é um campo obrigatório e senha. Todos eles são campos obrigatórios pelo usuário de identidade. Então eu estava indo para fornecer e-mail e senha. Eu só vou em frente e fornecer o nome de usuário. Além disso, o que é o mesmo que o endereço de e-mail? Tudo bem, então vamos tentar isso mais uma vez. Tudo bem, e quando eu faço isso, e eu coloco os mesmos detalhes usuário no exemplo e senha um, olhar para fora enquanto nós temos, nós temos uma resposta 200. Tudo bem. E estava nos impressionando. Está tudo bem para ir. Por isso, não falhou. Não há nenhum erro de validação ou algo assim. Eu noto que ele diz em documentado para a ferramenta para glicose, nós não deixamos o controlador nem deixar swagger saber que a ferramenta para é um tipo de retorno potencial. Então lembre-se que fizemos isso com os outros controladores onde listamos todos os tipos de retorno potenciais. Então você pode ir em frente e replicar que no controlador doméstico Reino Unido, o estrangeiro sempre Cingapura, uma distribuição em processo. Sabe, você pode se decepcionar. Eles não estão conseguindo testar o login ainda, mas realmente não é um login. É mais que vai ser mais como um d muitas vezes, uma autorização para ver, ok, você sobre Tolkien e é válido, sim, você pode acessar o recurso que quiser. Porque mais uma vez, um login realmente é criar uma sessão e permitir que alguém acesse por um período. Enquanto o que eu tirei com uma API, não
sabemos por que período você pode precisar de acesso. Não precisamos facilitar por um período mais longo do que o necessário para processar sua solicitação e fornecer sua resposta. Então só queremos saber se você é inaceitável, acessador, validar isso, dar o que você quer e então terminamos com você. É por isso que vamos fazer os kits de ferramentas. Então, quando chegarmos lá, vamos em frente e hosho mais corredor restringir o acesso.
26. IMPORTANTE - correção de endpoint de do usuário: Pessoal, um adendo rápido para o que foi feito na atividade anterior, sentado sobre um ponto de distribuição e tudo o que funcionou. No entanto, quando percebi que meu usuário não tinha uma senha e isso é porque eu não coloquei esse pipe. Então, se você olhar para a função cria usuário, ele tem duas sobrecargas. Um onde ele apenas cria o usuário e outro onde ele pede que você o usuário e o pastor para ir com eles. Então eu não estou totalmente certo por que eles sentem a necessidade de atender dois, porque para mim um usuário tem que ter um analisador bots, eu acho que para diferentes situações, ele pode precisar armazenar algo ou não os outros. Então, vírgula do usuário e, em seguida, do usuário precisa cerco tomamos a senha para que possamos garantir que quando o gerenciador de usuários cria
esse usuário, essa senha também vai ficar hash e armazenado em seu registro.
27. Adicione papéis de usuário: Ei pessoal, bem-vindos de volta. Então, uma parte muito importante do usuário autoriza Sean é saber qual papel esse usuário é em um pontão. Não, nós não fizemos nada associado a funções, estávamos mais preocupados em obter as informações do usuário, validá-lo e se nós criamos o usuário não são. Agora, quando se trata de papéis, as funções que podem existir no sistema antes de o sistema ser usado. Assim, da mesma forma que nós teríamos estabelecido essas operações de semeadura para hotéis em seus países, menos importância realmente do que papéis seria assim por diante para ter certeza de que o lado rural lá desde o get-go para que quando os usuários começam registrando, as regras já estão lá. Então o que queremos fazer é vê-los, mas em vez disso vou semeá-los da maneira que vemos aquele país e hotel. Vou mostrar-lhe uma maneira que podemos abstrair essa operação partir de contextos de dB e manter os contextos de DB tão leves quanto possível, semelhante a Hollywood mostrou que você faz isso com nossos serviços que estamos instalando. Então o que eu vou fazer é configurar uma nova pasta, ter configurações estão em m. Basta ir em frente e adicionar outra pasta dentro disso e eu vou chamá-lo de entidades. Então configurações para qualquer coisa que esteja relacionada com a entidade dele. E então eu vou adicionar uma aula. E então eu queria chamar essa configuração de função de classe. Vá em frente e adicione. E, em seguida, essas classes de configuração de regra herdando da configuração de tipo de entidade I. E será do tipo, então O papel. Tudo bem, vamos em frente e incluir quaisquer referências que faltam. Portanto, ele não atinge a configuração rural ou que tem sido para ser associado com esse tipo de configuração. E é claro que temos que ir em frente e implementar o que quer que isso esteja vendo precisa ser implementado, que é nossa função configure. Tudo bem, então há também uma vez que você tem que entrar em possível ou o
construtor de costura que está em uso na criação de modelagem. Então, podemos realmente replicar o código que
temos onde dizemos ponto construtor tem dados. E então, em vez de Builder dot tem dados, podemos ir em frente e criar novos papéis, objetos neurais. Então deixe-me selecionar todas essas aspas. Tudo bem, então nova regra de identidade. E nós vamos apenas inicializar este objeto. Eu não vou dar a ele um ID, id zona
assustada, o nome que é chamado de um usuário. E nós temos que dar seu nome não-normalizado, que é realmente apenas uma versão maiúscula disso. Fora do nome, na verdade. E depois. Eu também vou dar-lhe administrador administrador, que é construído administrador. E então o normalizado é tudo CHEOPS, versão do ministério, porta, adicionar ministério. É sempre mesure os direitos gira de depuração agradável passado, mas soletrações, por isso não ser guiado me. Tudo bem. Portanto, não que tenhamos este método configure e quantas linhas você acha que pode precisar, você pode ir em frente e configurá-los. Mas a parte mais importante de tudo isso é quando estamos prontos para colocá-lo no sistema, precisamos apenas dizer construtor, pontos, aplicar. Desculpe, construir ponto dir, configuração fly. E então eu vou apenas dizer uma nova configuração de função. E, em seguida, incluir a loja de refrências desaparecida que Lee criou. E lá vamos nós. Então você vê que isso parece muito para mim, que parece muito mais limpo do que ter tudo isso. Lembre-se que a razão que se moveu a partir do topo aqui acima da lista era que era tão enorme uma função porque a seguir essas linhas. Se você quiser, você pode pausar, saber direito, e tentar criar outros arquivos de configuração para país e hotel. Tudo bem, então eu espero que você realmente tentou porque eu fiz isso. Tudo bem. Então eu não vou pedir para você fazer nada. Eu não vou fazer. Só para o caso de precisar de orientação. Fomos em frente e criamos arquivos de configuração por tipo. Tudo bem, então temos Holton, eu sou do país e onde quer que tudo Então nós criamos, rolamos juntos. Eu fiz país, mesma nomeação basicamente poderia copiar e colar código e assume partes
essenciais contra configuração que eu entidade tipo configuração em relação ao país, o contexto. E então o mesmo código que estava lá para criar os países que eu acabei de cortar e colar. Tudo bem, a única coisa é que no anterior nós tínhamos ponto construtor em t, algo assim e eu removi essa parte da entidade. Então ele diz que construir seus pontos tem dados para que você possa ir em frente e replicar isso no país e no hotel. E se você está fazendo suas próprias coisas em qualquer outro e não, você está na construção de modelos. Parece muito mais limpo. Tudo bem. E acho que vou colocar este. Eu realmente não tenho muito como onde em termos de ordem barcos fora de nós coloca na parte inferior. E já que essa é a ordem em que tudo estava sendo criado de qualquer maneira, então país, depois hotel, então nós temos as regras. Mais uma vez, esses dois são realmente opcionais em termos do que é realmente necessário para colocar um aplicativo em funcionamento, certo? Então, agora que temos a configuração de função estão semeando, podemos apenas adicionar migração e dizer regras padrão adicionadas. E, e arquivo de migração resultante tem duas entradas em nosso arquivo de regras. Então você vê gerado seu próprio ID. É por isso que eu não queria modificar isso. Mas então nós temos usuário e nós temos o administrador. Então, quando fazemos atualização de banco de dados, ele vai em frente e fazer a inserção. Assim que isso for feito, temos duas outras mudanças a fazer. Então, um está nos detalhes do usuário. Eu introduzi esta coleção de string tipo e eu estou chamando seus papéis, certo? Então estamos dando ao usuário a oportunidade de dizer qual função ou funções essa pessoa deve ter, certo? E, em seguida, no controlador de cone, logo depois de ter verificado se a tentativa de registro foi bem sucedida ou não, são a operação de criação do usuário foi bem sucedida ou não. Lembre-se, se ele vai além dessa afirmação, significa que foi bem sucedido. Então fizemos a etapa extra de dizer o gerenciador de usuários ponto, ponto, adicionar funções assíncronas. E estamos adicionando ao usuário que acabou de ser criado, a função que surgiu, nossas funções que entraram. Então, se você olhar para
isso, ele tem algumas substituições. Um anúncio sobre permite ou não sobrepor sobrecarga, desculpe. Então, o único soberano permite que você passe uma lista de papéis. E é isso. Vamos apenas reproduzi-lo e adicionar a este usuário. Assim, uma vez que todos existam, em
seguida, ele será associado com o usuário no backend. Mais uma vez, built-in função, não muito código ou esforço necessário em nossas partes. Vamos levar isto pela nossa velocidade. Então, em arrogância, você vê que eles estão modificando os valores potenciais, certo? Para que eles o demonstrem. Posso passar em uma matriz chamada regras. Então a ironia são os colchetes, enquanto um objeto é a chave encaracolada, certo? Então vamos tentar. E eu vou deixar este mesmo usuário não parece usá-lo para fora. Temos sucesso com a última vez. Tudo bem, então isso significa que eu deveria receber alguma mensagem de validação para ver que não deve funcionar o que eu vou passar no papel de usuário e quando executar. E então aqui está o que eu estou recebendo. Então o resultado é que eu tenho um pedido ruim de 400. E-mail duplicado é o problema. Já foi tomada para que a validação esteja funcionando. Então vamos ver. Usuário em hotéis. Hotel listing.com faz algo diferente. E esse é o usuário. Então eu vou em frente e executar. E o que estou recebendo não é uma resposta ruim. Tudo bem, isso parece bom. Então vamos ver o que aconteceu no banco de dados após essas operações. Então eu vou acabar com a execução, entrar no Gerenciador de Servidores. E em primeiro lugar, eu quero olhar na sessão de tabela de usuários de pelo
menos dois usos com base em meus testes até agora. E lá vamos nós. Temos EUA, lista
total e usuário no exemplo. Tudo bem, então isso é bom. O próximo seria os papéis. Então eu mesmo andaime as regras. Só vejo que a regra está dentro. Então estas são as regras que criamos. No entanto, a associação de função de usuário é armazenada aqui porque é um muitos-para-muitos. Então eles estão vendo que muitos usuários podem ter muitas funções, certo? Então é por isso que carregamos uma ária, porque talvez um usuário possa ser administrador e usuário, talvez um supervisor, etc, etc., baseado em um sistema. É tudo contextos, certo? No entanto, nesta tabela, quando visualizamos dados
, devemos ver o ID do usuário associado ao ID da função. Tudo bem, então se fôssemos voltar e verificar novamente, você verá que este é o ID do usuário. Lá vamos nós. E os oito, f, sete. Então, se eu olhar para esse mesmo ID de usuário e sendo ele se sete e a função 755. Então você tem que ir a este para ver qual é o 755, que é o usuário. Então, é tudo o que começamos a integrar a autorização
baseada em regras em nossos sistemas e em todos os nossos usuários. Quando eles forem registrados, seremos registrados com seus papéis apropriados.
28. Explore os computadores web JSON (JWT): Ei pessoal, bem-vindos de volta. Então Randall, Queremos começar a discutir nossos tokens web JSON, mas antes de ir em frente e implementá-los e estão em montanhas de belo código. Para fazer isso, eu quero vender uma compreensão completa
do propósito que eles servem em todo o fluxo de trabalho, a segurança da API e tudo mais. Portanto, há uma autoridade líder, pelo
menos no meu livro, eles são autoridade líder na forma de auth 0. Se não estou enganado, provavelmente há pioneiros para este tipo de protocolo. Mas você pode ir para JWT ponto IO e você pousar no CMP é que eu tenho aqui onde eles exibem para você alguns colocar Tolkien e tipo de mostrar-lhe o colapso. Então vamos discutir exatamente por que Tolkien são desnecessários e o que exatamente eles dizem basicamente quando, quando estão sendo decodificados. Então, deixe-nos ver. Mais uma vez, a pessoa tenta fazer login em nossa API, ou tenta acessar nosso recurso de nossa API. Temos acesso restrito. Então estamos dizendo a eles que precisamos saber quem você é e o que você é capaz de fazer. Mas então eu preciso ter certeza que você é alguém que deve ser capaz de acessar meu sistema para começar, certo? Então, nosso Tolkien aqui praticamente seria emitido para eles após uma tentativa de login bem-sucedida. Então eles passariam seu nome de usuário e senha que
já armazenamos em nosso sistema porque eles estão registrados. Uma vez que verificamos que eles são, quem eles dizem que são, vamos dar-lhes um token com informações que
temos sobre eles para que, quando eles estão fazendo solicitações subseqüentes, eles possam usar esse token em vez de tentar faça login todas as vezes. Então este Tolkien representaria um silêncio são uma representação codificada de todas as informações que
temos para eles que podem incluir seu nome de usuário, sua senha, sua senha, sua apologista, mcdr, sua nome de usuário, seu endereço de e-mail, se eles forem diferentes. Durante todo o tempo estamos permitindo que eles usem este token para acessar o sistema, que papel eles têm. E este outro chamado de reivindicações, o que significa que você é capaz de fazer isso que começa em vibrar. Então essas são as coisas que codificamos
nesta enorme cadeia de caracteres e enviamos de volta para eles depois de terem logado com sucesso. Ou os benefícios disso é que, do lado deles, eles não precisam continuar chamando o login porque lembre-se que não estamos mantendo a
decisão de saber se eles estavam conectados anteriormente ou não. Então, em vez de eles terem que tentar fazer login
toda vez que eles vão fazer uma chamada de API. Os de login obtêm este token e, em seguida, torná-lo em vez chamar com este token anexado a suas solicitações. Por outro lado, quando recebemos o pedido, vemos que existe um Tolkien, descodificamo-lo,
validamos que veio de nós e, validamos que veio de nós e seguida, redirecioná-los em conformidade ou fornecemos a resposta em conformidade. Então é isso que a segurança JWT é tudo um barco. E você vai ver que esta string é na verdade vermelho codificado por cores. Acho que isso vai dizer amor vendedor e soprou, certo? E praticamente comer seis x1 é o explicado o aqui. Então esta é a seção de cabeçalho que contém o algoritmo de hash foi usado, bem
como o tipo de Tolkien, que neste caso é JWT. A seção do meio tem a carga útil ou os dados. Então a carga é realmente para ver todas essas informações é o que eu sei sobre este usuário. Então, quanto mais informações forem incluídas, maior será a seção. Tudo bem, e à direita você vê aqui eles estão mostrando o que exatamente está incluído nesta carga. Assim, a carga útil pode ter levado a data de expiração do tempo Tolkien ou dayton, porque geralmente você emite um token por um período finito de tempo. Então, desde que este token seja válido, então eles não querem difícil de fazer login novamente, certo? Assim que for inválido, eles podem querer fazer login e obter nosso token novo e, em seguida, continua. Então é isso que deixa o propósito que se serve. E então os piratas sabem com a assinatura. Normalmente, o servidor usa a parte de assinatura para verificar se o Tolkien contém uma informação válida ou não. Então, se emitirmos o token e gostaríamos de verificar se ele veio de nós porque qualquer um pode realmente codificar esse tipo de dados. O que eles queriam ter certeza de que eles têm, não ouvir codificado em relação à nossa chave de emissão para garantir que ele realmente veio de nós e é válido em nosso sistema. Então eu espero que isso esclareceu algumas das, digamos que as áreas cinzentas são o que JWT não está ciente de usá-lo. Quando voltarmos, começaremos a mudar ou configurações em nossa API para facilitar seu uso.
29. Implementar a autenticação do JWT: Tudo bem, pessoal, vamos voltar. Então vamos pular direto para a configuração de nossas configurações para o nosso JWT. Então eu vou criar uma nova seção em nosso arquivo de configurações. Vou chamar-lhe JWT. E basicamente estamos indo para codificar alguns valores que sabemos que vamos precisar ao longo do caminho ao emitir e validar. Tudo bem, então eu vou dizer emissor. E isso significa que eu sou a autoridade emissora. Então você pode colocar seu nome de aplicativo ou seu nome de domínio, o que quer que seja. Eu só vou dizer o nome maiúsculo aqui, OTA listando PA. Então, isso significa apenas quando um JWC JRR Tolkien vem com esta questão ou eu vou prestar atenção? O que você verá mais para isso mais tarde. E há outras coisas que você pode colocar aqui. Você pode colocar como o tempo de expiração das predefinições. Na verdade, você pode colocar uma chave aqui porque há um valor chave que vai ser usado para resolver o Tolkien. No entanto, geralmente falando, você não quer colocar essa chave no arquivo de configurações do aplicativo por motivos de segurança, certo? Então, se você colocá-lo lá, então alguém pode ver o
arquivo de configurações do aplicativo e descobrir a chave que está sendo usada. Estou colocando um vale GUID aqui, mas isso pode ser o seu nome ou qualquer outra coisa. Portanto, é algo que você precisa usar para verificar nossa chave de janeiro. Tudo bem, então alternativamente, em vez de colocar algo que é sensível dentro do arquivo de configurações do aplicativo, porque você não quer muita informação sensível neste arquivo. O que você poderia fazer é criar uma variável de ambiente. Agora, é claro, se ele cria sua própria máquina de desenvolvimento, então você tem que ter certeza que você criou também no servidor quando ele é implantado. Então, uma maneira rápida de trazer o ambiente ou configurações ou a variável de ambiente é trazer um prompt de comando, medir o modo de administrador de urina. Então, se é que isso aconteceu em
uma máquina no trabalho onde você não tem privilégios administrativos,
então você tem que se certificar de que você inclua isso em suas
notas de versão para que os administradores de sistema sejam engenheiros de DevOps, Quem está fazendo o destacamento sabe o que fazer. Então eu vou dizer set x. E mais uma vez, esta é uma variável de ambiente então divulga para o nível de janelas. Então, a menos que um hacker fosse, alguém malicioso foi capaz de acessar o real e fazer
login na máquina que provavelmente nunca verá esse valor são a arte do esqui. Então eu vou chamar esta chave, dar-lhe o valor. Então, mais uma vez, isso não é bom. Isso é que eu gerei. Já é complicado o suficiente. Não tem necessariamente de ser tão complicado. Mas mais uma vez, é um contexto, é tudo, certo? Então, seja qual for o valor
que você colocar lá, você apenas certifique-se de envolvê-lo entre aspas. Deixe-me fazer isso. Então chave aberta aspas o valor fechar aspas barra m e m, basicamente dizendo que deve ser uma variável de sistema e não uma variável local. Então é por isso que você precisa. Certifique-se de que seu administrador, para que você vê-lo foi salvo. Tudo bem, alma e tudo mais. Nós temos que configurar. Podemos ir em frente e criar nossa extensão de serviço porque precisamos estender nossa inicialização. Então, mais uma vez, em vez de fazê-lo aqui, vamos apenas passar para extensões de serviço e criar um novo método. Este vamos ter um vazio estático público. Então eu vou apenas copiar isso em dois, apesar deste bart e dizer configurado dW t. E então nós estamos tomando os mesmos parâmetros dos serviços. Mas então nós também estamos tomando a configuração I. É a configuração que nos dá acesso
às configurações do aplicativo ainda para Fred, para um pequeno contexto disso. Quando nós, deixe-me ver. Então você vê aqui nós dissemos configuração, obter cadeia de conexão, configuração oi, certo? Então é isso que estamos nos referindo aqui. Estive imaginando mostrado. Então vá em frente e flua qualquer coisa que esteja faltando. E então dentro deste arquivo é onde pedaços de magia vai acontecer. Então, vamos dizer var configurações JWT é igual a. E então eu vou chamar a seção de ponto de configuração get. E a seção que vamos receber é sessões JWT. Tudo bem, então é isso que me deixa verificar isso. Oh, são os apologistas do JWT. Eu chamo de JWT. Tudo bem. Isso está dando uma seta e eu acho que é porque eu incluí em torno de bibliotecas para que maduro, que é novamente I configuração. Não quero extensões que configurem e não a pessoa suprema. Deixe-me tentar de novo. E lá vamos nós. Sem flechas, todos os direitos. Então a chave secreta, não, eu vou dizer var Ki é igual a e então eu posso chamar um ponto de ambiente, obter uma variável de ambiente. E lembre-se que definimos o nome desta variável de ambiente, só sei que eles estão trazendo fivela meu prompt de comando. Eu coloquei para C0. Então, o que quer que você vai usar lá é o nome da sua variável de ambiente. Então t. Em seguida, queremos dizer um ponto de serviços adicionar autenticação. Então, vou adicionar opções de autenticação com opções. Desculpa, deixa-me ver isto. Então eles dizem OPT ou você só diz tudo menos o lambda. E então eu vou apenas abrir e fechar chaves porque nós temos algumas configurações que nós estávamos indo aqui. É sempre que você tem várias linhas, agendas abrir a chave e, em seguida, cada linha termina com um ponto-e-vírgula, alguém para dizer todos os pontos padrão esquema de autenticação x0 igual a. E então eles têm padrões de cerveja JWT, alma, o que não está aqui. E eu acho que eu preciso de algumas bibliotecas ou músicas de. De New fica. Então deixe-me apenas verificar os barris de então lá está. Necessidade de incluir a Microsoft está sendo a autenticação principal, o JWT Bureau. Então vamos em frente e pegamos isso. Saiba que está incluído JWT Birra padrão esquema de autenticação de pontos. Então isso está basicamente dizendo que eu estou adicionando autenticação para o aplicativo. E o esquema padrão que eu quero é o JWT. Certo, então fora do mas alguém tentar autenticar, verifique se há uma ficha de portador. Isso é basicamente o que isso está dizendo. E então esquema de desafio padrão é a mesma coisa. Certo, então verifique se há autenticação e desafio. Seja qual for, seja qual for a informação, desafie-a com base no padrão JWT. E estender ciente é que eu vou apenas remover o ponto-e-vírgula por um tempo. Então eu queria ver na próxima linha ponto adicionar JWT portador. E então esta outra vez vai ter opções. Então eu vou fazer o meu Lambda Tolkien e, em seguida, abrir e fechar a chave encaracolada. E a imagem é corrigida a indentação, certo? Então dizemos todos os parâmetros de validação Tolkien ponto. Portanto, existem alguns parâmetros que você pode configurar ao longo do caminho. Cada pessoa pode ser diferente. Mais uma vez, a instituição pode ser diferente. Então o que eu estou fazendo são aqueles educativos, mas em seu ambiente empresarial, você pode ter outras necessidades além do que eu vou retratar aqui. Então, se essa for a sua situação, então você age de acordo, certo? Então, um novo parâmetro de validação Tolkien. E então nós vamos saber que todos descrevem alguns dos parâmetros que vamos querer
usar para validar que este Tolkien, você sabe, deve conceder acesso a alguém. Então aqui podemos
ver, Queremos validar quem emitiu o Tolkien? Geralmente é uma boa ideia. Considerando que passamos por todo o trabalho de dizer que aqui é o emissor. Então isso significa que se alguém colocar algum outro valor lá, então nós estamos dizendo, bem, se eu conheço os valores lá, então ele deve ser inválido. Boolean queria validar a vida toda, certo? Assim, rejeitaremos o Tolkien se
for se expirar, será automaticamente rejeitado. Então, você quer fazer isso? Sim. E, em seguida, outro que provavelmente queremos fazer é validar o problema ISU ou chave de assinatura. E já estabelecemos que esse era o valor chave aqui em cima, certo? Assim por diante para ter certeza de que é sempre a chave de assinatura correta. E depois continuamos. E depois fui ver um emissor válido. Ou o emissor válido para qualquer Tolkien dado seria configurações JW, configurações JWT, que é uma seção condenado. Obter seção, tudo isso. E então seria emissor, certo? Portanto, seu valor é definido para o emissor. Quero o valor do ponto, o objetivo deles. E, em seguida, vamos ver a chave de assinatura do emissor é igual a uma nova simétrica. Então, não, nós vamos ter hash. E então, e é por isso que eu disse que pode ser um vale complicado, não necessariamente tem que ser porque quando ele vai
configurá-lo, ele vai, nós vamos ser hash ele de qualquer maneira. Então você diz nova simetria, chave simétrica de segurança. E depois codificamos. Então você vê, mesmo com o meu
muito, muito complicado que foi baseado em um vazio, nós estamos codificando isso e então nós vamos hash novamente depois. Tudo bem, então como eu disse que não tem necessariamente
que ser tão complicado tanto codificar W2 se conseguir por sua ou dividi-lo em bytes. E então passamos o valor chave que obtivemos do meio ambiente. Então, as partes mais importantes do que é a chave, não colocá-lo nas configurações do aplicativo, certo? Está vomitado, pode ter ido para lá. Mas, você sabe, para ter muita cautela. Você coloca isso nas variáveis de ambiente. I Alf coloca nas configurações do aplicativo antes, mas então isso foi muito aplicação interna e não é necessário para o público enfrentando ou e por isso vamos apenas ir em frente e incluir quaisquer referências ausentes lá. E então eu acho que isso é apenas sobre isso para parâmetros de validação bala mais uma vez, baseado em sua situação, você pode precisar de mais validações do que estou colocando aqui, certo? Então isso é tudo que eu vou usar,
ponto-e-vírgula, ponto-e-vírgula, e então é isso para nossas extensões. Então, não, podemos passar para a inicialização e
podemos chamar nossos serviços JWT configurados ponto JWT configurado. E temos esse objeto de configuração sendo passado pela linha, certo? E então nós meio que paramos Bill apenas para ter certeza que tudo é mais suave bem-sucedido construção nós podemos continuar com nossas tarefas. Então a próxima coisa que eu queria fazer é criar algumas funcionalidades para a validação e a emissão do Tolkien, certo? Então eu vou subir,
quero dizer, apenas colapsar tudo no projeto está em. E, em seguida, no nosso poço, eu repositório e repositórios. Então o que eu vou fazer é criar outra pasta chamada serviços. Eu só queria ter certeza de que tudo está bem, segrega seus relógios inconscientes. Então os serviços seriam para extensões, certo? Fui adicionar uma nova turma. Na verdade, sinto muito. Devia ter dado o nome a este gerente de olho. Então eu adicionei uma nova classe chamada “off manager”. Você acaba fazendo exatamente o que eu Adidas renomeei o arquivo e ele será automaticamente, automaticamente renomeado isso. Mas então desculpe, não é uma aula, é uma interface. Lá vamos nós. Então, nesta interface, eu queria ter uma tarefa que vai retornar booleano. E eu queria chamar isso de validar usuário. E, em seguida, isso vai levar o usuário login dto divulgação. É o usuário Nietzsche. Oh, bem, propósitos de uniformidade. E vamos em frente e incluir quaisquer referências faltantes, como de costume. E então eu vou ter outra coisa que vai criar e devolver o Tolkien, alguém de lembrar que ele cria Tolkien. Tudo bem, então eu preciso de uma aula para consumir essa leitura. Alguém vai em frente e eu não quero chamar este gerente. Esta é na verdade uma classe que vai herdar de seu nome de interface, que então vai ver esses implementos, os métodos que você me disse que eu deveria ter. Antes de seguir em frente, temos que nos certificar de que registramos nosso serviço em nosso trapper de botas aqui no arquivo style.css. Então vamos apenas dizer um serviço que as probabilidades pegaram e ter olho fora gerente mapeado para fora gerente. E estamos mais uma vez a adicionar esculpir. Então isso é muito importante. Então vamos criar esse Tolkien. Então, dentro de fora do gerente, eu vou colocar aqueles dois. Vou injetar coisas de ferramentas. Então eu preciso do meu, Em primeiro lugar, Eu preciso do gerenciador de usuários, que eu posso facilmente obter de cones, meu endereço. Preciso daquela instância exata do gerenciador de usuários, certo? E vá em frente e inclua a referência que falta. E também precisarei injetar uma instância do Gerenciador de Configurações. Então vá em frente e faça as apresentações dela para isso e depois termine a injeção. E uma vez feito isso, podemos continuar. Então vamos começar com a validação do usuário. É uma fruta mais baixa pendurada. Então vamos lidar com isso primeiro, certo? Então, quando queremos validar, o usuário basicamente diria, nós queríamos continuar a dizer Aqueles que este EUA existe no sistema e o analisador é adquirido? Há. Então eu posso dizer var usuário Z igual a aguarda, usuário manager ponto encontrar pelo nome um dissipador. E então lembre-se que para esta multa pelo nome basicamente significa fã pelos EUA na Índia é, ele está pedindo o nome de usuário. Eu estava usando o endereço de e-mail como um nome de usuário. Então só estamos pedindo o endereço de e-mail para dto,
mas em todo o sistema é onde a história que tem um nome de usuário também, certo? Então eu posso ir em frente e fazer isso. E isso está dizendo, oh, então oh, isso significa que eu preciso da minha assíncrona, certo? Então, sempre que você irritar, você lê uma declaração perfeita de
espera e você ainda está na linha vermelha. Apenas verifique duas vezes. Se você tiver o assíncrono, ele tende a cortar. Com a prática, torna-se permanente. Então, depois de verificar se temos telefone este usuário, então isso está disposto a retornar aos usuários objeto no armazenamento aqui. Então eu vou ver, e eu vou apenas, em vez de escrever uma declaração if, eu vou apenas escrever como um operador ternário para dizer usuário não igual a null. E então apenas verifique novamente. Este não é o esquema de Turner e isto é apenas uma afirmação lógica. Portanto, retorne se o usuário não for igual a null. Gerenciador de usuários ponto verificar senha assíncrona. Eu sempre digo senha do usuário. Desculpe, não usuário, detalhes do usuário. Porque não sabemos o hash da senha. Então o usuário dto dot senhas, então isso é automático. É preciso entrar para ver se esta senha é válida para o usuário que está sendo verificado. Então, se devolvermos alguém com um nome de usuário e a senha for válida, isso retornará verdadeiro ou falso baseado no pente antigo, tudo isso. E o que estamos perdendo aqui é tudo o que precisamos para usar nossos objetos. Então eu preciso de usuário como, usuário precisa se render campainha, vá. Então ele vai verificar a senha, ver se é válida e desordenada. Você teria algo se esse nome de usuário existisse e então saberíamos que é um item de usuário válido. Escutemos o que acontece na operação de criação de Tolkien. Então, aqui queremos criar um objeto para atribuir credenciais. E eu vou pegar o que vamos chamar de reivindicações. E acho que preciso incluir os amigos dela. Tudo bem, assim por diante, criar porção Tolkien ou queremos fazer algumas coisas para criar algumas credenciais de assinatura para obter reivindicações, e então queremos adicioná-los à opção token. Então eu só vou escrevê-los linha por linha. Obter a assinatura, obter as credenciais de lixar, obter canadenses, e então criar opções de Tolkien, tudo bem, onde eu vou estar, nós temos que criar esses métodos tão adoráveis que existem terras, certo? Não. Mas no final da operação, vou dizer para devolver a nova segurança do JWT. E mais do que isso precisa de algo assim fez OUT manipulador de token de segurança, que é para, então nós temos que incluir este modelo de identidade, ponto JWT de
Tolkien, isso, e isso é um método ou uma classe ou não. Certo? Tolkien, que também é um método, mas leva as opções de token. Então, o que quer que tenhamos de volta aqui é baseado no que temos de volta aqui e a BSL teria senão ali. Tudo bem, então vamos começar com este. Então eu vou apenas passar o mouse sobre ele e gerar o método para ele. E pode ser privado, então você não precisa dele para ter nenhuma operação pública. Então, estamos recebendo as credenciais de lixamento. Então a primeira coisa que preciso fazer é pegar a chave. Tudo bem? E vamos fazer uma operação semelhante à que fizemos nas extensões de serviço para obter a chave. Então ele simplesmente passou e copiou e colou essas duas linhas. A chave começa, é obtida
da variável de ambiente e, em seguida, codificamos para obter segredos. E a próxima coisa que vamos fazer é devolver novas credenciais de assinatura sãs. E isso vai ter os segredos. Então segredo aqui seria a versão codificada ou sua vírgula secreta. E então nós informamos que o algoritmo de segurança usado para isso foi o dente de serra H M 5-6. Tudo bem, lá vamos nós. Então isso é cuidar de credenciais decrescentes, certo? Não, vamos fazer as reivindicações. Então eu só vou passar o mouse sobre esse, fazer o mesmo gera stub método para ele. Tudo bem? E então em diante, eu só notei que este é do tipo objeto, então eu vou tornar muito explícito que ele está assinando credenciais. Esse é o tipo de retorno, certo? Tenho certeza que o objeto teria funcionado o que eu gostaria apenas de
ter certeza que tudo está fortemente digitado. Então, este aqui, deixe-me ir em frente e fazer uma pia. E precisa ser uma tarefa que vai retornar uma lista de reivindicações. Certo, então a razão pela qual temos que passar por tudo isso é nossa reivindicação, em vez de reivindicações. Há um que temos que passar por tudo isso. Os tipos de réu que dissemos var para explícito em cima aqui, então teria inferido que tipos de retorno os portos, barcos. Porque nós dissemos var, ele não sabe, então está sendo muito vago. Tudo bem, então vamos em frente e pegar as reivindicações. Então vou declarar uma nova lista. As reivindicações Var é igual a uma nova lista de reivindicação do tipo. E vamos adicionar um novo nome. E então a coisa alega é que estes, estes são os pedaços e pedaços de informação que realmente dizem quem são o que você pode fazer, certo? Então, eu afirmo que isso é alegado ser capaz de fazer isso. Então essas são as coisas que queremos ter certeza que estão incluídas em nosso aplicativo ou em nosso kit de ferramentas. Então o primeiro tema que eu queria adicionar é o ponto de tipos de reivindicação. Eu fui olhar, há um monte de 0s e eu sou tão estes são todos os tipos de reivindicação que estão lá. Veja papel é lá você pode adicionar várias regras, e-mail, todas essas coisas maravilhosas, certo? Alguém quer ver o Nim. Nim geralmente significa nome de usuário, e-mail, auto-explicativo, etc Então, se eu disse que eu queria que ele ou limpar
o nome do tipo, o nome do usuário que foi apenas validado que alguém está fora para mudar algo aqui. Então eu estou mantendo os usuários locais de validade usuário, o que significa que então eu teria que tentar passar isso junto. Então, o que eu vou fazer aqui, criar outra variável aqui do tipo usuário APA, e eu vou chamá-lo de usuário. E, em vez de localizar o usuário em invalidar, eu só vou fazer isso assim por diante. Onde, no contexto desta classe, teremos acesso aos dados do usuário. É ideia dele, certo? Então vamos continuar. Então o nome é Lynn para vir do usuário dot e nós vamos apenas usar,
bem, nós podemos usar nome de usuário, certo? Como por falta. Então, em uma situação em que você não estaria usando o e-mail como o nome de usuário, então você tem o nome de usuário para usar como um nome limpo e mínimo. Você gostaria de ter isso, certo? Então podemos dizer linhas var. E então podemos nossos pesos. E use o gerenciador de usuários para obter as funções para os usuários. Então, há uma pia rolando. Lá vamos nós. Eu iria apenas passar para US AS ele vai automaticamente ir buscar todas as regras para este usuário e devolvê-los na forma de lista. Lá vamos nós e listamos. E, em seguida, para cada um daqueles que querem adicionar,
então, para cada regra em funções, queremos adicionar essa afirmação. Então eu posso ver as reivindicações ponto. E então eu vou apenas dizer nova reivindicação da mesma forma que fizemos aqui. E apenas dizer reivindicações que adicionar novo limpo, mas, em seguida, tipo de clique seria função. E então a regra voltando à ordem ou a ser adicionada seria regida pelo nosso ciclo. Tudo bem, e depois de tudo isso, e nós construímos e mais uma vez, com base nas reivindicações que você deseja colocar em, você pode ver todas as possíveis reivindicações aqui. Você pode colocar quantos quiser, certo? Uma vez que eles são feitos você pode apenas devolver as reivindicações. Então esse é o Troodon e mais um, certo? Então eu vou apenas gerar este método, ainda sei qual vai combinar as credenciais de lixamento e
as reivindicações e criar o Tolkien real a ser emitido para o usuário. Tudo bem, então aqui o tipo de retorno seria do tipo JWT segurança. Tolkien escreve, JWT segurança Tolkien, no entanto, para que sejamos muito explícitos sobre o que deveria ser. Agora, em vez deste método. Nós vamos estar vendo aquele var. Então eu tenho que fazer as sessões. Var configurações JWT é igual a, e eu realmente não quero redigitar isso. Deixe-me ver se eu consigo apenas obter o rápido aqui. Indiscutivelmente, eu poderia ter retido, mas tudo bem. Configurações Var é que, embora dizemos opções var são opções
Tolkien é igual a nova segurança JWT Tolkien. E então temos que usar este construtor. Então, ele se deu conta de um, é claro. Então vamos preencher certos parâmetros. Então eu fui especificar que o emissor que eu quero está vindo
da seção Configurações JWT para o válido você facilitar o seu apenas como o que tivemos aqui, que é o problema que queremos. Então colocamos isso como um problema. Se lá o próximo seria as reivindicações. E então as reivindicações viriam da nossa lista. Reclamações, retiradas, empréstimo de chefe nos parâmetros aqui, certo? E então queremos definir a expiração. Digamos que a expiração é sempre boa para se sentar. Então ele realmente pede para você um valor expira. Agora você pode definir 15, incluir set 10, mg, e poderia fazer isso. Ou você pode apenas modificar o arquivo de configurações e definir o valor lá, certo, então como é para onde todos os meus valores codificados estão indo, eu vou apenas mantê-lo uniforme. E então eu vou apenas dizer obter esse valor do arquivo de configurações. Está na seção chamada “Lifetime”. Então isso significa que este valor, este Tolkien uma vez, uma vez criado, só
será válido por 15 minutos. Isso é certo. E então as credenciais de lixamento, que já definimos ou realmente passadas, estariam aqui. Agora, uma vez que tudo isso estiver feito, vamos em frente e voltamos. Nossas opções são, deixe-me citar isso mais, mais apropriadamente. Este é o símbolo porque esta é a criação do Tolkien ou devolvido a Tolkien. E então esse é Tolkien, certo? Em seguida, serializá-lo em uma string e retornar essa string null. Fizemos um bom trabalho aqui. E a única coisa que provavelmente precisamos fazer depois é ter certeza de que nós e eu sinto muito, eu estou vendo um erro aqui com a configuração. Era a sua própria. E certifica-te de que tenho a bolha certa construída. Então eu vou dizer e que nós fizemos um pouco aqui para colocar nossas coisas Tolkien em funcionamento. Então o que queremos fazer é, sinto muito, então isso é bom. Então, por causa de sua própria configuração, eu não estava vendo que esta seta expira deveria ser. Eu fiz. E eu só coloquei 15 minutos. Então deixe-me, deixe-me refazer que alguém para salvar var experiência SHA-1 é igual a, Eu não assisto deve realmente acontecer é dizemos datetime pontos nulo. Quando um Tolkien pediu, vamos adicionar alguns minutos. Então seja o que for, seja qual for o limiar que você quiser. Então, se é de minutos em tudo, foi você apenas dizer adicionar que os apropriados, é estranho minutos. E então nós colocamos o valor. E o valor aqui é string. Então isso significa que eu preciso fazer algo como uma ferramenta int converte pontos. E como eu disse em 32, ou isso, isso requer o dobro? Acho que isso requer o dobro. Então deixe-me fazer eu vou converter para w em vez linha de freio e fechar isso. Então converti-me em minutos para Bobo. Eu sinto muito. Sim. Lá vamos nós. Então fazemos que converte um duplo-end expira está recebendo o valor da exploração, certo? Então, nesse ponto, sabemos quando o Tolkien não seria mais válido e eu estou perdendo um ponto e vírgula aqui e deixe-me fazer uma compilação. E não temos flechas. Então eu vou cantar quando voltarmos, vamos explorar toda a autenticação. Na verdade, nossa autorização realmente ganhou impede o acesso aos nossos recursos e, em seguida a como nós realmente configurar o endpoint para autenticar o usuário e fácil de falar e de acordo.
30. Protegendo pontos finais: Muito bem, pessoal, bem vindos. Então, sair dos calcanhares de configurar nosso gerenciador de autenticação para emitir gera um problema. Os tokens, o que queremos fazer é realmente
terminar nossos endpoints de login para o para e onde nós realmente
validamos o Tolkien e permitimos ou negamos acesso a qualquer pessoa passando neste token, certo? Então, a primeira coisa que queríamos fazer é injetar nosso recém-criado fora do serviço Manager para que saibamos como fazer as áreas de injeção. Eles podem simplesmente ir em frente e bater em pausa e ir em frente e completar este operador de injeção. Então, uma vez que você adicionou as novas três linhas, uma para a propriedade privada, uma para o construtor e acima de inicialização. Em seguida, podemos ir sobre a criação ou login endpoint. Então você já teria comentado sobre o endpoint de login. Você pode descomentar e eu já terei a versão revisada dele na tela. Então vamos passar por isso juntos. Então, o que queremos fazer é fazer logon para validar nossos dados solicitados ou que venham em detalhes. Então eu vou dizer se o gerente off validar usuário,
se não thread, para que ele poderia facilmente ler, ele diz que é igual a falso incase, você precisa C afiado. Se não, basta colocar o sensor de exclamação. Isso significa que se não é um usuário válido do que retornar no Autor porque, bem, se você tentar fazer login e você não é um usuário válido, então você não está autorizado a ir mais longe, certo? Caso contrário, vamos voltar aceito estão bem. Seja o que for, estou vendo aceito, aceito, novo e um novo objeto com, com uma expressão chamada Tolkien. E ele terá o valor do token que é criado. Então dizemos que um peso na pontuação fora pontos gerente criar Tolkien. Então lembre-se disso, isso é o que teríamos configurado em nosso gerente de Auth. Apenas null criar Tolkien passa, gera todos esses bits e pedaços de dados, e então retorna o Tolkien. Então é isso que essa carga vai ter, assim por diante para ir em frente e testar essa funcionalidade. Então, vamos rever o nosso ponto final de login. Eu só vou usar futebol para essas partes de seu são o estriatais ele e colocar em um usuário que não, Eu criei e já está registrado. E então eu vou clicar em Executar. E vamos ver o que acontece. Ou é, e estamos recebendo uma resposta simbólica. Então você vê esta grande corda, tolkien, que é em virtude dos especialistas e vamos colocar em um objeto personalizado. E o valor que está sendo passado é o token que está aqui. Então, se eu, se eu fiz este token e ir para o nosso site, olhar para o que está em tokens. Cole. Então vamos ver aqui que temos o algoritmo, temos Traviata example.com. Essa é a reivindicação para o usuário. Bem, o papel. Certo, e temos o tempo de validade. E se você passar o mouse, ele mostrará exatamente a hora de quando ele é emitido e o emissor. Tudo bem. E então se quiséssemos ir tão longe quanto seu amigo enganando, então poderíamos fazer isso, mas já ter o mecanismo para fazer isso internamente, então não precisamos fazer isso aqui. Então agora o que eu quero fazer é experimentar na verdade impedir que alguém acesse nossos endpoints. Então vou usar o nosso hotel. Para controlar esse exercício. Digamos, portanto, que a capacidade de obter a lista de hotéis, todos devem ser capazes de fazer isso. Devemos ser capazes de chamá-lo sem autenticar, que é o que temos feito em nulo. No entanto, queremos adicionar uma inundação autorizada ou anotações à chamada para obter detalhes de um hotel. Então, colocamos o Authorize. E, na verdade, você poderia estender
o, a anotação aqui para o HTTP GET e adicionar autorização ali mesmo. Tudo bem, então você pode fazer de qualquer maneira. Então, se você tem este, você não precisa deste. Pessoalmente, gosto de separá-los. Assim, do HTTP GET autorizar e realmente gosto ou preferem colocá-lo no topo. Pelo que vejo, sei que é um ponto final autorizado. Certo, então o que queremos fazer é testar nossa ligação. Portanto, este endpoint não autorizado e autorizar. Então esse objetivo. E para esta atividade eu vou usar o carteiro, alguém primeiro teve que testar o que nós
não autorizamos apenas para ter certeza de que ainda funciona. Tudo bem. Há uma lista de fotos, três hotéis. Bom. Agora eu vou testar aquele com o ponto final que requer um valor id, certo? Então, quando eu clicar em enviar, ele vai dizer 401 não autorizado. Não está dizendo 401 no Autor como porque eu não fiz login ou o que quer dizer, isso já está autorizado e recentemente o esquema padrão para C, Eu preciso ver um Tolkien, a fim de autorizar não são sólidos. Isso está acontecendo automaticamente. Se temos um velho Tolkien lá dentro, o que eu tenho, este é um símbolo que foi emitido há mais de 15 minutos. Em seguida, ele também negará automaticamente o acesso. Então, quando um Tolkien é emitido, e então leva spires, são os proprietários do cliente chamando
o aplicativo e desculpe ir buscar um novo kit de ferramentas, o que
significa passa pelo processo de login novamente, recebe um novo token e, em seguida, volte e tente acessar esses endpoints. Tudo bem? Então, no Postman, o que queremos fazer é entrar em autorização e escolher token portador nesta lista suspensa. Então nós fornecemos o token que temos, que é o Tolkien fresco. E então quando fazemos isso, e eu ainda estou recebendo um 401 não autorizado, então isso significa que há alguma configuração que está faltando. E deixe-me ir mais do que provavelmente está no ponto de inicialização cs. E acho que deixei de fora um dos middleware, então preciso somar. Use a autenticação aqui mesmo. Tudo bem? Então certifique-se que você tem isso. Use questões de autenticação e ordem nessas situações, autenticação
, autorização e tudo isso antes que eles estejam ativos, não NVC. As diferentes versões do.NET Core podem ter middlewares diferentes sendo incluídos. Então, desde que você tenha esse tema geral, você deve ser bom. Então vamos tentar o mesmo pedido novamente. E estamos tendo muito melhor sucesso. Certo, então vamos conseguir o status 200 OK, e estamos vendo o único hotel que solicitamos. Então você vê que nós apenas protegemos nosso endpoint porque se eu remover isso e dizer em todos os interesses e novamente, eu recebo um 401 não autorizado uma vez que eu incluir o Birra Tolkien, eu fico com o status 200. Se eu modificar este espírito, Tolkien, então é não autorizado porque o Tolkien não pôde ser validado contra a inflamação foi codificado e colocado originalmente. Então é assim que você pode ir em frente e fortalecer sua API. E mais uma vez,
este método JWT é muito seguro porque este payload,
sim, ele pode ser decodificado, mas ele queria não deve conter nenhuma informação que é muito sensível e informação que é que ele contém deve ser informação de que se você vê-lo, ele está desligado. Nenhuma conseqüência importante para a API e a infraestrutura subjacente. No entanto, basta para mim verificar quem
você é e que fui eu quem lhe deu acesso ao sistema.
31. Analisar e adicionar mudanças no GitHub: Bem-vindos de volta, rapazes, onde são outros postos de controlo significativos. E toda vez que chegamos a pontos de verificação significativos, vamos em frente e verificamos nosso código para que você possa simplesmente ir em frente e escrever sua mensagem de cheque e, em seguida, confirmar tudo e sincronizar. E uma vez que isso esteja concluído, então vamos passar para a nossa próxima atividade excitante.
32. Construct POST End: Bem-vindos de volta, rapazes. Nesta lição, estaremos lidando com o método de post HTTP ou verbo que nos
permite criar recursos ou novos registros em nosso banco de dados. Embora tenhamos trabalhado com post anteriormente quando estávamos sentando nossa funcionalidade de login em nosso controlador, fizemos uma espécie de experimento com o post e exploramos o fato de que
podemos realmente passar em dados na forma do corpo, são objetos adjacentes que seriam desserializados em qualquer objeto que tenhamos resolvido para ele. E dessa forma, nenhuma informação sensível precisa passar em uma URL RNA de forma visível. Então, o que vamos fazer é configurar a funcionalidade de postagem para o nosso hotel. Para que quando estamos criando um hotel, podemos pedir ao usuário para enviar todos os detalhes solo Hotel na forma de um objeto JSON e, em seguida, passá-lo para o banco de dados. Então eu já preparei os métodos, a web ou verbo HTTP post. E nós estaremos retornando status 400 ferramenta de status um, bem como status 500. Agora note que este é 2l um e não 200 porque 2-1 significa criado. Então nós estaremos indicando dois, o aplicativo de chamada ou o cliente que sim, o que quer que você seja solicitado para ser criado foi criado. Então vamos começar e agora a primeira coisa que eu gostaria de fazer antes de ir em frente e criar qualquer coisa ou trazer quaisquer dados para o
meu banco de dados é verificar se os dados que vêm são válidos. Então o que eu queria fazer é colocar em uma declaração if aqui para dizer se não, modelo de estado é válido. Então fizemos algo assim. Eu acredito que quando estamos fazendo o login onde dissemos, é o estado modelo válido, significa que tudo o que eu disse é necessário. Está aí? Se não, devolvemos a torção da manteiga. Então vamos fazer a mesma coisa, replicar esse passo aqui. Mas estou vendo se não é válido, então você vai adorar o ar e dizer que houve uma tentativa inválida de postagem nesse método, certo? E devolvemos o mau pedido. Caso contrário, queremos tentar e operar. Então temos a nossa tentativa de apanhar. E a uniformidade do nosso código é tal que podemos realmente tomar estes antigos. Então você começa a ver que estamos meio
que repetindo certeza é porque todas essas coisas, e se quiséssemos mudar uma mensagem? Eles teriam que mudá-lo aqui, alterado neste nível método GnG. E à medida que nos
expandimos, temos de ter mais pontos de contacto. Então, mais tarde veremos no fim de semana inteiro, abstrair toda essa repetição. Mas agora eu só quero ter certeza de que nós entendemos os conceitos de cronometrado. Tudo bem, então vamos apenas ir em frente e modificar a mensagem de erro e saber que você pode tentar ou operar. Agora o que vamos tentar? A primeira coisa que eu gostaria de fazer é levar este dto. E se analisarmos esse detalhe, ele tem nome, endereço, tumultos, e espera uma identificação contrária. E depois temos o hotel dto, que tem identificação e país. Então, mais uma vez, a razão pela qual não estamos usando detalhes do hotel é que não
precisamos que o valor do ID seja encontrado com a tentativa de criação. Então é por isso que só temos os campos para os quais
precisamos absolutamente de valores delineados dentro da versão Criar deste dto. Agora, uma vez que eu tenha o detalhe, o que eu quero fazer é mapeá-lo. Alguém apenas dizer var hotel é igual a mapeador ponto mapa em um objeto do tipo hotel, que é um objeto de dados, e mapeando o conteúdo do hotel. Na próxima parada, vamos chamar nossa unidade para fora do trabalho. Então eu vou ver sublinhado unidade de trabalho, pontos, Hotéis, ponto. E então eu tenho em cert qualquer coisa inserindo meu objeto de tipo hotel. Porque quando ele chegar aqui, quaisquer validações que você precisa colocar, você pode colocar dentro. Então aqui eu estou apenas validando uma molécula estados se você tivesse outras coisas que você precisava para ter
certeza que estão no lugar antes que ele nos leve fogo como tentando inseri-lo, você certifique-se de fazer todas essas verificações e balanços e devolver a bateria busca ou qualquer outra coisa, Aristóteles, ainda é um cliente antes de você realmente começar em inserção. E mesmo ao fazer a inserção, se houver uma exceção, ainda
vamos devolver algo, exceto que serão centenas de
FIFO, uma vez que a área está provavelmente do nosso lado. Então, depois de chamarmos a inserção, a próxima coisa que precisamos fazer é chamar o salvamento. Aviso. Quando estávamos apenas recuperando, poderíamos apenas fazer uma espera que não há salvamento. No entanto, nesta ocasião estamos alterando o banco de dados, então temos que cometer a mudança que estamos fazendo depois. Então é por isso que temos que chamar o salvamento. Agora, depois de tudo isso, precisamos devolver algo legal. Então, o que estou devolvendo? Ness, eu vou dizer criar, Ted, Não, eu criei o suficiente, criei em ação bem ali, na verdade não criado na raiz também. Então todos devolveram o 201. É que quando você diz criado, é apenas 201. Ele, no entanto, você pode dizer Criado fora para rotear e tê-lo chamar o endpoint, receber dito para com o ID necessário, digamos realmente retorna, eles criaram objetos para o cliente, que eu acho que é útil. Então eu estou indo para ir com criado na raiz. Então eu tenho que especificar o nome da rota. Então, neste caso, eu disse que queria ir buscar o Hotel. E depois disso, eu tenho que especificar quais valores de parâmetro esse endpoint pode precisar. Então, se eu olhar para trás, eu chegar em casa para TI precisa de um ID mais suave especificar um novo objeto. E ele vai ter um campo chamado ID, e ele vai ser igual a hotel dot id. Notifique hotel agora total dto, hotel ETO não tem um valor id. No entanto, após essa operação, esse objeto será atualizado com seu ID. E então é isso que vamos passar. Então, vamos dar uma volta. Mas antes de fazermos isso, antes de eu me afastar, precisamos deixar essa regra nem que ela tenha esse nome, certo? Então, mesmo que ele tenha o nome, precisamos deixá-lo saber que ele recebe uma operação que atende por esse nome, não necessariamente raiz livro por esse nome, certo. Posso acrescentar aqui e dizer que Nome é igual. Então isso é como um pequeno bilhete de apelido interno para ver. Este é o seu nome sempre que alguém em seus
irmãos, irmão sendo outro axônio chama. Então vamos tentar isso de novo. Certo, então vamos testar este no Carteiro. E eu já tenho um objeto aqui, então eu realmente copiei esse objeto de nosso getText anterior. Portanto, já estabelecemos que o ID não é necessário. No entanto, apenas indo para o Slugger, só para mostrar o que arrogância vai curar um barco. Quando olhamos para o post para o hotel, está nos mostrando que isso é tudo o que vai ser terrível. Então, mesmo que enviemos mais informações, ela será ignorada. Tudo bem, então é assim que nosso objeto precisa se parecer para entrar em nossos posts. Então, usando o carteiro, eu realmente vou testá-lo com a identificação e vamos ver o que acontece. Então eu vou clicar em me enviar. Este axônio está no poste. Temos o nosso endpoint e, em seguida, clique em enviar. E nós estamos recebendo esta era ambos sistema operação inválida Nauru, muito é fornecido valores. Então isso significa que precisamos reestruturar o código ou em um CreateDAT r2. Voltando ao código, deixe-me ver o que há sobrecargas lá. E nós temos o nome da raiz da string onde o valor objetivo, eu acredito que eu estou faltando o objeto real. Lá vamos nós. Então vírgula e hotéis ou passando sobre o id eo objeto real a ser exibido. Então vamos tentar de novo. Então, os mesmos testes que dá um erro, eu vou tentar novamente. E lá vamos nós. Então olhe para a diferença entre as duas cargas úteis, onde recuperar nosso objeto do hotel com o valor de ID de seis ou x, mesmo o cinco é 5 aqui, são cinco aqui, certo? Então, só para mostrar que isso não deu certo para nada, graças a nós não permitirmos que eles enviassem esses dados. Então essa é outra razão. É uma boa idéia usar detalhes para cantos sanitize o que pode entrar em sua API. Agora, além de exibir o recém-criado exigiu outra vantagem, aqueles usando criado em Rutan apontando para o ponto final seria que nos cabeçalhos nós realmente retornar o local onde eles podem ir e buscar este registro. Então você vê, ele tinha um certo propósito se eu tivesse apenas,
você sabe, o cliente, se eles olharem nos cabeçalhos e apenas obter a localização depois de eu ter retornado os dados que eles podem realmente apenas usar isso e fazer um get operação e recuperar seu registro. Mas é claro que não estou autorizado. Então você sabe, toda aquela coisa já que tem que passar e fazer tudo isso. Agora, a ponto de ser autorizado, não
acho que seja prejudicial permitir que alguém recupere um hotel por identificação, certo? Então nós autorizamos inicialmente porque estávamos testando. No entanto, na praticidade, eu não acho que precisamos autorizar, ser mandados para. Se permitirmos que eles peguem o ouvinte deve. Uma, no entanto, penso que seria bom autorizar quem pode criar. Tudo bem, então depende de você com regras de negócios e suas necessidades determinarão onde você coloca o autor como segurança doméstica, você aplica nossos próprios endpoints e operações de ano. Então, nesta situação, eu vou autorizar a criação de hotéis para que você tenha que ser autorizado. E para mim é muito pior, se você não está no papel de administrador, então você não deve ser capaz de fazer isso. Então, para impor a autorização baseada em regras, posso ver funções iguais e listar quantas regras quiser suportar. Então, se eu disser autorizar Regras, administrador, isso significa que se você está autorizando, recebe Tolkien,
mas você é um usuário, não um administrador, então você não pode realizar nada que você ainda não está autorizado. No entanto, se você é um administrador, então você pode ir em frente. Então isso é tudo mais uma vez, você pode ir sobre a aplicação de um. Que ponto final você expôs para John public versus um autor, usuário autenticado? E, por extensão, como você estende essas funcionalidades para que grupo
autorizado de usuários que podem autorizar com base em políticas, regras. E há algumas opções disponíveis para você. Se pressionar vírgula, você verá que tem o esquema de autenticação. Poderíamos tirar um JWT, outra senha ,
etc, etc. Você pode impor uma política e limitá-la por funções. Portanto, há algumas opções para isso. Então, certo, não, eu vou desafiar você mais uma vez o que fizemos com criar hotel. Encorajo-o a tentar fazê-lo com o país. Certifica-te de que o testas e que recuperas o teu país com sucesso. E vamos comparar notas. E estamos de volta. Espero que tenha feito uma pausa e tentado. Se não, então vá em frente e faça uma pausa. Não, mas vou explicar o que fiz. E realmente e verdadeiramente você notará que o código é quase idêntico. Um onde no controlador país temos as mesmas medidas de autorização. Mais uma vez, seu contexto pode ser diferente do meu, mas queremos apenas ter certeza de que protegemos os endpoints de acordo. Estamos fazendo um post HTTP terá tipos de retorno semelhantes ao que fizemos com o hotel, exceto para a ação que eu vou chamá-lo Criar contorno passando no dto apropriado. Validamos o estado modelo em primeiro lugar. E então vamos em frente e adicionamos apenas da mesma forma. E então nós criamos na raiz obter o contrário possível o objeto. E nós nos certificamos de adicionar esse nome aqui. Então você vê, uma vez que você pegar o jeito disso, a menos que você tenha algumas circunstâncias extremas, nós temos que fazer cálculos e cálculos extras. E mesmo assim, seria apenas uma questão de mapeamento sobre r. Bem, sim, você provavelmente não iria obter os valores calculados através do detalhe. Então você vai mapeá-lo para o tipo de objeto. E então você faz todos os seus cálculos, e então você insere e salva. Portanto, não há muito a criar recursos em sua API.
33. Construct POST: Bem-vindos de volta, rapazes. Continuamos nossa jornada de desenvolvimento de API e exploraremos o Verbo PUT. Este pneu. Agora, colocar é semelhante ao post, exceto que ele é usado principalmente para tanto criativo que não existe, ou atualizar se ele não existe. Então, vamos começar. E quando testamos você, isso fará um pouco mais de sentido para você. Então a primeira coisa que eu gostaria de fazer é replicar o tipo de restrição sobre quem pode acessar o put para mim. Se você não pode criar o nicho não deve ser capaz de atualizar, certo? Mais uma vez, contextos, regras, mas vou autorizar. E eu só vou autorizar. Eu nem vou torná-lo governado com base. Certo. Assim, o administrador pode criar mais de uma vez que está autorizado. Você pode ir em frente e criar um você pode ir em frente e atualizar, desculpe, a respeito da regra de autocuidado. Tudo bem, então o próximo seria porta HTTP, e esse é o nosso novo verbo. E mais ou menos vão ter os mesmos códigos de retorno, exceto por fazer algo diferente para este. Então deixe-me apenas comentar este um nós e quando chegarmos lá e então nós vamos ajustá-lo. Então temos o trabalho do nosso método. E eu só vou copiar. Então ele pode mover-se rapidamente com a preparação deste stub método, certo? E este será um hotel de atualização. Agora, em termos de detalhe que será usado para atualizações hotel. Bem, em primeiro lugar, precisamos do parâmetro para o ID. Você sabe, há duas escolas de pensamento, ou talvez três escolas de pensamentos sobre este assunto. Mas digamos que duas escolas de pensamento. número um é que eu preciso ter o ID no URL, assim como tudo o que tínhamos era que eles acertassem. Então eu preciso, eu preciso que você passe o ID com o URL. Mas então uma escola de pensamento diria que o detalhe também precisa ter a identificação. Isso significa que o cliente precisa passar o ID com o URL e positivo no corpo dos dados a serem atualizados. Agora, esse é um ponto de validação potencial onde você verifica se o id que foi enviado no URL corresponde ao ID central em que o payload ou o dto. E se houver uma incompatibilidade, então me devolva o pedido de manteiga. Tudo bem, então esse é um método de fazer isso e eu estou apenas falando sobre isso antes de eu realmente fazê-lo. O outro seria que o detalhe não precisa ter o ID porque o id vai estar na URL. Então eu espero passar sobre o URL com o ID do registro que você deseja atualizar. E depois passas-me a informação actualizada e eu aplico-a de acordo. Agora, isso também é uma cadeira aceitável, pensamentos suficientes, ambos são aceitáveis. Mais uma vez, regras de contexto. Assim, alguns de vocês se sentirão mais confortáveis com a verificação dupla, tendo o ID no URL e no corpo. E então você verifica, e então se eles não coincidirem, então você rejeita a tentativa. Algumas pessoas não se importam de tê-lo em um lugar sublinhando junto com a operação. Então vamos tomar a abordagem onde temos um lugar e não no dto. Agora, por causa disso, eu poderia. Use o dto cria hotel. Mas, para mim, isso violaria
a única regra de responsabilidade que venho promovendo. Porque quando você diz criar Hotel De Jiao, ele diz a qualquer pessoa lendo o código que isso é para criação. Por que está na atualização? E agora você tem duas opções. Novamente, você poderia renomear isso para talvez algo como upsert, onde este detalhe serve um duplo propósito ao criar e atualizar nossa inserção e atualização, daí a upsert portmanteau, certo? Mas, mais uma vez, a única responsabilidade depende de quão rigoroso você quer ser. Você também pode perceber que você pode ter campos
variados nos negócios 2D porque o que você aceitaria para criação, você pode não expor tudo isso para potencial dela. Então você quer considerar todas essas coisas. Então o que eu faria era criar um segundo detalhes. Então eu criei outro, eu chamo de atualização do hotel VT0. Neste contexto, tudo o que está aqui para a criação é jogo justo para atualizações. Tudo bem, então eu não vou ir em frente e criar outro em tudo. Eu fiz foi apenas herdar. Então eu estou fazendo isso por causa do conceito de responsabilidade único que eu tenho em mente. Eu faço Aswan para ter certeza de que quando você vê Atualizar detalhes totais, você sabe o que é longe. No entanto, caso contrário, o que você provavelmente deseja fazer é apenas ser mais específico com os campos que você expor na atualização dto. E já vimos onde isso pode ajudar com algum controle. Então eu vou seguir em frente com esse nível de herança. Mais uma vez, isso é com você. E nós só queríamos escrever código limpo e ter certeza de que ele é legível no final do dia, certo? Então eu estou tomando o ID no parâmetro e, em seguida, eu estou tomando os campos para a atualização no corpo da solicitação. Então eu vou começar com minhas verificações de validação e quando dizer se não modelo estados, ponto é válido, se não é válido, ou se o valor de id enviado é menor que um, quer dizer que deve ser pelo menos um. Escreva-o para ser 0 são negativos. Então, em qualquer situação, eu só quero registrar e retornar solicitações de bateria que algo está errado com sua tentativa. Tudo bem? E então podemos seguir em frente para a nossa tentativa de pegar. E então sabemos que para a seção de crianças, vamos registrar o erro, bem como retornar o status 500. Certo, então vamos ver o que vamos tentar. Para tentar, preciso do registro original que precisa ser atualizado. Então o que eu tenho que fazer é realmente salvar var hotel é igual a esperar Unidade 04, Tomatoes ponto, me pegar. Direct Cards, coloca no meu filtro onde o ID é equivalente ao ID que entra através do parâmetro, certo? Então posso fazer outra verificação. Posso ver se Hotel é equivalente a nulo. Então eu não poderia ter feito uma busca. Talvez Boston, a identidade dez nossas vidas, seis hotéis e um passe em dez com algo para atualizar. Eu vou tentar encontrá-lo, mas eu preciso ter certeza de que eu realmente achei certo. Então eu provavelmente faria. Pedidos Bud. Então digamos, eu faço a mesma coisa aqui, mas na seção de missões de manteiga. E nós vamos ver enviado feito é inválido. Tudo bem, então não há status de modelo, então um pouco fora do registro com que ID Xist não são. E você poderia até mesmo apenas estender a unidade de trabalho para fazer o existe. Mas o que estou fazendo é só pegar uma vez. Se for nulo, acabamos com ele. No entanto, se não for nulo, então podemos ir em frente e tentar fazer nossa parte. Agora eu vou rapidamente para tipo de equacionar a ferramenta seria usar o mapeador dot mob. E então eu posso ver neste ponto qual é a fonte, então a série fonte Hotel. E então eu vou dizer, eu quero que seja normal, desculpe, a fonte seria a água dto. O meu pedido de desculpas. Então, um hotel dto é a nova fonte porque o hotel dto tem as últimas informações. E depois vou ver o Hotel à direita. Então, se olharmos para esta sobrecarga do mapeador, é preciso duas coisas, a fonte e um destino. E então o que ele vai fazer é apenas limpar o que está na fonte para o destino existente. Então, efetivamente, nós apenas dissemos o que quer que esteja nisso, coloque em que se há dois campos que não são iguais, então por favor atualize tudo isso com os campos que vêm do detalhe, certo? E então podemos saber ver a Unidade 04. Nenhum problema é que não fizemos nenhum rastreamento. Então, se estivéssemos fazendo caminhões, poderíamos ter dito “salvar barcos”. Não estamos transportando coisas para ver atualizações. E depois passar no hotel. Certo? E então nós, você sabe, são todos os quatro salvar. Então, só uma linha extra de código, não é tão ruim. Então a coisa é, eu me lembro que foi explicado que com o método de atualização, o que fizemos foi ver,
por favor, preste atenção a quaisquer entidades aqui, tocá-lo e mudar seu estado para modificá-lo para que ele seja modificado. Então, quando salvarmos, ele estará no registro a ser salvo ou atualizado, certo? Se não tivéssemos r Se tivéssemos feito o rastreamento opcional, então não teríamos que dar esse passo extra de dizer atualizações. Poderíamos ter feito a mudança e ver se o caminhão
porque é realmente por padrão. Então eu estou apenas explicando isso um pouco também porque eu não mencionei isso. Então vamos, depois de salvar, podemos retornar conteúdo nulo. Então, um conteúdo antigo parece ser uma manteiga aplicar, mas é realmente uma ferramenta para a qual é qualquer coisa em 200, o que é bom, certo? Então isso é bom porque eu não quero ter nada para te dizer como, ok, você enviou uma atualização. Ok, não há mais nada a fazer. Você está pronto para ir, certo? Então é isso que o conteúdo não é realmente longe. Então, voltando ao que comentamos que ensinou, eles dirão status para todos os quatro. Vamos testar isso. Então, apenas para chamar sua atenção para o que o swagger está fazendo, você verá que cada tipo é bem codificado por cores. Então, se a palavra não foi suficiente, então você vê o código de cor colocado é bem indicado lá. E há o nosso dto com os campos, e ele está esperando um valor de id nos parâmetros. Certo, então vamos usar o carteiro. E eu vou direto para o último total que criamos. Então esta foi a nossa tentativa bem sucedida e recuperámo-la. Então, o valor de ID é seis. Então eu vou dizer Put é meu verbo e eu estou passando procura como o valor ID, e então eu vou colocar uma vírgula. Isto foi mal escrito. É uma pequena mudança para ela, mas como veremos, a subscrição vírgula não é realmente cinco, mas são 4.84 pilotos lunares Jamaica Grand Resort. E enquanto os países da Jamaica. Então vamos deixar isso. Então vamos em frente e enviar e ver o que acontece. Certo. Método não permitido. E oh, eu acho que eu sei porque nós não colocamos o parâmetro sozinho resposta no porto. Então, da mesma maneira que temos isso no HTTP GET depois especificar no put, que ele deve tomar esse parâmetro. Então, os negócios estavam nisso. E vamos tentar de novo. Carteiro, acho que deve ficar com o 401, este dímero. Isso é melhor. Assim, o método 405 não permitido significa que ou você tem algo errado com o pedido deles ou seu ponto final precisa ser corrigido demais. Holder Quest deve olhar. Então saiba que é isso que nos deparamos. Tivemos o pedido corretamente, mas então o endpoint estava faltando. Tudo bem, então é bom ver essas pequenas coisas ao longo do caminho que quando elas acontecerem você possa assumir o controle da situação. Então o que precisamos fazer é pegar um Tolkien. E acredito que ainda tenho meu pedido de usuário aqui. Então, é muito legal com ambos o dinheiro sempre pode voltar e obter pedidos anteriores. Então deixe-me pegar meu Tolkien, voltar aqui, adicioná-lo ao cabeçalho de autorização, e então tentar isso novamente. E ele está atingindo meu senta um ponto de interrupção lá. Tudo bem, então vamos continuar. E lá é uma ferramenta para nenhum conteúdo, por isso processou com sucesso as solicitações. O que não está devolvendo nenhum conteúdo? Bem, sem conteúdo, mas mais uma vez, uma ferramenta para é um bom tipo de retorno. Então vamos agora ao nosso Git anterior e ver o que acontece. Um Tolkien. Então deixe-me ir em frente e colocar esse Tolkien aqui e fazer o arranjo. E então veremos que há R vírgula e há 18 chances de 4,8. Então, no que nos diz respeito, o posto funciona? Não, apenas construindo sobre o que colocar faz e não faz. Fazer. Vês se esqueces alguma coisa? Vamos ver. Você tem alguns campos que não são obrigatórios. Tudo bem? Certo. Não, é difícil testar o que vou em frente e modificar este dto. Então deixe-me passar por cima para criar necessidades de você, e eu vou dizer que o campo de endereço não é obrigatório. Tudo bem. Fui recomeçar. Então por que esse reinício e deixe-me explicar o que é wearable fazer. O posto vai sempre substituir os dados. A única coisa que ele faz é substituir a identidade praticamente certo? Então, sempre que você estiver indo para fazer um put, você tem que estar ciente de que quaisquer dados que estejam lá, vai usá-lo para substituir,
digamos, se eu não fornecer um endereço, digamos para abordar toda essa carga útil, já não é necessário. Eu não forneço um endereço. O que estou fazendo no posto? Estou fazendo a atualização, certo? Mesmo hotel e estou fazendo a atualização que mandei. Certo, então eu estou recebendo uma ferramenta para nenhum conteúdo, mas veja o que acontece com meus dados. Por isso, reparem que tínhamos volume não endereçado. Nenhum endereço é nulo, digamos metade. Para ter cuidado sempre que você está usando esses tipos de objetos são pelo menos para colocar porque ele
vai sempre substituí-lo com os dados que ele tem. Portanto, cabe a você certificar-se de que suas validações representam a qualidade de dados que você realmente deseja de seu aplicativo cliente, se você está construindo uma planta ou é um terceiro que está construindo o cliente. A API é sua e você tem que definir esse padrão porque não ser necessário, eu carrego um valor nulo para estar lá. Saiba mais uma vez que isso pode ser bom ou ruim com base na sua situação, mas é assim que o put funcionará. Então eu vou encorajar sua retina a pausar, replicar o ponto final de entrada para o controlador do país. E então vamos olhar para outra coisa que precisa para o posto e como podemos entrar um pouco mais necessidades de janeiro sozinhos agora. Tudo bem. Então estamos de volta e espero que tenha parado e tentado você mesmo, mas eu já fiz o país de atualização e eu vou apenas orientá-lo rapidamente. Não há nada aqui, só isso. É fora do comum comparado com os hotéis. Tudo é bastante padrão. Temos a criação de detalhes contrários que preciso atualizar. Lá vamos nós. Ainda bem que estou a fazer esta crítica. Tudo bem, então nós atualizamos contradizemos para contradizê-lo. E tudo o resto parece do mesmo jeito. - Não. Uma coisa que eu quero salientar com a atualização contradizem a você é que eu incluí esta propriedade que é uma lista de hotéis. Tudo bem, então sim, sem dúvida, eu poderia colocá-lo aqui e, em seguida, removê-lo deste e, em seguida, deixar o país herdar da atualização contradizer para sensibilizar todos estes e a lista. Então, isso conseguiria tudo. Você poderia fazer isso. Mas então isso é apenas dirigindo para casa o ponto que você realmente quer tipo de manter seus detalhes o mais único possível. Porque então, você sabe, você pode ter compartilhado sente costa, mas então você pode ter campos únicos também ao longo do caminho. Agora a relevância desta lista de hotéis é que eu posso realmente usar o meu colocar para atualizar, acompanhar e também inserir novos hotéis são relacionados hotéis porque lembre-se que hotéis, Isso significa que um país tem uma lista de hotéis, certo? Um contrasta muitos hotéis, é por isso que podemos referenciá-los por lista aqui. Certo, então vamos explorar como isso seria. Então, se eu passar para a minha documentação arrogante e então olhar a carga potencial que você vê aqui onde eles estão me mostrando que eu posso colocar no nome, o nome abreviado, e, em seguida, uma série de hotéis. E então eu posso colocar em detalhes para o hotel. E, claro, o hotel tem, mas então deve detalhes para o país. E isso é o que eles realmente queriam dizer quando disseram que poderia se tornar cíclico porque é apenas uma grande coisa atrás da outra, depois da outra. No entanto, vamos tentar isso. Vamos inserir um novo hotel. Lamentamos, um novo país com novos hotéis. Então eu vou apenas duplicar este clique pós-secundário, dizer guia Duplicate, já que eu já tenho isso lá. Antes de fazer isso, deixe-me ver todos os países que abrigo. Eu realmente não tenho nenhum teste com o país. Então deixe-me pegar todos os meus países para que eu possa ver minhas opções. Então eu tenho Jamaica, Bahamas, e Ilhas Cayman e ver se precisamos atualizar Ilhas Cayman por causa da Ilha Cayman, deve ser Island Zoo cosméticos, mas vamos em frente e atualizar isso. Então, vou me deixar só me orientar. Então eu vou pegar a carga da amostra é da nossa arrogância. E então o país lamenta, a identificação do país que eu quero. Só estou tentando descobrir onde estava a identificação consciente é três. Então o nome será Ilhas Cayman. O golpe, o ponto final seria país barra três. Tudo bem, o nome curto ainda CI. Então, mais uma vez, você tem que fornecer o valor que você espera ter seu depois. Tudo bem. E então eu vou para dentro da seção do hotel, remover qualquer coisa que eu realmente não quero. Tudo bem, como quase tudo fato, deixe-me voltar ao detalhe. Eu só notei que eu estou listando antigo hotel dto aqui, então eu não disse o que poderia consolidar materiais são uma boa razão que eu não estou consolidando. Eu disse Hotel Dto. Hotel dto, em seguida, coloca no id. Mas se eu estou fazendo uma inserção atualizando Ilhas
Cayman enquanto eu quero inserir um novo hotel automaticamente, que significa que eu não preciso do valor ID. Portanto, este detalhe está realmente incorreto. O que eu deveria ter aqui é criar. Hotel VT0, que é uma melhor representação dos dados que eu gostaria de coletar. E isso também se livrar do excesso se sente como o país e a lista estendida de fotos. Então vamos tentar de novo. Tudo bem, então agora quando eu olho em arrogância e olho para o esquema que parece muito melhor. Então você pode ver detalhes são muito importantes. O que você precisa do seu usuário? Garante que você exponha apenas isso. Então eu vou pegar essa carga corrigida, voltar para o Postman e isso será muito menos confuso para mim, certo? Então vamos tentar de novo. Isto vai ser Ilhas Cayman com i maiúsculo, certo? O nome abreviado ainda é CI. Eu tenho que fornecer isso. E, em seguida, na seção de hotéis, eu posso realmente listar todos os hotéis são objetos de hotel. Então este colchete significa área. Em seguida, a chave encapsula todas as propriedades do objeto do que eu posso dizer vírgula e lista segunda vírgula OSU e continuar a colocá-los em, certo? Então aqui eu vou colocar o Ritz-Carlton e seus endereços, Grand Cayman, ele tem uma classificação de 4,5 e não no hotel local. Então estes são realmente segurar aqueles em Grand Kim e ele pode, se você quiser verificar que, no entanto, eu não vou especificar o ID do contêiner. Tudo bem, então eu estou realmente indo para remover ID clincher, mas então eu tenho como necessário, então eu vou removê-lo na carga útil. E o que eu vou fazer é a mudança no próprio código para o dto. Vamos apenas ir lá e fazer com que não seja necessário estes apenas para este experimento. E vamos tentar isso. Então mudar no meio teria a lista de fotos. Eles não estão fazendo referência a nenhum país no momento. No entanto, eles estão sob a carga útil do país onde as idéias contrárias três, então vamos enviar. E eu estou recebendo uma ferramenta para nenhum conteúdo. Então deixe-me ir e verificar. Então deixe-me pegar a lista de hotéis e ver o que Kim Bug. Tudo bem, aqui vamos nós. Então temos o hotel local voltando com um
Sullivan ideal e o Ritz-Carlton voltando com uma identificação de oito. E ambos são partes do país três são chave em mente. Então você vê, é assim que você pode realmente usar o put. Então, vamos ver, essa coisa existe? Se não, eu vou criá-lo. E a única maneira que ele sabe que existe é se o valor do id for fornecido. Então,
quando não há nenhum valor de ID vai dizer, isso não tem um ID. Então eu vou em frente e criá-lo. No entanto, por causa de nossas restrições que colocamos em nosso ponto final, não
estamos permitindo que as pessoas apenas usem o put para criar porque nós verificamos que um valor id deve estar presente, são um valor de ID sensata deve estar presente antes de mover em. Então essas são as duas restrições que você pode usar para garantir que o put opera como você quer seja a operação global seja muito versátil.
34. Construa o DELETE: Bem-vindos de volta, rapazes. Nesta lição, exploraremos como excluímos dados por meio de nossa API. Então eu já criei essa ação. Se você quiser novamente, pause e ative. Então eu estou dando a vocês uma prévia sorrateira ainda tem o que ele precisa parecer, pelo
menos inicialmente, o verbo é HTTP delete. Precisamos deixá-lo saber que ele deve esperar algum parâmetro na forma de idéias e inteiro nós autorizá-lo. Esse é outro que você provavelmente deseja impor uma função para o administrador porque estamos excluindo. Caso contrário, você pode apenas deixá-lo como autorização. E sabemos que os códigos de resposta aqui seriam 4024500. Então você pode pausar e tentar e então podemos comparar notas. Então o que eu tenho neste hotel delete axon é uma validação para garantir que o valor ID faz sentido. Esse é o número um. Então nós fazemos isso e, em seguida, rejeitamos faz um pedido de bateria. Se não faz sentido, então eu vou tentar pegar a arte dele no registro e nos devolver o código de status, desculpe, de 500. Mas, em seguida, quando ele tenta operação, o que ele faz é tentar novamente o hotel com o id que foi passado em. Verificamos se esse hotel existe. Caso contrário, mais uma vez vemos solicitação incorreta e registramos o erro. Caso contrário, vamos apagar o hotel e salvar nossas alterações e,
em seguida, não devolvemos conteúdo. Então você vê que não havia muito para excluir o hotel. Assim, o mesmo vale para o país. É praticamente o mesmo método que temos o país de exclusão, temos o mesmo status é se você quiser estender as mesmas permissões de acordo. E nós passamos, obtemos o ID, verificamos que o volume faz sentido. E então tentamos a operação, pegando o país, validando que não é um número falso. E então, indo em frente e excluindo, se ele chegar tão longe, nós retornamos um conteúdo nulo de dois ou quatro. Então o que queremos fazer é testar a exclusão de um hotel versus testar a exclusão de um contrato. E você vai ver por que eu estou colocando ênfase nesses dois testes. Assim, com a introdução do endpoint de exclusão, futebol fica um pouco mais cheio de bobina. Você vê excluir sendo promovido aqui. E o que vamos fazer é usar o carteiro e tentar apagar. Então você tem o ponto final. Você sabe, nós precisamos do volume ID na URL. Nós vamos escolher o nosso verbo como delete. Tudo bem? E o que eu vou fazer é escolher uma foto que eu realmente não quero, certo? Então eu acho que este
aqui, este foi apenas um teste aleatório. Você vê que ele ainda está dizendo string, string apenas levou os valores padrão estão lá no exemplo payload. Então eu vou apagar o hotel com o número de identificação cinco. Então, no meu deletar. Pedido que eu coloquei na barra URL x5 e, em seguida, enviar. Claro que preciso autorizar. Então deixe-me recuar um pouco e tendência obter Tolkien seu objetivo. Certo, aqui está um Tolkien. Pegue a conversa e John pulôver, token de
autorização. Lá vamos nós. E temos o nosso “sem conteúdo”. Então, se eu olhar para trás para a lista, eu não deveria ver o hotel com ID 5. Lá está ele. Vai quatro, depois seis. Então, cinco se foi. Isso é buraco. Nós apagaríamos um hotel. Não, a coisa com os países que o país tem hotéis. Então, é um pouco mais arriscado quando excluímos um país que nós realmente vamos ter que remover os hotéis também. Então vamos ver como isso se parece. Então eu vou dizer Country. E olhando para trás, vejo que temos que em Cayman ter V1 nas Bahamas. Então vamos tentar apagar o contrário das Bahamas. Ele só tem um hotel, então nós vamos apenas, pelo boletim fez um sacrifício do ponto E1 ou E2. Podemos sempre somar mais tarde. Então o que eu vou fazer é ver o país com o ID3 e ir até aqui. Ponha isso aí. Tudo bem, eu iria e3 e depois enviar. E vemos onde obter uma alma sem conteúdo. Se eu olhar para a lista de países que olhamos para a lista de países que eu não deveria ver. Oh, eu apaguei K menor. Isso é bom. Então eu não precisava que Kamen, então vamos NF2 países 12, Eu pensei Casa deletando Bahamas, desculpas. Então isso significa que nenhum dos hotéis que têm o valor de ID três deve estar lá para que enviemos, e lá está. Então temos um contrato com o ID um país com ID dois, país com ID1, um, etc. Portanto, nenhum país com ID3 permanece. E isso é porque em nossa migração quando criamos o banco de dados. Então você pode ir para o primeiro arquivo de migração, eu chamo de banco de dados criado. Você verá na configuração que a restrição na chave estrangeira era que dizia referindo
a cascata ponto do leilão. Então cascata significa que se você fizer qualquer mudança para o pai, seja, país, solo, você tem contrário sendo o pai e hotéis são suficientes conscientes. Então lá estão as crianças nos guardas. Se você fizer alguma alteração no acordo contrário, ele será lançado sobre o hotel. Então, neste caso, os genes que estamos fazendo é que estamos excluindo o pai necessário. Então, ao excluir, eu quero cascata, o
que quer que você faça com o pai, replicar essa ação através da criança. Então isso pode realmente ser mudado. Bem, então você teria que atender a modificação no arquivo de contexto e, em seguida, executar outra migração para que ele saiba que você quer saber artes de leilão ou restringir. Significado. E costumo restringir porque se houver registros infantis, não
quero apagar os pais. Então isso significa que uma vez que eles são hotéis associados a este país, você não pode excluir. O país não restringe a madeira. No entanto, escreva anotações em Cascade, e como você vê quando você faz esse peer in record, ele vai para cascata em todos os hotéis. Então você tem que ter cuidado com isso. Certifique-se de que, se essa configuração for alcançada em sua API, ela é deliberada, é assim que você deseja que ela funcione. Mas isso é algo que pode causar perda maciça de dados
se for, se for solto.
35. Analisar e adicionar mudanças no GitHub: Certo, pessoal, então estamos mais uma vez, isso é outro marco enquanto vamos fazer é agitar nossas mudanças. Então, adicionamos todos os endpoints ausentes para o post PUT e solicitações de exclusão para hotéis e países. E os conceitos que você aprendeu ao longo do caminho podem ser aplicados Bem quantas vezes você precisar deles, quantos endpoints você precisar facilitar, você pode aplicá-los também. Então vamos em frente e vamos para obter mudanças, adicionar nossa mensagem. E então o que eu vou fazer é apenas cometer tudo e afundar. E uma vez que isso seja concluído, então você pode ficar por perto para a próxima aventura.
36. Funções de valor - visão de seção: Ei, caras. Então, vamos começar uma nova seção do nosso desenvolvimento de API. E, na verdade, isso é apenas uma característica de valor agregado. Fizemos um bom trabalho. Já temos uma API funcional com uma arquitetura limpa e agradável que pode ser facilmente estendida. No entanto, há certas coisas que queremos aproveitar quando se trata de dominar o núcleo. E esses recursos são, esses subsídios nos permitirá reduzir alguns dos códigos repetidos que temos em toda a nossa aplicação. Então, digamos, por exemplo, um, continuamos repetindo, tentamos, pegamos. Toda vez que fazemos uma operação, temos o trike ainda, então vamos estar olhando para colocar em código para reduzir isso e lidar com setas de uma forma global. Uma vez que realmente fazemos a mesma coisa quase
todas as vezes, tudo seria olhar para será reduzir a nossa necessidade de verificar certos, fazer certas verificações antes de concluir uma operação. Então, colocar em ação filtros também será colocar em mecanismos para ajudar a
acelerar a recuperação no processamento de dados como cache, paginação. Então, vamos olhar para todas essas coisas e vamos começar com a implementação de paging. Então fique atento.
37. Implementar paginação: Tudo bem, então vamos começar a olhar para o paging nesta lição. Nulo. Um pequeno galo gemeu para andar paging é, e por que precisamos dele. Paging fala de ambos segmentar os dados que estão sendo retornados. Então, agora o que estamos fazendo é fazer um BigQuery, obtendo todos os valores em uma determinada tabela de uma só vez. E embora possa parecer bom, porque só temos três países e cinco hotéis. Quando você implanta esta API para uso internacional. E você está realmente armazenando hotéis em 200 países em todo o mundo, você perceberá que seus dados vão crescer exponencialmente. E então você definitivamente precisa de um preditor em seu sistema de muitas solicitações e o fardo de servir tantos dados de uma só vez para potencialmente muitos clientes, além de proteger os clientes de terem que desenvolver maneiras internamente de segmentar os dados porque eles estão recebendo muito de uma só vez. Então paging é uma maneira agradável, eficaz e eficiente de segmentar os dados, permitindo que o cliente veja, eu gostaria de ter tantos registros. E depois voltamos de acordo com o que pediram. Tudo começou com Boltzmann na tela porque o que queremos do nosso cliente é que quando eles estão fazendo essa chamada de serviço, eles passariam em parâmetros para dizer algo como o tamanho da página que eles gostariam. A página diz que significaria quantos registros. Digamos que eles digam dez. E então eles diriam e eu gostaria do número da página. Então isso é um número de página. Então eu posso digitar fingindo as ordens de link, colocá-lo aqui
no params número de página Chanzeaux seria igual a algo como um ou dois. Então precisamos saber implementar código para dizer que se eles pedirem um tamanho de página de dez, isso significa que eles queriam dez registros. O que eles pedem para a página três ou algo que não é a página um. Isso significa que gostaria que o necessário 30 até 40 exigidos. Certo. Algo assim. Para que nós, se eles estão exibindo dez hotéis naquele momento em seus doutorados, quando eles, quando eles vão para a próxima página, na próxima página, eles apenas aumentariam isso e eles não sabem que vamos obter 40 a 50, então 50 a 60, etc. Então, se nós temos 500 hotéis, em nenhum momento alguém estaria recebendo todos os 500, eles não estaria recebendo pedaços de 50 ou o que quer que seja que eles estão pedindo. Claro, podemos limitar o máximo. Então o que precisamos fazer é começar criando um novo modelo, alguém para chamar esse pedido de modelo. Params é apenas uma classe e será apenas um modelo ou forro. As restrições são os nomes dos parâmetros que há muita paixão, certo? Então, antes de eu fazer qualquer coisa que eu queria iniciar ou declarar pizza máxima é de 50, para que ninguém pode solicitar mais de 50 registros no momento. Claro, isso é meu ou seu. Então, se você quiser limitar a dez, você quer abrir a 100. Isso é inteiramente com você. Faça o que for melhor para o seu sistema. Então estamos definindo isso para 50, escrever nulo. E então temos outra propriedade que vamos chamá-la de número de página. E outro, este é privado que vamos chamá-lo bate lados. Tudo bem, então o, estes são apenas padrão. Então eu estou vendo que o nano de numeração de página padrão foi especificado. O número de página padrão será um e o tamanho padrão da página será dez, certo? Mas então eu vou fazer o tamanho da página da versão pública do tamanho da página, onde eu vou dizer manualmente git. E aqui eu vou retornar o tamanho da página sublinhado. Mas, em seguida, também podemos definir o valor para o tamanho da página para ser igual a. E eu queria dizer que o volume é maior que o tamanho máximo do lance. Então, esta é uma pergunta. Eu usaria apenas um operador ternário para ver se ele é maior do que o tamanho máximo do lance, então nós enviamos o tamanho do talão. Então é por isso que eu precisaria de lá, certo? Então, se eles pediram mais de dez, mais de 50 registros, então o padrão é dez, certo? Lá, pediu mais de 50, então nós apenas enviamos de volta 50. Caso contrário, enviamos valores. Portanto, o valor aqui é uma palavra-chave como você vê, destacada em azul, assim como é para retorno. Então o valor seria qualquer valor onde sentado aqui. Tudo bem, então aqui temos apenas um padrão é definido nossa inicializá-lo para um. Portanto, não há restrições reais sobre isso porque não sabemos em que página eles estão. No entanto, ou o que este onde vendo sempre retornar o tamanho do período. Então, quando você recebe o retorno, o que isso faz é, no entanto, quando sentá-lo, se o tamanho da página solicitado é maior do que 50 ou qualquer valor que você colocar lá, então nós retornamos esse máximo. Caso contrário, então podemos ir em frente e retornar esse valor. Agora a próxima coisa que eu quero fazer é modificar o controlador. Então, neste ponto, eu vou apenas modificar ficar consciente porque aquele cara disse que eu não quero isso em nenhum ponto. Alguém conseguir todos os registros de uma só vez, seria problemático para minha ajuda. Então o que vou fazer é modificar, conseguir países. Portanto, este ponto final não é mais obter todos os países. O que agora vamos ver de Query. Então, você vai ver do corpo a entrada aqui? Eu acredito que quando estamos fazendo o post, você veria do corpo. Para que os pedidos tivessem os dados no corpo, certo? Então teríamos feito isso. Deixe-me ver se consigo encontrar algum daqueles com o corpo. Lá vamos nós. Então esse é o corpo que ele tira de quem quer que seja da consulta. Vamos olhar dentro da string de consulta que está sendo possível para os parâmetros. por isso que pedi que piratas fossem parâmetros, certo? Então, a partir de Params onde procurar campos que correspondem aos nomes como descrito em nosso RequestModel. Certo, então é o mesmo tipo de conceito que o dto write pede armas de fogo. Então eu só vou chamar esses pedidos de armas de fogo valores params, isso é uma palavra-chave. Então, em nenhum lugar procurando nossa consulta. String de consulta, desculpe, que teremos em campos para o tamanho dos lances e o número da página. Então, agora, o próximo desenvolvimento será envolvendo passar essa informação. Não receba todos os comandos. Então lembre-se que está em nossas unidades são garfo ou guitarra que você vê, oh, apenas devolva tudo de qualquer maneira, certo? Então o que eu vou fazer é pausar os parâmetros de consulta não para o get off e, claro, isso vai exigir uma substituição. Tudo bem. Não quero me livrar da origem. Eu vou chegar a ele pode servir algum propósito de outra forma. Então eu vou apenas criar outro, certo? Então vamos voltar para a nossa Unidade 04 unidades sobre o tipo de repositório genérico e temos gets tudo como é. Então o que eu vou fazer é criar uma nova declaração. Eu notei que eu tenho este novo tipo de dados aqui lista eu ph. Você verá mais sobre isso em um combustível. Então eu tenho tarefa recebe tudo e eu estou apenas recebendo as inclusões, bem como os parâmetros de solicitação. Então eu nem vou permitir que eles façam a filtragem e todas essas coisas porque nós não estamos realmente interessados nisso agora o que estamos recebendo tudo, mas queremos facilitar a PGA. Então deixe-me apenas ir em frente e incluir o que eu posso incluir quem declarou este tipo de dados ainda, para que possamos deixar isso em paz. E já que isso é conhecer a interface, eu preciso ir e atualizar o repositório genérico para que ele possa implementá-lo. Certo, então agora que está lá, que acorde eu coloco? Então leia Andrew fazendo tudo o que estou fazendo aqui. Bem, talvez nem todas as coisas porque OrderBy anormal, mas eu vou pegar esse código, colá-lo, não ouvir e devolver. Tudo bem, então eu vou devagar para que possamos ver exatamente o que está acontecendo. Então não há expressão. Posso pegar toda a expressão. Nós temos instalações para o incluir, mas nós não temos qualquer ordem BY então eu vou tomar essa nota. Eu sei o que eu preciso adicionar é uma facilidade para realmente bem filtrar nosso pico exatamente o que eu quero de consulta porque isso ainda está apenas retornando tudo. Então, neste ponto eu vou apenas ir em frente e cuidar desse erro, que é a lista de borda de IP. E se você olhar para as sugestões, a biblioteca que eu quero não está lá. Então eu vou até New Gets e pegar seu dinheiro ou isso. Então gerencie novos pacotes E GET. Boroughs de Gautam. E então eu vou procurar por ovos com pontos listas paginadas. Então esta é uma biblioteca muito proeminente que ajuda com a paginação. Então, vamos apenas dizer expansionista, núcleo MVC. Vá em frente e instale isso e saiba que está instalado. Podemos voltar atrás e tentar cuidar desses erros. Então este é o repositório genérico. Não, eu posso dizer usando listas de páginas X-dot, então eu vou em frente e fazer isso. Então, tornar o negócio isso é muito possível. Mas então por que fazer tudo isso quando há uma biblioteca, certo? Então vá para o genérico. Vamos incluir todas as referências que faltam. Tudo bem, e então a coisa legal embora é que não ouvir, ele está reclamando porque temos IP é isso faz guia de retorno ou fazendo para listar aqui. Então eu lista de páginas dá-nos a função de extensão que nos permite dizer a lista de páginas é pia. E então o nist de duas páginas terá dois parâmetros. Ele quer um número de página e o tamanho da página. Onde é que vamos conseguir isso dos nossos parâmetros de pedido, certo?
Então, na verdade, eu fui até pegar o nulo disso, e francamente vou tirar os intrusos. Deixe-me fazer uma pequena refatoração porque agora eu estou pensando sobre isso sempre que
chegar a noite toda em Pij é quando eles estão pagando os dados, eles provavelmente não precisam incluir nada sobre o país ou qualquer outra coisa, certo? Porque eles estão apenas listando adultos quando você tem os detalhes de algo, então você provavelmente quer incluir. Então, quero dizer, isso é com você. Talvez eu deixe as inclusões porque eu poderia ver valor em seu início do inclui balas e solicitar armas de fogo. Nós definitivamente queremos que isso seja obrigatório para esta versão. Então deixe-me colocar isso na frente. Acho que é por isso que a linha vermelha está lá. Porque sempre que você tem o apartamento, faz este estudo, você tem que ter os desejos anuláveis até o fim. Então lá vamos nós. Então pede params. Mas para a tarefa que está em pontos de consulta como nenhum rastreamento No.2 ph nist e eles estavam passando parâmetros de consulta ponto que eles se sentam em primeiro lugar o número de pH. Portanto, é importante sempre olhar para todos os requisitos e certificar-se de que você está passando o volume correto e, em seguida, eles queriam o tamanho da página e sim, eu tenho um lugar onde você pode obter isso. Tudo bem. E então eu acho que isso áreas lá porque nós precisamos ser um C. Lá vamos nós. Então não, podemos obter uma lista de páginas de qualquer coisa que temos em nosso banco de dados e eu preciso ir e corrigir meu repositório onde eu possa não ser anulado. E é claro que preciso movê-lo para a frente. Tudo bem? Então você vê como você constrói em seu EPA, minúsculo G e design feitos ao longo do caminho, eles são realmente necessários, mas, você sabe, uma vez que você sabe o que você está fazendo, sim, perto de você chegar em cima disso. Então deixe-me fazer uma construção e ter certeza de que
não perdi mais nada que eu veja aqui. Tudo bem, então eles estão vendo que é tudo. Não há nenhum. Ok, então este erro é porque eu ainda estou usando a função get Dawes. Então certo sabemos que temos que sair de funções para distinguir entre os dois. O que eu amo fazer é passar exatamente os parâmetros que o 1e Não, eu quero precisa, certo? Então, bem, na verdade, isso não está funcionando porque embora ainda seja preciso mais de um, então ainda está confuso sobre qual deles eu estou lidando. Então o que eu vou fazer provavelmente deveria ter feito isso desde o início. Vou mudar o nome e... Faça um novo ou um dia eles tentaram ser genéricos. Janet Mock dispara. Então deixe-me chamar isso de “ser bipado”. Pelo menos. Acho que está claro o suficiente. Então eu teria repositório genérico, nós fazemos isso em um repositório genérico. Fizemos essa mudança assim que descobri que é lá vamos nós, e lá vamos nós. Então vamos dar essa volta na floresta. Então só fez isso os países. E o fato é que nós fizemos isso em um lugar e é tão fácil
ir para qualquer outro controlador e fez essa mudança porque o trabalho duro já estava feito. Tudo bem, então essa é uma das vantagens de bombear Clean Architecture e ter um erro aqui e não nos surgiu louco, mas assim como corrigido. Certo, então vamos tentar de novo. E quando chegarmos a este ponto e vamos tentar trazer de volta dois pontos verdadeiros com o tamanho do lance 50
e, e a página número cinco, eu realmente vou definir um ponto de interrupção aqui para que
possamos ver os parâmetros chegando ou talvez membro e apenas colocá-lo para fora e 39. Tudo bem, vamos tentar isso. Então mande, tudo bem, então está aquecendo os pontos de interrupção. Então isso significa que o pedido foi reconhecido. Veja para obter os pedidos params lá temos 515. Tudo bem. E eles continuarão. E sabemos que vamos apanhar insectos em todos os nossos países. O pedido é para um PID diz um abismal, mas que não existe apenas de dois hotéis. Muito bem para os países, desculpe, por isso é a primeira indicação de que isto está a funcionar. Então vamos tentar de novo. Quero a página número um com P, tamanho dois. Terei dois países administrados por um deletado, certo? Vamos tentar isso. Então, quando enviamos, só pegamos a ferramenta, certo? Se eu requisitasse a página 1 com apenas uma que só recebo uma se eu solicitasse pH 10, que significa pular para os décimos registros. Então, o que a nossa lista de expedientes da biblioteca fez foi que modificou
automaticamente a consulta com take and skip. Deixe-me pular ali. Então, no link ou Entity Framework em vez, você pode realmente dizer algo como consulta. E você pode fazer um carrapato. Então você pega este número, direita, retorna um número especificado de elementos contíguos, e então você pode ver onde, onde ele diz ignorar um número. Então isso é realmente o que ele está fazendo. Então, quando enviamos o tamanho do lance ou digamos uma página número dez, significa pular dez, pular dez registros ou em nosso salto dez vezes esse número, oferecendo cartões e depois trazer de volta esses mini, algo assim, certo? Então tudo
isso, parecia confuso, não é tão difícil de escrever. Eu sou provavelmente eu odeia UM mais difícil do que realmente é o que as realidades que nós nem
sequer tivemos que fazer tudo isso por causa de nossa biblioteca fazendo isso para nós. Palavras é 2pi é listado, faz isso automaticamente, e é por isso que leva parâmetros de consulta talvez. Ok, eu meio que vou para aquela aula por trás disso. Então, tudo bem. Então sim, então é assim que implementamos a paginação. Então, obviamente, você provavelmente não está vendo todo
o poder disso porque eu só tenho muito poucos registros. No entanto, se vemos que talvez 50 hotéis neste banco de dados e, em seguida,
dissemos que queremos a página cinco e apenas dez registros. Então ele diria “Me dê isso”. Acho que a minha matemática está errada, mas espero que entenda a essência. Então certo, e tudo o que temos paging habilitado em nossa API. E mais uma vez, isso é você e o pedido solicitante. E se esses parâmetros não foram fornecidos, então, por padrão, dissemos à classe request params que os desvalores devem padrão para a página número um e um máximo de 50.
38. Manicura de erros globais: Ei pessoal, bem-vindos de volta. Então, nesta lição, vamos falar sobre a manipulação de erros globais. Então eu estou começando no controle para os países. E nós mencionamos anteriormente que quereríamos reduzir a necessidade de repetir este try-catch. Então, cada vez que wearable para fazer uma operação, enquanto é muito essencial, torna-se repetitivo ao longo do tempo, porque temos quatro funções onde continuamos escrevendo tente catch, tentado, holandês try-catch. E para todos os outros telefones nele seria importante. Em. Então, o que queremos fazer é implementar uma maneira global de lidar com exceções e reduzir a necessidade das declarações try-catch repetitivas. Então o que queremos fazer é padronizar o que acontece quando detectamos um erro. Porque quando
percebemos, fazemos a mesma coisa. A única coisa que é uma espécie de dinâmica seria
a parte onde vemos a localização, que para mim é realmente opcional e provavelmente não precisa necessariamente fazer a faísca. Mas a questão é que a mensagem é relativamente a mesma e nós sempre damos esse código de resposta 500. Então o que queremos fazer é ter uma maneira padrão de representar um aerossol e modelos. Eu só vou criar uma nova classe e eu vou chamá-la. E então, em erro, vamos ter três campos. Então vamos ter um código de status. Vamos ter a mensagem I. Então vamos ter um terceiro onde estamos fornecendo a mensagem como objetos JSON serializados. Então, para este, teremos Newton JSON, nêutron soft, desculpe, dot JSON. Então essa é toda a sua classe ou erro vai cuidar disso. O que eu queria fazer é estender nosso pipeline de inicialização, mas vou usar as extensões de serviço como o que temos feito nas últimas vezes. E eu vou ter um novo, e nós estamos chamando esta nova função configurar manipulador de exceção. E desta vez está recebendo o pipeline de middleware. Então, originalmente não seria entrar em serviços esta hora entra no construtor de aplicativos. Tudo bem. Então, neste, vamos em frente e dizemos acima ponto, Use manipulador de exceção. Tudo bem, então o ponto faz aplicação
central dentro e fora em si tem sua própria exceção lá. Então, estamos fazendo uma espécie de anulação para ver que é realmente assim que queremos que você opere. Então use manipulador de exceção e que precisamos do nosso pequeno Tolkien ou lambda olhando Tolkien. E então aqui nós abrimos e fechamos chaves encaracoladas e vírgula no final. Então, dentro deste bloco, e quando dizer doutrinas de erro tinham isso não sou eu adicionando o middleware costal chamado null. E eu vou ver assíncrono e meu conhecimento perito Tolkien sobre quando chamar contexto e, em seguida, meu lambda R1. Então, novamente, para outro objeto, tudo bem, então o que eu faço é toda vez que eu vou fazer uma dessas bordas, eu mostra ambos o ponto-e-vírgula no final das cuecas são, os parênteses estão lá fora, então eu não esqueço isso mais tarde. Tudo bem. Então, vamos ver, definir um pouco. Alguma constante. Estou definindo contexto dot response.status code para ser igual a códigos de status dot 500. Então, os mesmos 500 que retornamos toda vez que há um erro, estamos apenas configurando isso como uma constante para que não tenhamos que digitá-lo repetidamente. Então, onde eu estava arrependido? Portanto, o status aspas ponto status 500 Erro interno do servidor. E, em seguida, estou definindo o tipo de conteúdo para ser aplicativo JSON. Então eu vou dizer var recurso de contexto é igual dois contextos recursos
ponto obter recurso manipulador exceção que você pode precisar importar Será que I faltando tipo de dados para este, então você pode ir em frente e fazer isso. Então, o que vamos dizer não é se o recurso de contexto não é igual a null, então queremos dizer Log dot e, em seguida, erro de login. Então lembre-se que toda vez que algo falha, nós realmente fazemos isso. Nós temos o nosso logger e, em seguida, nós login erro onde passamos em qualquer coisa que está errado, certo? Então, eu vou dizer que se algo deu errado, eu vou apenas copiar este básico aqui, algo deu errado. Mas em vez de nome, muitas vezes obter países. Isto eu vou dizer erro de ponto de recurso de contexto. Então isso nos dará uma indicação do que deu errado, certo? Portanto, não erro, contexto, erro de ponto de recurso. Então vamos dizer, eu vou esperar, contextos está nos trazendo notas de programação assíncrona MCT é que esta pequena seta aqui é verde na cena que estamos vendo um símbolo sempre esperado por alguma coisa. Então, quando eu digo que nós, isto
é, não é tudo satisfeito em n é igual a um ou desculpe, a palavra-chave assíncrona não é tudo satisfeito. A terra vai embora. Então eu vou dizer esperar resposta ponto contexto. Então vamos dizer enviar de volta uma resposta para os contextos de chamada do contexto aqui realmente representa o controlador que está passando a informação. Tudo bem? Lucio, isso funciona em poucos. Então escreva assíncrono, certo? E então queremos dizer que queremos um novo erro. Então novo erro, e eu vou apenas ir em frente e inicializar este modelo. Lá vamos nós. Então, queremos um novo erro onde nosso código de status será igual ao status quo que acabamos de dizer aqui. Então, poderíamos ter dito facilmente que aqui, está tudo bem. Mas nós queremos isso. E também queremos que nossa mensagem seja igual a algo consistente. Então eu acho que aqui nós apenas disse Servidor Interno. Esses dragões, eu acho que isso é o que nós dissemos todas as vezes. Então, apenas a mensagem sendo igual a essa mensagem muito consistente. E então tudo isso queremos converter para string. Então temos um ponto-e-vírgula. Tudo bem, então vamos rever isso um pouco. Então, estamos vendo que queremos substituir nosso manipulador de exceção padrão. E a maneira que queremos que o tratamento de exceção ocorra é tal que, quando um acontece, escrevemos o log e, em seguida, geramos um modelo de erro com o código de status e a mensagem. Certo, então isso eliminaria a nossa necessidade de fazer isso manualmente todas as vezes. Agora, depois de escrever esse código de middleware traje, o
que precisamos fazer é ir
até a inicialização e eu vou colocar isso bem embaixo da arrogância. Então nós vamos dizer isso acima, ponto configurar manipulador de exceção, e que deve ser isso. Então o que eu vou fazer como uma prova de conceito é removido a bandeja porque tentar realmente significa fazer isso. Assim, com todas as tríades dispostos a tentar fazê-lo, o único propósito real são os aspectos de mudança jogo da captura tentativa é que ele vai ver, tentar esta operação e lidar com as setas que ocorrem. Então, se eu tiver manipulação global de erros, então eu não preciso ir em frente e colocar em qualquer coisa para lidar com isso manualmente quando algo acontece. Então vou tentar conseguir a identificação do contrabando. Isso é bom. Então vamos fazer alguns testes com isso como prova de conceito. E o que eu também vou fazer é, ok, nós vamos apenas, nós vamos apenas olhar para como ele funciona. Então eu vou começar e eu vou executar nossa solicitação para países barra API barra barra um. E então estamos pegando o país número um, que é a Jamaica com o hotel. Então tudo está funcionando bem. Isso é o que esperaríamos. Tudo bem? Não, é difícil para mim introduzir um erro de outra forma. Então o que vou fazer é apresentar o dinheiro. Bem aqui no código o que eu vou fazer é lançar uma nova exceção porque a captura está lá para pegar uma exceção. Então, se eu lançar uma exceção eu mesmo, então o que aconteceria é que o código realmente pararia de ser executado neste ponto. Eu nunca desço lá. Agora eu quero ver qual resposta eu obteria quando essa exceção for lançada. Então vamos seguir em frente e executar mesmos pedidos do Carteiro que foi apenas bem sucedido e eu vou apresentar a exceção lance. E quando fazemos isso, vemos que estamos recebendo código de status e mensagem. E esses dois campos são os mesmos dois campos que acabamos de definir em nosso modelo de erro. Tudo bem, então o que está acontecendo aqui é que o manipulador de exceção está realmente globalmente observando sempre que uma exceção é capturada, então ele está fazendo o que pedimos para fazer, que é registrar o erro e dizer que algo deu errado aqui. Então vamos ver o que está no registro e o log m vendo minha exceção aqui. Então sistema exceto SON System.Out Simpson foi através e eu poderia ter feito exceção mais específica este ponto de dados. Mas então, se você olhar para baixo, ver todo o oleoduto como para onde ele foi. Então o que acontece é que ele foi para o controlador. O controlador lançou uma exceção e, em seguida, eles exceção lidar com o manipulador de mão que substituímos, aquecer o nosso código personalizado. E então ele disse, ok, o que eu devo fazer? Bem, as estatísticas são pontuadas é 500, o tipo de resposta é JSON. Eu vou registrar o erro e então eu vou escrever Bach em nossa resposta que isso aconteceu. Assim, podemos realmente com segurança e confiança, tendo feito isso, remover todas as outras capturas de tentativa de qualquer outro lugar no código. Porque mais uma vez, aquelas pegadas de tentativa estavam lá para
garantir que estamos lidando com todos os erros graciosamente, são tão graciosamente quanto possível. Então, agora que nós tornamos isso global, você quer, você pode fazer apenas o que você me vê fazendo, e apenas passar e tirar todas as capturas de pista em qualquer quantidade que você espera ser executado. Vá em frente e execute isso. E o que você percebe é que por causa disso, a remoção dessa dependência da captura de tentativa está em toda parte em todas as opções. Quando você está expandindo e estendendo sua funcionalidade abs, seu olhar trimestral muito mais limpo, porque então você e sua equipe podem escrever o código sabendo muito bem que sua manipulação de exceção está acontecendo em uma escala global. Então eu fiz isso com o país. Você pode ir em frente e limpar o controlador do hotel, bem como o controlador NLL que você pode ter.
39. Implementação de API: Ei pessoal, bem-vindos de volta. Nesta lição, vamos falar sobre a versão da nossa API, embora a razão pela qual queremos a versão sejam APIs que ao longo do tempo, mais funcionalidades irão evoluir lá
momentos em que podemos mudar a forma como os nossos endpoints se comportam, genes , alguns verbos são a forma como a carga é estruturada, todas essas coisas. Mas então você não quer apenas fazer isso. E então todos os seus clientes um dia acordam e percebem que eu teria que mudar toda
a sua base de código porque você implementou uma mudança perto da API. controle de versão da API permite que você tipo de executar paralelamente entre a maneira antiga de fazer as coisas e a nova maneira de fazer as coisas. E então, eventualmente, você pode eliminar gradualmente o ponto do gramado que todos os clientes têm. Claro, depois de um aviso e educação adequados, nosso próprio novo padrão de fato que você está introduzindo. Então a retina quer falar sobre controle de versão e nossa jornada vai começar aqui mesmo,
em um novo get, onde nós vamos obter a Microsoft está sendo nas principais bibliotecas de versionamento MVC. Eles podem ir em frente, procurar por isso e instalá-lo. E depois de ter feito isso, vamos com as extensões de serviço e vamos adicionar uma nova função. E estamos chamando essa configuração de versão. Claro, você sabe, você pode chamá-lo do que você está confortável com. Mas agora estamos chamando de configurar o controle de versão. E, em seguida, dentro desta função, vamos ter cheiro de código para o, então estamos vendo serviços, versão API. E, em seguida, vamos incluir uma inicialização opção onde estamos vendo um relatório versões API, verdadeiro relatório SWOT que desvios significa que haveria um cabeçalho em nossa resposta é ver esta é a versão que você está usando. Então, quando nossos clientes conversam com a API, vamos ver na resposta, sim, você iria apenas aquecer esta versão da API. Vamos assumir a versão padrão quando não especificado. Então, se tivermos 123 versões da API e o campo do cliente para especificar que eles querem usar a versão 13, etc. Então nós estamos indo apenas para usar um padrão que temos ido em frente e especificado abaixo. Nós dissemos que a versão padrão da API será a versão um da API. Então você pode ir em frente e em 2D qualquer falta ou, por exemplo, como de costume. E depois de ter feito tudo isso, podemos passar para a inicialização e podemos registrar os serviços do sistema operacional. Então eu vou colocar esse aqui embaixo. Tudo bem. Agora o que vamos fazer é criar um novo controlador. Então, eu só vou para Add. Controller vai escolher uma API e eu vou apenas deixá-lo vazio. E então, por exemplo, vou chamar este país dos cisnes de v2. Tudo bem? Então controlador V2 país. Então temos um novo controlador. E eu vou inicializá-lo com algumas das coisas do controlador de país original. Então eu vou apenas copiar todas essas coisas. Então, eu só quero um ponto final apenas para fins de teste. Então, o único ponto final com o qual estamos lidando
será chegar então vá em frente e inclua qualquer referência perdida. Bem, na verdade, vou mudar a forma como este acessa os dados. Então, em vez de usar a unidade de trabalho, vou deixar que implemente o contexto de banco de dados diretamente. Então, isto é. Contexto do banco de Então, é claro, lembre-se que isso é, é tabu. Você realmente não quer fazer isso enquanto ele vai funcionar, não
é melhor prática ter o APA olhando diretamente para os dados. Mas para este exemplo, vou apenas fazer isso para que tenhamos um tipo de retorno diferente entre os dois controladores. Então, vou inicializar isso o mais rápido possível. E então uma vez que isso é feito, uma vez que é injetado, e este é o seu controlador V dois. Tudo bem? Então podemos especificar a rota aqui para ser a mesma coisa que a origem. Vou conjurar o controle porque lembre-se que eles vão para o controlador Khan, certo? Então este seria o país da barra da API. No entanto, isso por padrão seria API barra país V2. Mas e se eu disser que não quero o nome do controlador? Eu queria ser o mesmo ponto final. Agora, se for o mesmo endpoint, por padrão, a API não saberia para onde ir porque ele vai ver este com a raiz e ver este com a mesma rota e não saberia para onde ir. Agora o que eu posso fazer é especificar que este é a versão da API
e, em seguida, especificar que este é 2. Tudo bem, isso deve ser uma corda. Então API versão 2, o que aconteceria no entanto é que o cliente precisará especificar qual endpoint é que ele espera aquecer. Tudo bem, então eu vou acabar com ela e limpar isso, colocar em enviar um pedido de parâmetros nesta situação. E eu só limpei o resto. Não queria aborrecer-te com a minha limpeza, mas isto é tudo o que estamos a fazer. Só estamos vendo países de “pegar”. E ele vai retornar contextos pontos países, que só vai obter a lista de têmporas no banco de dados e retornar isso. Tudo bem, então o tipo de retorno aqui será diferente do dto return-type do nosso endpoint original. Certo, então vamos fazer um test drive e ver como isso funciona. Agora, se você se lembra em nossa configuração nós tínhamos dito que
devemos assumir a versão padrão quando não especificado. Então o que fizemos aqui foi apenas repetir a mesma chamada que a roda é devido aos nossos endpoints. Você acabou de dizer API Slash Country. E vamos apanhar o Maco, o do nosso país. Mas então não, se você olhar na seção de cabeçalho, você verá que a API suportou versões 1 Não Recall que nossa configuração teria definido 1 como nosso padrão. Tudo bem, de modo que está trabalhando em, percebe que existem versões em que está retornando o conjunto de resultados do padrão. Sabe como fazemos com que nosso cliente saiba como especificar qual versão deseja? Existem algumas maneiras de fazer isso. Número um, podemos solicitar por uma string de consulta para que possamos ver se você quer que o outro que você passa em uma string de consulta são via param. Vamos apenas colocá-lo na versão do traço do Param APA. E então nós veríamos 2. E então eles enviam, você veria que nós recebemos de volta um 200 OK, e a versão de suporte é 2. Então deixe-me, deixe-me colocar isso em um pouco mais de contexto para que possamos visualizá-lo. Então sabemos que temos dois controladores. Tem controlador Quadratura v dois, que tem a mesma raiz que os originais. Eu queria colocar pontos de interrupção em suas respectivas funções. E então vamos ver qual deles recebe calor para ser Estan que pede. Então eu vou apenas repetir o pedido para a versão 2. E, em seguida, quando o visual studio acende sabão, você vê que ele está atingindo o novo controlador que configuramos usando o mesmo ponto final, exceto que estamos passando na string de consulta que queremos a versão dois. Tudo bem, então eu posso continuar, ele atinge o banco de dados e retorna os dados de acordo, e tudo bem. Mas se eu não incluir o param e depois fizer os mesmos pedidos, perceba que está atingindo nossas origens. Então é isso. Assim, podemos ter mais de um controlador com a mesma rota, exceto que existem versões diferentes. Então essa é uma maneira rápida para o cliente especificar que eu quero a versão dois. Se eles não especificarem, então nós vamos enviá-los para a versão em um. Agora outra maneira de fazermos isso, e eu vou parar com isso agora mesmo. Outra maneira que podemos especificar qual deles é qual versão são baixos. O cliente é especificar qual versão deseja modificar a raiz. Então eu posso realmente tipo de super impor
aqui mesmo entre a palavra API e o nome do endpoint. E ver que eu quero que você passe em v cólon e a versão API. Tudo bem? Então, quando fazemos isso e eles estão ligados, eu vou tipo de modificar o endpoint original ou missões. Então inicialmente tínhamos barra de API, barra de país. Colocamos a string de consulta para obter a versão 2, mas então não, eu modifico a raiz, então eu devo ser capaz de vê-lo para apontar ou aqui na URL, certo? Então APIs barra 2 país barra. E eu ainda tenho o ponto de interrupção CSI dual? Então vamos ver se ele é atingido e ele realmente é atingido. Então você vê que essa é outra maneira que o cliente pode especificar qual versão da API deseja e endpoints. Então versão 2.0. eles especificam 2 para que ele aquece os pontos finais apropriados. Não, pode haver uma situação em que você não necessariamente quer
aumentar a URL porque agora tudo o que temos para aumentar o nosso, estamos forçando os clientes que eles têm que mudar seus URLs BS, Tudo bem, então eles têm que ver o barra api barra 2 barra endpoint ou adaptar-se a Boston como uma string de consulta. Então, outra maneira que podemos obter o versionamento para funcionar e deixe-me apenas parar o bug é adicionar uma extensão de serviço rasgado configuração para versionamento, onde vemos a opção dot API versão ou qualquer um. E se olharmos um pouco para fora o que isso está fazendo para vê-lo. Ele é usado para ler o serviço de API quando especificado pelos clientes. Tudo bem, então podemos ver no novo leitor de versão API cabeçalho. Então o que é, um barco, o pedido que queremos ler, certo? Então, estamos dizendo que queremos o leitor de versão API cabeçalho e estamos procurando um cabeçalho com o nome da versão API. Então isso nos permitirá a um, não apenas manter nossas raízes como tínhamos antes,
mas permitir que o cliente simplesmente adicione um cabeçalho em vez de ter que alterar sua URL inteira. Então vamos tentar essa. Então carteiro, vou apenas remover o 2.0. da nossa URL. E, em seguida, o que eu vou fazer é especificar
nas seções de cabeçalho que você tem heterocíclico fez versão traço API. Então esse é um novo cabeçalho que eu queria passar sobre 2.2. E então quando eu enviar isso, nós atingimos nosso ponto de interrupção em nossa versão 2.0. controlador. Tudo bem, então algumas maneiras você terá diferentes personalidades de telefone ou diferentes métodos de fazer as coisas em vez de introduzir muitas mudanças quebrando tudo
na base de código que todos já assinaram, você pode fase em um novo e apenas chamá-lo de versão, esta versão que, e tê-los passar no cabeçalho para a versão apropriada quando necessário. Ninguém mais que eu vou mostrar a vocês sobre este tópico é como você pode especificar que algo está obsoleto. Então, em quietude agora em diante e eu vou continuar usando este aqui porque este é o experimento. Digamos que um verso na ferramenta de três pontos. Portanto, nenhuma versão 2 está obsoleta ou não é mais a versão preferida. Então você pode realmente adicionar à anotação aqui que o valor obsoleto desta versão da API é verdadeiro. Então o que aconteceria é que quando ele envia o cabeçalho através de nossa resposta e nós podemos testar isso aqui. Então esta era uma solicitação anterior, então eu vou executar outras solicitações, bater o ponto de interrupção, continuar, mas então olhar para ela. Esta é a API de nariz obsoleta versão 2. Então não, não é mais dizer, oh, você está aquecendo a versão da API está deixando você saber que este não é mais o preferido. Está bem, provavelmente está perto do fim da vida, seja lá o que for. Então, essas são maneiras pelas quais você pode realmente implementar o controle de versões em sua API para ajudar a controlar as taxas do corredor VOCÊ em suas alterações à medida que você avança.
40. Implementação de caching: Ei pessoal, bem-vindos de volta. Nesta lição, exploraremos a implementação de cache em nossa API. Agora, o cache pode melhorar significativamente o desempenho da API. Basta pensar em quando temos centenas, talvez milhares de clientes assinando a API, eles estão todos tentando encontrar todos os
países contados e provavelmente até ambos ao mesmo tempo. E eu realmente posso pegar um pedágio no desempenho
da API com base em toda a infra-estrutura e um pé, eu tenho que acertar o banco de dados com cada solicitação. Assim, o cache irá introduzir uma espécie de camada de acesso rápido em cima do armazenamento de dados real. E isso reduzirá significativamente a frequência com que temos que puxar o banco de dados. Então, o que vamos implementar é um cache. Nós estaríamos olhando para implementar uma experiência especializada em mecanismo para reduzir o todo, muitas vezes nós temos que ir para o banco de dados. Estaríamos olhando para implementar um mecanismo de validação para reduzir a largura de banda da rede. E no final desta lição, queremos apenas uma sensação geral de cache, por que o temos e como ele pode ser implementado. Agora existem três tipos de cache e eu só queria dar a vocês e é um temido antes de entrarmos em toda a questão do código. Então, o cache do cliente vive no navegador. Então é um cache privado porque é, você sabe, você precisa de um único cliente RNA específico. Tudo bem, nós temos o cache do gateway que tipo de vive no servidor e é um cache compartilhado. Então, as implantações de gateway, eu acho, e todos os clientes atingindo o Gateway ou em qualquer ponto no tempo estariam aquecendo esse dinheiro. E eles, nós temos nosso cache de proxy, que também é um cache compartilhado. O que é ele não vive no servidor, ele vive na rede. Para iniciar o cache ou recurso, é muito simples. O que precisamos fazer é adicionar os atributos de cache de resposta e definir quanto tempo o cache deve viver. Quatro, certo, então sobre qualquer controle, sobre qualquer ponto final. E eu vou começar com países. Sabe, nós só experimentaríamos entre esses dois. Então eu vou apenas adicionar o atributo que diz cache de resposta. E então a duração é igual a 60. Então 60 significa “se Barnes”. Certo, então estamos configurando o controle de cache com uma idade máxima de 60 segundos. Se você observar a duração, verá
que isso define a idade máxima no cabeçalho do controle de cache. Então, quando um cliente consulta para Nieto a partir do endpoint, haverá um cabeçalho incluído que diz que esta é a vida útil do dinheiro que você está recebendo são dados armazenados em cache que você não é bom. Então vamos para o modo de depuração e realizar um teste rápido. No modelo de postagem, o que você deseja fazer é apenas certificar-se de que a sua opção de cabeçalho de cache
ascendido não está desativada. Então você pode fazer é ir para Configurações de arquivo e em Geral não olhar para a frente que sentado atende ou está desligado. Caso contrário, você pode prosseguir. Então já sabemos que podemos olhar para todos os cabeçalhos voltando. E eu vou enviar. E quando obtemos a resposta, vemos que nosso cabeçalho de controle de cache está voltando e tem a idade máxima de 60 anos. Tudo bem, agora isso é realmente apenas o cabeçalho, então nós não estamos realmente mudando nada ainda. Isso é apenas deixar o cliente saber que, enquanto os dados são armazenados em cache, o que é claro que realmente precisamos armazenar os dados em cache. Então vamos ter que modificar algumas de nossas configurações em nossa inicialização, que é onde eu comecei. Então, em nosso ponto de inicialização cs, vamos adicionar este novo registro de serviço na função configure services. E que eu só vou colocar pão aqui. Então, serviços que adicionam cache de resposta. E então, depois disso, precisamos registrar nosso middleware, que eu vou fazer logo acima do middleware de roteamento que diz app.use cache de resposta. Então você pode ir em frente e adicionar essas duas linhas. E então o que vamos fazer é fazer mais dez. E quando eu executar este pedido, estamos vendo um novo cabeçalho. E este indica o número de segundos que o objeto esteve em um cache de proxy. Tudo bem, então nós apenas pensamos bolha nos diferentes tipos de cache. Então nenhum lugar implementando nosso cache proxy e ver o valor aqui é nove. Então, se eu ganhar outro e você ver que é nulo 32 segundos para a idade máxima de seis anos. Então, praticamente dentro da vida, se continuarmos a puxar, ele, vai continuar a obter um valor diferente para o ID. Então, quando eu faço isso, você vê que a idade se foi porque nós
excedemos o solo de 60 segundos onde eu realmente fui ao banco de dados desta vez, voltei e não há idade. Mas se eu puxá-lo de novo, agora ele está me dizendo que tudo bem, é dez segundos de idade. Tem 14 segundos, etc. É NORM.DIST vai voltar para o meu começo bem rápido e vamos explorar todo o fim de semana provavelmente inter implements, desculpe, um válido mais global porque direito sabe, eu teria que sentar isso manualmente sobre cada opção ou todos os terminais. E então se mudarmos de 60 para 120 para denotar fora para passar por cada um. Então, o que podemos fazer na inicialização é adicionado à configuração para adicionar controlador. Então eu vou colocar na minha expressão lambda. O Tolkien e web R0 e outros colocando as chaves vai fazer, você sabe, se tivermos mais de uma linha para configurar, isso torna mais fácil. Bem, o que eu vou adicionar é uma configuração para ver perfis de dinheiro adicionar pontos. E queremos a duração de 120 segundos. Então aqui nós podemos tipo de definir o perfil de caixa, que então podemos usar e reutilizar ao longo. Então eu preciso, deixe-me ver o que eu preciso aqui. Preciso de um ponto-e-vírgula no final. Tudo bem, lá vamos nós. Então config dot perfis de caixa dot add. Damos qualquer nome, você sabe, dentro da razão. E então nova duração do perfil de caixa. E você pode adicionar outras propriedades para o perfil localização verbo um cabeçalho Ionia, muito complicado. Mas o que sabemos é em vez de especificar a duração aqui neste cabeçalho. Eu posso ver perfil, bem, Deus, Nome
do Perfil é igual a e, em seguida, colocamos esse nome que acabamos de especificar nesse slot. Então, se você quiser ir em frente e testá-lo, eu não vou testá-lo novamente porque nós já temos o justo fora dos cabeçalhos voltando para a idade. Então não, aumentamos para Indian
em qualquer ponto final que desejamos ter esse dinheiro. E é mais do que provável que queiras falar sobre os que estão a ler. Os perfis get seriam os únicos a ter esse perfil de cache. Você não precisa necessariamente disso sobre a criação e outras operações. Certo, então vamos falar sobre uma situação em que nossos dados podem ficar obsoletos. Então, como eu disse, com o dinheiro, é preciso como uma cópia rápida da camada de dados e ele retorna esses dados pelo tempo que dissemos para ele. Então, neste caso, são dois minutos. Bem, vamos estender isto para talvez dez minutos. E então a primeira vez que o cliente tenta obter dados, então ele vai trapacear e entrar, obter uma versão em cache depois. Mas então e se cinco minutos para este dez minutos ou dois minutos para este período de dez minutos, uma atualização realmente ocorreu. Então novo país foi adicionado, certo? E então eles ainda estão obtendo dados obsoletos enquanto os caches estiverem ativos. Então não queremos isso. Não queremos isso quando,
quando os dados mudarem por baixo, eles ainda estiverem recebendo dados antigos. Então, para adicionar a isso é alguma validação. Tudo bem, então para fazer alguma validação ou adicionar cabeçalhos para validação e experiência em verificações, vamos incluir uma nova biblioteca. E vai ser uma biblioteca chamada Marvin Dot cache headers. Tudo bem, então é a velocidade em um middleware núcleo que adiciona cabeçalhos de cache HTTP às respostas. E você vê os diferentes cabeçalhos que o controle de cache expira, etag e Last Modified. Tudo bem, então implementa cache, expiração e validação. Então você pode ir em frente e pegar isso. E eu vou refatorar ou um quarto de bit. Então, nas extensões de serviço sobre quando adicionar uma nova função, onde estamos vendo estáticos públicos, anulados configurar cabeçalhos de cache HTTP e sabemos o chefe de drill na coleção de serviços. E então eu estou tomando essa primeira linha que nós adicionamos serviços ponto adicionar resposta jorrando, bem como serviços ponto adicionar cabeçalhos de cache HTTP. Então, vamos levar aqueles dois. E então o que vamos fazer é apenas e eu faço referência à inicialização, então onde eu tinha o original E eu vou apenas adicionar uma referência a essa função que vai inicializar essas duas chamadas de serviço certo? Depois dessa modificação, vamos adicionar o middleware. Então, após o cache de resposta dos EUA sobre quando adicionar ponto usar cabeçalhos de cache HTTP. E antes de fazermos mais modificações, só para ter certeza de que tudo está bem, vamos fazer um teste rápido e enviaremos um novo pedido. E quando olhamos para a lista de cabeçalhos voltando de que solicitações, olhar para expira Last-Modified, temos um ETag. Identifica versões de um recurso específicas. Então é apenas como um pequeno hash que diz que esta é a versão do detalhe ficando muito e outras coisas. Então vemos que estamos recuperando alguns cabeçalhos novos ao longo do caminho, certo? Você também notaria que a idade máxima é meio que voltou para 60 anos. Então, sim, foi 12V sets em 12 em, mas ele subiu para 60. Então vamos explorar como podemos personalizar essa idade máxima. E a maneira como vamos fazer isso é voltar para nossas extensões de serviço e adicionar o seguinte código no ponto de serviços, adicionar cabeçalhos de cache HTTP. Então vamos definir um Tolkien, chamá-lo de experiência na seta opsin lambda. E nós vamos dizer experiência na opção max, idade 65120, seja lá o que quisermos, podemos ver a experiência na localização do cache upshot. Queremos que seja privado ou que seja um sermão público, mas eu vi público ou privado. Então, digamos que queríamos isso privado. E então a opção de validação, você vê a maioria da revalidação é igual a true, o que
significa que uma vez que os betas mudam, devemos passar por esse processo. Não recebo depois de fazer essas modificações, podemos realmente remover o cabeçalho do recurso. Certo, então vamos fazer mais um teste. E veremos que a modificação é realmente global. Tudo bem, então mesmo sem colocar o recurso R, desculpe, o atributo logo acima do recurso, vemos que ainda estamos recebendo sobre os mesmos cabeçalhos e eu apenas fui em frente e eles vivem em toda a vida do 1-20. Certo, então a próxima coisa que quero mostrar são os orgânicos. As coisas que eu queria mostrar seriam os atributos
personalizados que você pode realmente adicionar logo acima do ponto final potencial que você deseja uma configuração diferente para nós. Então, sim, dissemos a sessão global na inicialização ou desculpe, na configuração do serviço. Mas, em seguida, sobre o endpoint, você pode realmente substituir isso. Então você pode adicionar as referências que faltam. Então cache HTTP, expiração e AUC Yolanda localização diferente. Você quer que seja público e este deve ser 60. Você pode realmente substituir as configurações globais aqui. E então você pode dizer a este que ele não precisa revalidar. Então, apenas voltando para os cabeçalhos chegando mas saiba que implementamos cache apenas para passar por eles mais uma vez, este rebocador realmente representa o único, como eu único hash para dizer que esta é a versão dos dados que UIC. Se, se dentro da vida útil do cache, algo mudar, então essa tag
realmente vai mudar e então você obteria uma nova tag. Mas, então, enquanto o Datastore não mudar, o que estamos fazendo é apenas armazená-lo em cache para que não tenhamos que acessar
o banco de dados para trazer os mesmos dados toda vez que alguém quiser. É pelo menos por dois minutos, se conseguirmos um, são pedidos. Não precisamos necessariamente ir ao banco de dados para o SIM ou dados. Então, essa é a vantagem de adicionar cache à sua API. É claro que, caso a caso, você pode personalizar como endpoints específicos fornecem os dados em comparação com outros. Você também pode nem precisar de cache com base no aplicativo ou pode não ser adequado para o tipo de operação que você está fornecendo a API para. Então isso é apenas mais uma coisa que eu acho que é bom para você saber e você pode usá-lo, tê-lo em seu arsenal para quando necessário.
41. Limitação e contorno: Ei pessoal, bem-vindos de volta. Nesta lição vamos falar sobre limitação da taxa. Agora, limitação de taxa ou limitação como também é chamado, é uma técnica pela qual impomos certos limites no todo. Muitas vezes alguém pode atingir o nosso endpoint e realmente obter o meu beta. Então, é claro, se alguém vem e bombardeia o endpoint tanto quanto temos cache e todas essas coisas. O fato é que o endpoint é realmente comprovado para um ataque de negação de serviço ou DDoS. E o que queremos fazer é tipo de colocar um mecanismo em que quando detectamos muitos pedidos de uma fonte, podemos tipo de bloqueá-los e dizer, hey, aqui, exagerando. Fora do potencial ataque DDoS, ele realmente nos ajuda a tipo de medidor OMS muitas vezes qualquer cliente acessa dados e muitas APIs muito populares ou seu Google. E eu vou apenas dizer Google, mas todos esses grandes players com APIs e SDKs, todos
eles têm alguma forma de limitação. Se você ler os requisitos e os termos de uso de suas APIs, eles têm algo lá para ver que você pode solicitar pode ser 100 por Minitaur, 100 por hora coisas escada. Então, hoje vamos configurá-lo em nossa API apenas para ter uma noção de como ele é feito. E nós estaremos usando a biblioteca é Speed.net Core taxas limites. Então podemos ir em frente e instalar isso. E uma vez que isso é instalado, a próxima coisa que queremos fazer é passar para uma inicialização e alo ou aplicativo para usar cache de memória porque ele vai usar cache de memória para tipo de armazenar e manter o controle de quem solicitou Watts e quantas vezes pediram no momento certo? Então, novamente, eles dirão serviços que adicionam cache de
memória bem ali no funcionamento dos serviços de configuração. Em seguida, temos algumas modificações feitas na Extensão de Serviço. Então eu já tenho a citação aqui. E esse método é chamado de configurar limite de taxa. E já sabemos que a coleção de serviços e o que estamos fazendo aqui é configurar um conjunto de regras para que você possa simplesmente ir em frente e
copiar o código e incluir todas as referências que faltam à medida que você avança. Então vari, regras de limite é igual a uma nova lista, realmente limita regras. Eles podem ter várias regras. Então temos que inicializar um novo objeto regra que nos permite especificar os endpoints particulares. Ou, neste caso, estou vendo Star, significa que cada ponto final vai aderir a esta regra. Então, com base nessa estrutura, eu posso realmente ter várias raízes. Posso dizer vírgula e fazer uma nova regra. Tudo bem, deixe-me copiar e colar. Posso fazer uma nova regra, especifica um ponto final específico e, em seguida, alterar os limites. Então este é que você está limitado a uma chamada por segundo. Tudo bem? Isso é meio curto. Digo, podemos dizer dez segundos, uma chamada a cada dez segundos. Posso ver uma chamada a cada 10 minutos ou 100 porque depende de você. Você pode configurá-lo novamente, se você tiver regras diferentes por endpoint, poderá ir em frente e adicionar essas regras e especificar os pontos finais específicos aos quais elas são aplicáveis. Neste momento, vou apenas fazer uma regra global. Então eu só vou dizer todos os pontos finais e eu vou configurá-lo para algo que é muito pequeno para que possamos vê-lo em testes, certo? Então eu vou ver em cinco segundos você só tem permissão para uma chamada em qualquer ponto final. Então vamos em frente e dizemos serviços ponto configurar. Vou colocar as opções de limite de leitura IP e nós apenas dizemos opções, não regras gerais é igual às regras de limite de taxa que acabamos de definir. Fora disso, precisamos adicionar esses serviços singleton na forma de eu limite de taxa contador loja. E isso vai ser associado com armazenamento de contador de limite de cache de memória. Então, todos esses são apenas pedaços de código que eu precisava para suportar a biblioteca que importamos isso. Assim, uma biblioteca diferente pode implementá-la de forma diferente. Mas este é o código necessário para esta biblioteca em particular, digamos Candace, clique em pausa, escreva-os fora. Neste ponto, intellisense, vamos preenchê-los porque você é qualquer um dos pacotes. Agora afterword não in-service extensões estão indo apenas para voltar para inicializar e vamos adicionar essas duas linhas,
serviços ponto configurá-lo limitando, que é o método que acabamos de configurar e os serviços que adicionam HTTP acessador de contexto. Então isso nos dá acesso ao controlador real e seu funcionamento interno quando necessário. E, finalmente, vamos adicionar o middleware onde o roteamento de etanol. Então eu vou colocar seus anúncios em qualquer cache. Temos app.use IP apressado limite e, claro, incluir quaisquer referências ausentes. Agora, existem códigos de resposta diferentes usados quando eles estão respondendo para ver muitas solicitações. Em tempos mais recentes, 429 tem sido usado, o que significa literalmente muitos pedidos dentro do passado, testemunhou plataformas usando para 20, o que significa melhorar aqui com e outros. Então vamos testar isso. Até agora país que eu vou bater enviar. E se observarmos os cabeçalhos, veremos que
obtemos cerca de três novos cabeçalhos,
X3, limita o raio-x, permaneceu limitador de significado e limite de redefinição, certo? Então está mostrando que o limite é de cinco segundos. Você não tem mais, significa uma janela de 5 segundos e o reset vai ser neste momento carimbos. Então, se eu acertar isso várias vezes, tudo bem, eu vou usar um endpoint diferente porque eu acho que este é previsto pelo cache. Então, ele pode não, com base na minha configuração
de cache, ele não vai violar o acelerador. Tudo bem, então eu vou usar o hotel porque lembre-se que nós montamos todas essas coisas no país e pontos. Então deixe-me ir para o hotel, que eu não li que eles modifiquem tanto. Então já envia um pedido e ele está me mostrando os mesmos cabeçalhos, limites, etcetera, etc, fs e outro, o que se desenrola como linhas mais tarde. Tudo bem se eu enviar outro,
muitas solicitações, tudo bem, então ele diz tentar novamente depois de ver enviar outra solicitação após 1 segundo,
então nada voltou, mas a cota de chamadas API de mensagem
excedeu o máximo admitido por cinco segundos, certo? Então está me avisando que eu preciso tentar um dólar nesse tempo. E quando o fizer, lá vamos nós. Se eu tentar novamente, tente novamente após quatro segundos, tente novamente. E se eu continuar fazendo isso em vez disso, Adopte Valley continua mudando em relação ao número de segundos que eu tenho baseado no último pedido. Então é assim que podemos adicionar limitação. E ele automaticamente mais uma vez dá, mas que para 29 para dizer muitos pedidos. Tudo bem, e essa mensagem, para que o cliente saiba que, hey, você está bombardeando a APA. Melhore ouvir a calma.
42. Analisar e adicionar mudanças no GitHub: Tudo bem, pessoal. Então, onde é outro marco em que vamos apenas rever as coisas que implementamos nesta seção. E, em seguida, mudanças de guitarra tendem a GitHub. Então, indo em ordem de falha, nós fizemos o primeiro seria paging. Então implementamos beliscar onde passamos em alguns parâmetros de solicitação para os países do nosso get. E também fomos em frente e definimos alguns padrões para dizer que se eles não fornecerem nenhum, então nós vamos fornecer essa quantidade de informações antecipadamente. Caso contrário, damos ao cliente a oportunidade de dizer que ele quer tantos registros a partir deste ponto. Não são apresentados pelo número, bem como pelo pH, certo? Então isso é uma coisa que implementamos. Também implementamos o tratamento global de erros, que nos permite criar ou escrever nosso código sem a necessidade de muitas tentativas de captura. E vem um pouco mais limpo do que era antes, sempre que estamos vendo try-catch, try-catch. Tudo bem. Outra coisa que fizemos foi implementar o controle de versão em nossa API. Então criamos essa controvérsia para o controlador apenas para fins experimentais, onde especificamos a versão da API e exploramos como
podemos permitir que o cliente especifique qual versão da API é que ele quer. E eu acho que o último pedaço de configuração teria eles positon como cabeçalho. Tudo bem, então em nossos serviços estendidos, nós colocamos na loja para o tratamento de exceção e manipulação de exceção
global para dizer, você sabe, quando há uma seta registrada e retornar com aquele 500 para o controle de versão, nós dissemos que queremos implementar o controle de versão. Lendo a partir do cabeçalho que está sendo passado com a solicitação, especificamos a versão padrão da API para ser 1. Então, se o dinheiro é especificado, então é 1. Também analisamos a implementação do cache. Então nós podemos realmente apenas fornecer os dados por até um certo período de tempo antes de ter que puxar o banco de dados para a próxima solicitação. E também colocamos em validação para garantir que uma vez que os dados subjacentes mudam, o tipo de dados é atualizado no topo da Caxemira. E por último, mas não menos importante, quem colocou em limitação para tipo de controle com que frequência um determinado cliente com base no endereço IP, pelo
menos com base na forma como configuramos, ele, pode atingir um determinado endpoints. Então certo saber que o limite é muito pequeno, o período é pequeno, mas isso é apenas para o nosso propósito experimental em uma situação real, provavelmente você pode olhar para outros provedores como o Google e assim por diante. E se a sua infraestrutura é robusta o suficiente, você pode usar
seus valores para informá-lo sobre como você pode colocar em limitação O que é que eu deixo esses valores de exemplo, portanto, não. E o que queremos fazer é fazer o check-in para sabermos que só vamos para obter mudanças. E depois colocamos a nossa mensagem. E essa é a minha mensagem. Então, quando eu fizer esse check-in, vá em frente e se comprometa e afunde. Então, tudo o que é feito aqui. E lembre-se que nos exemplos eu teria feito isso em um lugar e incentivá-lo a experimentá-lo em outro lugar. Mas então você sempre pode verificar o código-fonte e verificar novamente e comparar notas. E quando tudo isso estiver feito, estamos prontos para passar para o próximo tópico.
43. Mudanças de arquitetura - visão de seção: Ei pessoal, bem-vindos de volta. Fizemos um pouco para desenvolver a nossa AICPA até este ponto. E sim, temos um produto de trabalho TSV tem um monte de recursos que
nos ajudam a trazer experiências de valor agregado quando as pessoas interagem com nossa API. Lote nesta seção, queremos discutir certas decisões arquitetônicas que provavelmente precisamos tomar. Como você pode ver o que temos trabalhado e quer suas obras. É um bom software em termos de você anunciado este conjunto de recursos e ele entrega esses conjuntos de recursos. No entanto, ele fica um pouco mais complicado no longo prazo onde você tem que manter em novo queria tipo manter certas coisas separadas. Quando este projeto meninas retinol roda e eles têm o que tabelas de
ferramentas e alguns repositórios sobre as unidades fora do trabalho e isso é bom. Mas, à medida que o projeto pode se expandir, porque esta é a única fase, medida que isso cresce, precisamos de mais dados para serem armazenados. Temos que fazer mais coisas. O projeto vai ficar inchado. Então agora o que estamos praticando é o que é chamado de tudo em uma arquitetura. Onde quando brigamos com um projeto no Visual Studio, como você vê, temos tudo o que precisamos para realmente sobre o aplicativo de trabalho tudo em um único projeto. Mas então um monte de pessoas provavelmente olharia para este descongelado e diria, bem, você sabe, tudo é 1 proteus e, portanto, não perca a prática. E isso é verdade. Existem razões filosóficas, ou pelo menos razões tangíveis e práticas que você gostaria de manter certas coisas separadas. E então isso está trazendo a melhor prática que atende pelo nome separação de preocupações. Então, sim, nós temos pastas em agir separação de preocupações até certo ponto, mas eu acho que ele pode ser refinado um pouco mais. Então, o que vamos fazer nesta seção é rasgar antigos alguns dos elementos-chave
da API principal,
um projeto, e criar projetos onde eles digitalizarão ao vivo por si mesmos. Assim, a API será apenas coisas relacionadas à API, e ele vai apenas fazer referência a outros projetos que têm como coisas
relacionadas a dados são coisas relacionadas à lógica de negócios. Certo, então é isso que vamos fazer por esta seção. Então fique por aí e nos divertiremos enquanto avançamos.
44. Configurar modelos de dados: Tudo bem, então nossa primeira mudança de projeto será para os modelos de dados não são, então vamos criar um novo projeto. Nesta solução. Não queremos fazer isso. Nós somos realmente a solução ir para Adicionar. E queremos um novo projeto. E este projeto é simplesmente vai ser uma biblioteca de classe se você tê-lo para o lado, tudo bem. Caso contrário, você sempre pode procurar nossa biblioteca de turmas. E assim que o encontrares, queremos uma biblioteca da classe C-Sharp. Então nós selecionamos isso e eu vou chamar este um hotel listando dados de pontos. Tudo bem, então nós estávamos deixando óbvio que este é o projeto de dados, CMV em, em, na construção de todos esses projetos maiores estão tendo vários projetos. Você provavelmente gostaria que a camada de aplicativo tivesse pontos, MVC ou UI ou API. Mas isso não é absolutamente necessário e nós
já seguimos o caminho para motivá-lo. Então, isso é bom. Você só queria ter certeza de que representamos que este novo projeto é dado
ponto representando que é para nossos elementos de dados e ativos. Então, com isso feito, podemos acertar Next e queremos mantê-lo no Dotnet 5. Tudo bem, então poderíamos ter usado em seu padrão, poderíamos ter usado qualquer um desses, mas então tudo é dotnet cinco. Então, queremos ter certeza de que ficamos na Dotnet 5. Alternativamente, poderíamos ter usado padrão lá como uma ponte entre as diferentes versões dotnet Core. Framework Dotnet também, o que dotnet cinco funciona perfeitamente nesta situação. Então, basta clicar em Criar. E uma vez que temos a biblioteca da turma, nós temos isso com arquivo de classe lá dentro. Agora, esta atividade vai exigir um pouco de refatoração, que é uma das razões pelas quais as pessoas tendem a fazer isso desde o primeiro dia para evitar o processo de refatoração e tudo o que tem que acontecer com relação a isso. Então você verá agora que nós temos um novo namespace, que significa que, bem, qualquer coisa que está na pasta de dados é seguro porque ele já vai ter esses dados de ponto de namespace apenas porque é o hotel ouvindo e a pasta de dados. Agora tem um novo projeto que vai ter o mesmo namespace, tudo bem. Então, na verdade, eu posso pegar todos esses arquivos. E eu vou pegar, não copiar, mas pego e clicar no meu novo projeto e eu vou colar. Então nessa peça de cotinina está acabada e eu vou deletar essa classe de nazistas, eu não preciso dela, certo? Quando isso for feito, você verá que todas as referências ainda estão lá, mas então nós estamos recebendo algumas linhas vermelhas porque com o usuário API não
há nenhuma referência de biblioteca que vamos saber o que o usuário de identidade é. Então isso é outra coisa. Quando estamos dividindo em vários projetos, temos que ter certeza de que representamos os diferentes elementos são bibliotecas ou outros que cada componente pode ser dependente. Então, francamente, este novo projeto é alheio a qualquer coisa que existia no antigo e tudo bem. Então, se eu saltar para os contextos de banco de dados e dar-lhe alguns segundos, você vê que ele está começando a acender com todos os erros das bibliotecas ausentes. Agora, maneira fácil de contornar esses pontos de controle. E então eu posso ir em frente e instalar o pacote perdido. Então eu precisaria tanto necessidade de carga real. Preciso de uma entidade para Entity Framework Core. Saiba que eu tenho a versão local, que no meu caso é 5.02. Você pode ter uma versão diferente. Eu também posso encontrar e instalar, mas eu vou apenas ficar com a versão local. E lá vamos nós. Todos esses erros não estão resolvidos. Mas então eu ainda tenho esse problema aqui com o buraco para ouvir, configurações de
ponto, não entidades. Agora essas configurações existem aqui nesta pasta, e estas são realmente configurações de entidade. E eu tinha incluído o inicializador do mapeador nessa configuração. Então o que eu vou fazer é cortar a pasta de entidades
da pasta de configurações e, em seguida, ir para o projeto de dados. Clique em Adicionar. Vou adicionar uma nova pasta de configurações. E a coisa é que usamos esses arquivos de configuração apenas para semear. O que a realidade é que essas configurações podem ser usadas para qualquer coisa que você queira ser exclusivo sobre essa entidade quando ela está sendo criada. Bem, se eu aprofundar isso,
no meu curso Entity Framework, mas vou mantê-lo leve o suficiente para este. E nesta pasta de configurações, eu só vou colar entidades pasta que acabamos de pegar. Então agora todas as nossas configurações de entidade estão sentadas onde as entidades estão ou os modelos estão. Só precisamos que eles saibam seu novo namespace, que é listagem de hotéis, dados de
pontos, configurações de pontos, as entidades dos EUA. Então, só temos alguns. Eu só vou fazer essa atualização manualmente. Em um caso em que você tem mais, você provavelmente quer fazer como o nosso controle, encontrá-los e atualizá-los mais rapidamente. Mas como você pode
ver, está acontecendo perfeitamente nesse ponto. E, em seguida, na nota de contexto do banco de dados para resolver esta declaração usando, eu apenas deixá-lo saber que eu estou usando hotel é em entidades de configurações de dados
ponto e lá vamos nós, esses erros agora foram embora. Então, neste ponto, eu tenho mais algumas áreas que eu vou apenas clicar através para ver o que mais está reclamando à medida que avançamos. Então, os usuários da EPA não. E um bom atalho de teclado quando você quer limpar esses arquivos, você tem todos esses desnecessários usando instruções. Você pode apenas fazer a tecla Control e E como um ovo. E você vê que ele tipo de limpa os arquivos e remove desnecessários usando instruções. Tudo bem, então deixe-me clicar e ver o que mais é completa referências faltantes. Tudo bem, então não, no meu projeto API, ele está reclamando que ele não pode encontrar namespace de dados ponto e ele não pode encontrar o contexto do banco de dados, é claro. Então eu posso remover esta pasta de dados. Já não, já não é uma irrelevância. - Tudo bem. O que você sabe todo o projeto para esses arquivos de dados. Então eu posso deixar o AICPA enobrecer o novo projeto indo para dependências,
adicionando projeto para referência, e, em seguida, clicando em dados de ponto de lista de hotéis. Quando eu clicar em Ok
e, em seguida, fazer uma compilação. Você vai ver que eu tenho uma compilação bem sucedida com ambos os projetos que têm sucesso na compilação, eu não tenho mais erros. E você vê que foi um procedimento agradável, simples o suficiente. É sempre bom fazer isso, como eu disse, esses tipos de atividades de refatoração quando o projeto é jovem. Mas eu vou dizer que não é que você deve sempre fazer isso. Às vezes, seu contexto determina o que você precisa fazer. Então, para um projeto de API muito pequeno, ele provavelmente não precisaria sair em 34 projetos diferentes só porque você quer que seus modelos sejam separados. Mas então quando você vê que este orçamento pode crescer e florescer em algo mais do que você queria essa consideração no início do Velho.
45. Configurar o projeto principal de aplicativos: Certo, separamos com sucesso nossos ativos
relacionados a dados dos projetos de aplicativos, e isso é bom até agora. Tudo bem, agora vamos passar para a próxima fase da nossa pequena operação e não quero fazer é meio que configurar o núcleo do nosso aplicativo. Isso manteria talvez como uma lógica de negócios e qualquer configuração específica de aplicativo. Ele, ele pode ter muitos nomes diferentes. Então o nome que estou te dando é mais como um Nim sugerido. Isso sugere o que a camada é um barco ou o projeto é um barco. Mas eu não estou necessariamente dizendo que isso é o que deve ser chamado o tempo todo. Assim, você pode ver outras pessoas com projetos de nome semelhante com vários ativos e arquivos de
configuração sendo armazenados lá, bem
como talvez lógica de negócios e os detalhes e todas essas coisas. Então vamos começar com essa. Então eu vou apenas clicar com o botão direito na solução mais uma vez. E nós vamos adicionar outro projeto que vai
ser de natureza semelhante, uma biblioteca de classes. E vai ser chamado de pontos de lista de hotéis. Podemos chamar-lhe aplicação. O núcleo chamaria de núcleo. Eu só vou trabalhar com núcleo onde eu apenas chamá-lo Total listagem ponto core. Clique em Avançar. E este também vai ser um projeto dotnet 5. E isso cria, agora como de costume, começamos com o arquivo padrão classe um, que podemos simplesmente ir em frente e excluir. Agora, em configuração para o núcleo, vou começar tirando todos os detalhes. Então, todos os detalhes que estão atualmente no projeto de listagem de hotéis, eu vou colocá-los dentro do projeto principal. Então eu vou criar uma pasta onde meus detalhes viverão de nada. Tudo bem? E eu vou cortar todas essas aveia e colocá-las lá dentro. Então, na verdade, não vou cortar todos eles. E eu vou te mostrar o porquê. Estes são detalhes e estes são literalmente modelos. Então qualquer coisa que seja um detalhe que significa que se parece a classe de dados e nós tivemos um número deles por diferentes razões. Eu vou realmente mantê-los estão arrependidos, Eu vou tomar aqueles especificamente. Então eu não estou tomando erro, eu não estou tomando solicitações param porque eles eram tipo de específico para o nível de API, não o não que o nível BTO, certo? Então eu vou cortá-los e, em seguida, colá-los dentro da pasta de detalhes. Claro, eu saí para corrigir algumas referências aqui,
então não, meu namespace aqui é listagem de hotéis. Pontos. Não é pontos, núcleo, desculpe, pontos. Detalhes. Não há mais modelos. Então esse é o nosso novo namespace para detalhes. Então, não ia usar esse novo namespace em todos eles. Para que todos saibam onde moram. Tudo bem? E todos devem ser capazes de ver todos sabem que eles estão todos no mesmo namespace. Todas essas áreas devem desaparecer entre os arquivos. E você notará que quando eu copiar e colar, certas coisas são adicionadas muito rapidamente. Portanto, habilitei um recurso no Visual Studio. Se você for para Ferramentas, Opções,
em seguida, editor de texto, C-sharp avançado, você verá uma opção aqui que diz Adicionar faltando usando diretivas em p. Então, quando você está recortando e
copiando BCR e colando código em si será realmente apenas tentar e colocar em todas as instruções de uso que podem estar faltando, certo? Então isso poderia acelerar o processo de movimentação de código no futuro. Então, agora que mudamos todos os nossos detalhes, se eu fizer uma compilação, eu sei que vou estar em um monte de erros porque qualquer coisa que dependesse dos detalhes não vai mais em nenhum lugar detalhes estão e tudo bem. Isso é parte do outro fator. Eu também quero mover minha pasta de serviços, então eu vou apenas copiar isso e colá-lo no núcleo do aplicativo, certo? E, mais uma vez, temos de actualizar este espaço de nomes. Então este não é nenhum hotel listando ponto core, ponto serviços. Seria a mesma coisa para sua interface. Então, podemos apenas atender essa atualização rapidamente. Agora, você vê todas essas ervas porque não sabe onde cercar todas
essas opções relacionadas à identidade nessas configurações de extensão. E algumas dessas bibliotecas simplesmente não estão neste projeto. Este momento. Bem, antes de eu começar a adicionar, adicionar, adicionar as referências do projeto, eu só quero mover todos os arquivos-chave primeiro. Então o próximo é um seria o material do repositório. Então eu repositório e repositório. Podemos cortá-los. E baseado aqui. E você sabe, neste ponto algumas pessoas realmente apenas mesclar essas pastas são provavelmente apenas ter uma pasta que diz repositório e, em seguida, lá tem ambas as interfaces e os contratos e as implementações. Você não precisa necessariamente fazer isso, depende de você. Mas fui manter a estrutura da pasta. E isso agora vai viver ponto núcleo I repositório. E o que vou fazer é copiar o hotel,
o núcleo 100, por favor. Todas estas referências através e através de nossos projetos com o novo namespace. Então, no final deste processo, todos sabem que têm uma nova casa. Mas, mais uma vez, algumas das referências do Predito ainda estão adiando para uma caminhada. Isso é bom. Chegaremos lá eventualmente. Tudo bem. Então, uma outra coisa que eu vou
querer mover é este arquivo de extensões de serviço dot CSS. Então, no arquivo de inicialização, tínhamos todas essas extensões de serviço, assim por diante. Como neste momento, todos eles vivem dentro do projeto AICPA. Mas eu não os quero necessariamente dentro dos produtos API. Então eu vou pegar essas extensões de serviço 0 e eu vou colocá-lo dentro do núcleo. E mais uma vez, eu vou deixar ele saber que ele é dito para listar ponto. Tudo bem? Agora o que você vai ver com esse tipo de movimento é que todas essas referências a todas essas bibliotecas não
estarão mais especificamente no projeto API. Eles saberão ao vivo dentro do projeto principal. E, em seguida, a API Bridget apenas fará uma referência ao projeto principal. Então, quando estamos adicionando bibliotecas de terceiros, talvez mais tarde eu queira adicionar um sistema de e-mail. Todas essas coisas, nós apenas continuaríamos adicionando ao núcleo
porque o núcleo vai ser liderado imediatamente entre a API e a funcionalidade real que interage com aplicativos de terceiros, certo? Então é por isso que eles são repositórios aqui porque é interage com o banco de dados ou serviços, é aqui diretamente com a API ou o serviço de identidade. Em vez disso, o detalhe está lá porque ele interage com as pessoas de terceiros são. Então, qualquer coisa que seja relacionado a terceiros tipo de entrar dentro da área central. E se no banco de dados relacionado vai dentro do projeto de dados. E então qualquer coisa que é o aplicativo em si estava em nosso projeto API. Agora, basta notar que ainda temos este controlador legal e o modelo. Então, na verdade, eu vou deletar esses dois porque nós realmente não precisamos deles. Mas havia boas para fins informativos inicialmente, pelo menos, certo? Então eu acho que nossos projetos estão parecendo bons além das setas, obviamente, mas é assim que nossa solução está começando a se parecer. E se você olhar aqui, parece muito mais compacto. É muito mais fácil ver exatamente o que você precisa quando você precisa. Se você não estiver fazendo nada lá, você sempre pode ir para o núcleo e ir em frente e aplicar quaisquer modificações a qualquer um deles. E então você sempre pode apenas estender a lista de projetos em conformidade, desculpe, entidades de acordo com a leitura. Então vamos adicionar algumas das dependências que estão faltando no projeto API. Vou adicionar a referência do projeto ao projeto principal. E no projeto principal e quando adicionar a referência ausente ao projeto de dados. Agora, com essa referência do projeto sendo feita, se voltarmos para qualquer um de nossos controladores ou qualquer coisa, eu não quero que alguém para começar é uma limpeza. Eu só vou fazer a tecla Control, desculpe, me
livrar de todos os ausentes não-utilizados usando declarações. E então eu posso usar meu ponto de controle para incluir as novas referências, certo? Então, para todas essas linhas estreitas, eu posso apenas fazer Controle ponto-ponto as instruções usando. E para manter isso simples para esta atividade particular, o que eu quero fazer é apenas ter certeza de que eu qualquer coisa que possa ser resolvido com um controle. É isso que quero focar nela. Então, se eu for para a tecla Control, me
livrar do em declarações dos EUA e, em seguida, Controle pontos para adicionar os que faltam. E quando eu ver que não tenho mais erros, siga em frente. Se eu ainda amo o ícone do Arizona, resolvê-lo usando as sugestões do Visual Studio, então eu vou deixá-lo sozinho. Certo, então vou deixar isso em paz, certo? Não. O que acontece é que você vai estar vendo setas porque certas bibliotecas estão faltando. Nós vamos cuidar das bibliotecas desaparecidas na próxima. Então eu só queria manter esse tipo de apertado e focado em colocar esses projetos em. A referência do projeto está ativa e em execução. Tudo bem, então vá em frente e inclua os desaparecidos usando declarações. E uma vez que tudo isso é feito, eu acho que a maioria de nossos erros que seria elevador será dentro de nossos projetos principais e valor mais específico em vez
das extensões de serviço dentro do repositório também. Certo, então quando
voltarmos, faremos uma limpeza final e então faremos um teste para ter
certeza de que tudo ainda está funcionando como esperado.
46. Limpe e teste: Certo, pessoal, agora precisamos limpar todos
os erros que deixamos da nossa atividade anterior. O que eu tenho aberto agora é o aplicativo de listagem de hotéis. Desculpe, o hotel listando arquivos do projeto. Tudo o que você precisa fazer é clicar no arquivo do projeto. Basta um clique e ele mostrará todos
os pacotes que estão sendo referenciados dentro desse arquivo. Nenhuma maneira simples o suficiente para obter esses projetos sobre o projeto principal é copiar o grupo de itens. Na verdade, eu vou fazer um corte porque estes são mais como bibliotecas de terceiros. Os únicos que provavelmente precisariam manter aqui seriam como o mapeador automático porque ainda temos a configuração automática aqui. E mesmo assim. Acho que podemos mudar isto. Pensando bem, então eu vou mover que eu sei que eu disse que era uma limpeza. Não, na verdade estou fazendo outros movimentos. Vou cortar as configurações e estar no tribunal mais uma vez. Coisas relacionadas a terceiros que você quer colocar nessa pasta lá. E eu não estou necessariamente dizendo que isso tem que ser isso é apenas três projetos diferentes, três camadas diferentes, por assim dizer. Algumas pessoas realmente teriam o núcleo diferente da lógica de negócios. Mas então este não é realmente o nosso modelo de negócios, porque tudo é genérico, e é assim que você precisa trabalhar dentro. Se você tivesse repositórios específicos que estavam fazendo operações específicas o tempo todo, então você provavelmente gostaria de ter outro projeto que está armazenando esse tipo de coisas, certo? Portanto, não é necessariamente que tenha que ser três projetos. Se você fizer o meu curso de Arquitetura Limpa, você verá que você pode acabar com cinco ou seis projetos diferentes. E o que chamamos apenas de arquitetura, mas não vamos entrar em tudo isso nesta atividade particular. Então não, que eu movi este laser inicial superior para cima. Precisamos, é claro, configurar nosso novo namespace. Eu só controlo a chave para limpar o ficheiro. E, claro, temos um monte de áreas, é por isso que estamos aqui. Então, neste projeto para a API, eu vou pegar toda
esta seção de grupo de itens e esta é uma maneira muito mais rápida de obter todas essas referências em outros projetos do que ir para o novo get e obter um por um como fizemos inicialmente, certo? Então eu vou colocá-los. E então vá até o núcleo e eu vou perfurá-los, então eu vou apenas colocá-los bem acima do grupo de itens que está lá, e então eu vou salvar isso e apenas construir. E depois da compilação, eu ainda tenho um monte de erros, mas o que está acontecendo é que ele está restaurando e registrando todas essas referências. Então, isso é bom. Podemos resolver todos esses problemas. Então, se eu voltar para o projeto da API, você vê, sim, temos um monte de erros neste é o começo de nós. Então, estamos no início desse arquivo de caso da nossa chave de controle de primeira ação do projeto API. E se você não gosta do atalho de teclado, você pode realmente apenas pressionar que é um pincel nele. Eu tinha apenas execuções que limpam para, você sabe, todas essas são manchetes se referem
às extensões de serviço que agora estão faltando no projeto de API. Então, se eu controlar isso e, em seguida, introduzir uma sugestão, ele adiciona a instrução de uso para o projeto principal. E olha para isso. A maioria vai embora. Agora este está dizendo que quer adicionar papel de outono, e não consegue encontrar o laser inicializar mapeador. Antes que eu resolva
isso, porque eles vão fazer algo especial. Com isso, deixe-me apenas ir em frente e adicionar o outro desaparecido usando referências para as unidades de trabalho e nosso gerente de olho fora. E com tudo isso feito, corrigimos a maioria, se não todos, dos erros. Ok? OK. Isso ocorre porque ainda há erros no destino para a correção. Então, isso é bom. Vamos nos concentrar no mapeador automático. Não, o que eu posso fazer é criar um método de extensão que se registra automaticamente porque o laser de inicialização não está mais em nossos projetos de API, então não precisamos nos preocupar com isso. O que vamos fazer é reescrever esse pedaço de código e você verá o porquê em alguns. Para não, vamos em frente e adicionar os ausentes usando instruções para as outras duas linhas. E esse erro está lá, provavelmente porque ainda há mistérios não resolvidos com os arquivos sendo referenciados. Então, isso é bom. Então vamos nos concentrar na parte superior do outono. Então o que eu vou fazer é adicionar um método de extensão de serviço que irá configurar o outono superior direito. Então nós já temos alguns escritos. Eu só vou pegar um e tipo de duplicá-lo, e este vai ver configurar mapeador automático. E dentro disso, vamos ver algo como serviços que adicionam parte superior de
outono e montagem que obtêm montagem. Portanto, há situações em que você pode ter várias configurações de mapeamento. E não me entenda mal, poderíamos ter usado o mesmo tipo de mapa ou inicializado nosso código vindo do nosso arquivo Start-Up, eu poderia ter reutilizado essa sintaxe exata. Certo. Isso funcionaria. Tudo bem, porque desde que ele saiba onde está o laser de inicialização superior, tudo bem com isso, como você pode ver. Mas como eu estava explicando, há momentos em que você pode ter vários risers iniciais superiores, talvez ter endpoints diferentes ou você tem tantos detalhes e entidades que você pode
acabar tendo diferentes risers iniciais com diferentes configurações para diferentes situações, o que quer que possa acabar sendo se o sistema crescer para esse tamanho, você pode usar esta expressão geral onde as reflexões vão realmente sair e encontrar qualquer arquivo que corresponde ao que Autumn Upper está procurando, que seria o meu inicializar superior ou herdar do outono superior direito. Então qualquer uma dessas linhas funcionaria perfeitamente aqui. Mas o que quero dizer é que temos que movê-lo para fora e colocá-lo aqui, porque é onde a parte superior inicializa em nossas vidas. Então, no início que o arquivo CSV, agora
posso ver configurar. Superior de Outono. E isso seria um caso encerrado. Tudo bem. Então eu acho que eu estou indo para ir em frente com a abordagem mais genérica onde nós apenas dizer começar executando montagem e ad outono up em conformidade. Tudo bem. Então eu apenas rolou um pouco para cima e eu estou vendo o manipulador de exceção e esse modelo de erro, nós não movê-lo. Então, sim, eu tomei a decisão de não mover porque eu pensei que teria sido melhor na API. Claramente, é necessário no curso, então isso não é problema. Vou pegar esse objeto de erro e podemos. Eu não quero colocar isso nos detalhes. Bem, não é um pouco. Então eu vou criar uma nova pasta chamada Model CSC que eu sou tipo de ser específico ou pelo menos o melhor que eu posso ser com onde eu colocar o que. Porque no final do dia, a separação de preocupações faz com que seu projeto cresça. Mas isso ajuda você a ser mais direcionado com onde você está colocando o que é e o que você está nomeando seus arquivos e pastas, certo? Então aqui eu tenho o caso AirDots, e eu apenas deixá-lo saber que ele agora vive dentro da pasta Dot Core Dot Models, e isso deve cuidar do erro que estamos vendo nesse arquivo. Tudo bem. Mais uma vez, só
preciso fazer a minha limpeza. Tecla de controle. Livrar-se de qualquer coisa que não está sendo usado e não são necessários e pulando para o mais cedo. Vemos que estamos para baixo de mais de 50 setas para No. 40 mais. Isso é bom. Então vamos saltar para o mapeador e vemos aqui que ele está reclamando sobre o. Perfis, se eu controlar que estou usando Outono Superior, que cuida de uma coisa, se eu controlar isso e adicionar as instruções de uso ou os detalhes que cuida de outra coisa. E assim, todas as flechas desapareceram. E então essa lista é reduzida em cerca de 15. Então, agora, se saltarmos para o próximo arquivo problemático, eu uni trabalho duro. Não sabe onde está. Então podemos apenas ir em frente e adicionar que usando declaração e qualquer coisa que não conseguimos encontrar, nós apenas controlamos isso certo? Portanto, ele não pode encontrar o contexto do banco de dados. Isso é tudo. OK, aí está. Usando dados de listagem de hotéis. Sem problema. E isso deve cuidar de todos os outros arquivos que ele não pode encontrar. Tudo bem. E então nós temos algumas flechas, mas o controle que não vai resolver essas. Então isso significa que eu preciso resolver o que está nesses arquivos. Então você vê alguns desses, mesmo que haja muitos erros, muitos deles estão contidos em um arquivo. Então, corrigindo IE usando instruções ou algo onde se livrar dos erros muito rapidamente. Então vamos pular para os outros arquivos. Este é o gerente de autor só precisa usar declaração para isso e apenas uma chave de controle para limpar. Mais alguma coisa? Se eu pular para ISPManager, então você vai notar que estes são os marcadores azuis aqui nas margens. Então, aqueles me permitem saltar para os arquivos que estão sendo herdados ou que eu arquivo está herdando da direita. Então eu sempre posso dizer, OK, quais arquivos herdam do ISPManager? E nunca vai me levar lá. Então, para habilitar essa? E eu mostrei isso às pessoas, e não funcionou para alguns. Funcionou para alguns. Mas você pode simplesmente voltar para o editor de texto opções C-sharp Advance, e no final você verá margem de herança, que é experimental. Então, se não funcionar, não me processe, por favor. Mas de um modo geral, ele deve funcionar como você vê que ele está sendo usado para mim aqui para que eu possa simplesmente saltar para ispmanager e corrigir isso usando declaração e controle Katie para se livrar dos erros e os desnecessários. Tudo bem. E se eu voltar para a lista, isso cuida de alguns se eu pular aqui. Chave de controle aqui. Então solicitar armas de fogo é realmente necessário pelo repositório também. Então isso significa que neste momento, eu não tenho nenhum uso para a pasta modelos. Então eu vou tomar pedidos params colocados dentro de modelos em nosso projeto principal deixá-lo, nem sua nova casa, que é Dot Core Dot modelos. Tudo bem. E eu vou apenas remover esta pasta
não desnecessária do nosso projeto. Tudo bem. Então, onde foi esse erro? Então, estamos corrigindo esse erro. Deixe-me pular de volta e acho que estamos no repositório genérico. Mas enquanto estou aqui, deixe-me controlá-lo. Você se livrar de alguns erros e, em seguida, eu posso usar o que eu posso usar margem de
herança porque há um erro no repositório genérico. Então, quando eu saltar para um repositório genérico, eu posso corrigir isso usando instrução para armas de fogo de busca. E uma vez que isso é corrigido, então eu deveria ser capaz de voltar para o repositório genérico e ver um arquivo livre de erros. Se não, deixe-me apenas controlar isso na instrução de uso. E isso é bom. E depois da declaração de uso para armas de fogo do Oeste. Isso é bom, então eu quero dizer, você pode não estar passando pelos mesmos erros na mesma ordem que eu estou só porque eu acabei de me levantar comigo mesmo, eu percebo que eu posso estar indo um pouco rápido, mas eu espero que você apreciando o processo de pensamento por trás da reflexão sobre o que precisa ser corrigido ao longo do caminho. Tudo bem. Então você sempre pode continuar correndo no mínimo. E como você está, você usando instruções como seus namespaces de correção, você notará que no início apenas reduz nossas reduções e reduções. Então aqui estou eu para baixo para seis erros. Começamos com 50 mais eu estou diminuindo para seis. Então, basta adicionar a instrução de uso para esse modelo de erro que nos reduz a cinco e, em seguida, controlá-lo para limpar este arquivo e, em seguida, adicionar o uso para armas de fogo quest. E estamos quase lá, quase livres de casa. Lá vamos nós. E apenas a tecla de controle. Vendo aquele lá em cima e lá vamos nós, livre de erros, deixe-me fazer uma compilação. E voilá! Então agora nós construímos projetos construídos com sucesso. Tudo bem. Então vamos dar uma volta, porque sim, isso parece bom. Nosso projeto de API é agora muito mais fino do que era quando começamos. Mas ainda funciona? Então vamos dar uma volta. Tudo bem. Então está iniciando, e isso é um bom sinal. Tudo bem. Então vamos tentar algo simples o suficiente. Vou tentar fazer o nosso registo direito. Então experimentá-lo e eu vou registrar como usuário il1r2 exemplo tornar-se minha senha é uma senha bastante complicada como sabemos e nós testamos, e eu quero que o usuário regra. Tudo o resto, eu saio e clique em Executar, e então eu estou recebendo uma resposta total, o que sugere que foi bem sucedido. Então isso significa que tudo o que configuramos ainda está funcionando corretamente. Tudo o que fizemos foi mover os arquivos, tornar nosso projeto um pouco mais limpo e um pouco mais fácil de manter e até testar. Então eu não vou falar muito sobre testes de unidade, mas uma das principais razões pelas quais as pessoas tendem a separar seus arquivos que é aumentar a estabilidade do código um e torná-lo um pouco mais modular. Portanto, é mais fácil testar e ver o que está sendo testado se você quiser mais em testes de unidade. Eu tenho um curso de teste conduzido velocidade de desenvolvimento nele núcleo que você pode fazer para ver todo o teste de unidade funciona em uma situação semelhante a esta. Então, com tudo isso feito na próxima lição, vamos apenas rever todas as mudanças que fizemos, o processo de pensamento por trás dessas mudanças. E se for realmente necessário ou não.
47. Revisão e benefícios: Muito bem, pessoal, bem-vindos de volta. Nesta lição, vamos apenas revisar todas
as alterações que fizemos em nosso projeto de API. Então, mais uma vez, o que começamos é geralmente referido como uma arquitetura tudo em um porque em um projeto, nós tínhamos conectividade de banco de dados, tínhamos lógica de negócios, tínhamos tudo, certo, chamado as configurações, referências de terceiros, etc. Agora, como vimos, testamos e provamos, tudo funciona como esperado. Então, o que fizemos aqui não é necessariamente melhorar a funcionalidade. Porque tínhamos funcionalidade. O que fizemos foi melhorar talvez a legibilidade, a manutenção e apenas o layout geral do projeto. Para que, a longo prazo, saibamos onde precisamos ir para encontrar o porquê. Há muitos aspectos que você pode adicionar a um projeto de API em termos de apenas a arquitetura fora do projeto. E eu passar por um monte daqueles no meu curso de
arquitetura sólida com entidade e arquitetura encharcada no ASP.net Core. Então você pode verificar esse curso se você quiser ver o
quanto você pensou que o processo começa realmente ir para a construção fora. E arquitetura de APIs. Eu mencionei testes. Testar é um pouco mais possível quando você meio que tomar essa abordagem e separar tudo. Então você pode verificar o meu curso sobre testes de unidade também. Mas o meu ponto é que neste ponto nós mudamos o layout dos arquivos, mas nós não tiramos de são adicionados à funcionalidade geral. Assim, a funcionalidade pode ser realizada através de tudo em uma arquitetura, como vemos em bullet. Fizemos isso para aumentar a capacidade de manutenção e legibilidade de nossos arquivos. Então vamos rever tudo o que fizemos do início ao fim. A primeira coisa que fizemos foi criar este projeto de dados. E nestes projetos de dados colocamos em todas as nossas configurações para diferentes entidades, bem como para todas as entidades, bem como para o contexto. Poderíamos ter separado ainda mais estes unmade uma pasta apenas para as entidades. A maneira como você o coloca é baseada em contextos aéreos. Espero que você o ache mais legível para você. Ou projeto de ano inteiro. Colegas de equipe são líderes, vamos achar que é mais ilegível. Todo mundo tem padrões diferentes. Não estou tentando ser prescritivo com minhas sugestões, certo? Então, separando os objetos de dados da própria API, retiramos todas as preocupações de ambos os ativos relacionados ao banco de dados da API, do próprio aplicativo, certo? E, em seguida, para que ele ainda saiba para onde ir e procurar os objetos relacionados com dados. Nós simplesmente colocar em uma referência de projeto para o projeto de dados. Tudo bem, junto com isso veio qualquer outra referência de terceiros, como o núcleo de identidade e assim por diante. Então, sempre que você está colocando em algo que foi, a qualquer momento você está colocando em algo que tem uma referência de terceiros, é claro, o projeto em si precisa saber o que essas referências de terceiros são. A segunda coisa que fizemos foi criar a obrigação
no núcleo e todo o pensamento geral por trás do núcleo é que ele precisa interagir com qualquer coisa que seja seu terceiro partido. Então, uma vez que você tem algo que é de terceiros ou precisa mediar com uma biblioteca de terceiros, nosso sistema, você pode pensar em colocá-lo no núcleo. Então, em contextos, temos o inicializador mapeador, que é para ópera de outono. É uma biblioteca de terceiros. Esse é o acordo. A terceira parte é que usaremos isso para transferir dados. Temos os repositórios, estes interagem com a camada de dados sóleo. Eles estão interagindo com o banco de dados, que é de terceiros. Nós colocamos isso lá. Isso também pode dobrar como lógica de negócios, certo? Se estamos usando repositórios personalizados ao longo do caminho, temos modelos aqui porque certas operações exigem esses modelos. E então temos os serviços que interagem com a identidade nesta situação. Então eu também coloquei essas extensões de serviço no projeto principal porque aqui é onde estamos registrando todas as bibliotecas de terceiros às quais
não queremos atender referências diretas em nossa API. Então deixe-me diretor de TI, por exemplo, para eles no projeto principal. E então configuramos nossos métodos para que possamos fazer o registro. Isso é bom. E então colocamos tudo isso no núcleo nulo para a API com base na forma como a criamos. Então, com base na forma como foi construído, algumas pessoas realmente teriam que a API e nunca vê a própria camada de dados, certo? Mas por causa de tudo que construímos nossos controladores e usamos a unidade de trabalho, é meio difícil fazer isso porque temos que fazer dela um amigo, Derek, ou por exemplo, algumas das entidades. Então, quando você fala sobre controladores finos, que também Louis jogou no meu curso de arquitetura limpa, eu não estou tentando marcar que há algo como eu estou apenas fazendo você saber, que você pode ir lá e vê-lo. Mas falamos de controladores finos onde estamos fazendo muito menos. Mas isso é melhor entendido quando você tem uma base que se parece mais com isso. Então você entende por que você tomaria certas decisões. Então é bom fazer este curso e depois fazer aquele. Assim, você pode obter esse tipo de trajetória ascendente em termos de pensar e entender como as APIs são desenvolvidas. Mas o meu ponto é que temos que fazer referência ao projeto de dados e ao projeto central
a partir da API, a fim de facilitar as referências que são necessárias para nossa unidade de onde para nossas entidades. E em nossa startup dot cs, todos os nossos serviços de registro personalizado que estão sendo imaginados. Tudo bem, então todas essas coisinhas desempenham um papel enorme em toda essa união. E basicamente isso é tudo o que vamos fazer
para refatorar esta API de listagem de hotéis. Mais uma vez, pegamos um projeto, dividimos em três, temos mais arquivos, provavelmente temos mais pastas, mas adivinha? A longo prazo, será muito mais legível e mais fácil de mantê-lo. Agora, antes de verificarmos isso, há mais um ajuste que precisa ser feito. E enquanto te dava aquele monólogo, Justin, eu reparei. Então temos essa pasta Migrações que me incluiu. Eu não sei por que eu negligenciei tanto isso, mas essa pasta Migrações não deveria estar aqui. Deve estar em nosso projeto de dados porque representa todas as migrações de banco de dados, certo? Então eu vou citá-lo e eu vou colá-lo dentro dos dados. E apenas para fins de consistência, eu vou me certificar de que cada um deles tem o ponto nele. Namespace, certo? Então nós podemos, há um pouco através de abrir cada um e dar-lhe dados de ponto. Assim como para o snapshot, você deseja fornecer dados a ele. E enquanto ainda estamos em snaps, eu veria que nós temos este airable para usar colunas de identidade. Então eu acho que essa é a nossa referência ou com nossos dedos do projeto, nós estamos apenas incluindo o ASP NET Core Entity Framework Core. Mas se não estou enganado, também
precisamos do SQL Server. Portanto, lembre-se de que tiramos todo esse grupo de itens do nosso projeto de API. Então eu definitivamente preciso desta biblioteca. Eu vou apenas copiar é porque eu não tenho certeza, Dependendo dele, Mas eu vou copiá-lo e colá-lo no projeto de dados. E quando eu voltar aqui depois que ele faz suas pequenas verificações e balanços, ou se eu forçar uma construção, esse erro deve desaparecer. E eu deveria saber que tenho projetos livres de erros, ok, eu ainda tenho alguns erros. E esses erros estão aparecendo
nos arquivos gerados automaticamente que correspondem ao com as migrações. Então deixe-me ver se dar a eles o namespace resolveria o erro e isso faz de lá. Então, neste momento, porque estamos apenas recapitulando em desembrulhar aberto aqui dando outra atividade. Mas eu vou apenas apontar suas opções neste momento. Você pode gostar, oh, nós só temos talvez quatro ou cinco arquivos de migração que você pode passar e fazer tudo isso e atualizar os namespaces. Você também pode simplesmente remover as migrações porque as migrações são realmente apenas o histórico das alterações do banco de dados. Mas, em seguida, se o banco de dados estiver onde você deseja que ele esteja, a próxima migração em que você estiver. Se tudo é desprovido de migrações, teria a versão mais recente do banco de dados. Agora, isto está tudo em desenvolvimento. Eu não estou necessariamente dizendo que é por isso que você deve fazer, mas mais uma vez, contexto é tudo onde desenvolver algo aqui, entregamos Seul, nos
permite executar um experimento e eu vou fazer tudo aqui nem o Fuller. Não, não estou encobrindo nada. Quero que vejamos exatamente como isso funcionaria do zero, certo? Então uma vez que eu fiz foi mover sobre a pasta Migrações porque a migração não deveria estar na APA, tudo bem. Mas se eu fizer migrações e clicar em Excluir, excluir, remover essa pasta Migrações
e, em seguida, acessar o console do Gerenciador de Pacotes. Não, eu não posso fazer nenhuma migração aqui porque eu preciso das ferramentas. Então deixe-me ir lá. Então, só estou mostrando tudo o que precisamos. Precisamos de ferramentas que precisamos do projeto. Há outra biblioteca que eu preciso? Acho que não, certo? Não. E talvez eu precise do Entity Framework Core se eu ainda não o tiver. Então deixe-me cavar essas duas bibliotecas. Mas no projeto de dados. E eu vou pular de volta. E eu também vou pegar Entity Framework Core e colocar neste projeto. Então, quando eu estiver executando migrações nulas no pacote gerenciar contras, console do Gerenciador de Pacotes. Preciso ter certeza de que meu projeto padrão está definido para o projeto de dados porque é aí que o contexto vive, certo? Então, se eu disser adicionar migração de hífen neste momento, desculpe, nome, seria fresco. O meu acerto concorda. Tudo bem. E eu estou recebendo um erro porque eu ainda estou faltando o pacote de design. Isso é o que eu realmente queria. Tudo bem, então vamos apenas adicionar esses pacotes de design. Então isso, eu não quero usar NuGet e procurar o Microsoft dot Entity Framework Core Design. E lá vamos nós. Então isso vá em frente e instale-o. Agora você vê que a versão aqui é muito maior do que a versão que estou usando. Isso é bom. Eu vou soltá-lo para a versão em porque eu quero manter o meu projeto consistente. O que você se certifica de que você está usando a versão que você tem arte. Então instale. E uma vez que isso é feito, eu vou salvar dizer c saber que o design é adicionado, certo? Então eu queria voltar e está tudo bem porque estraguei os comandos de migração de anúncios. Então, nova migração, pressione Enter. Certo, então o erro está se repetindo. Oh, eu sinto muito. Portanto, este pacote também deve estar na inicialização. O projeto de inicialização é os projetos de API. Eu só vou pular lá em cima. E estou fazendo isso rápido. Então eu vou apenas criar um modo de grupo de itens, grupo TIM. E nesse grupo de itens, estou apenas colocando aquele design que acabei de tirar do projeto. Certo, então vamos tentar de novo. Então você vê, eu disse que vou fazer isso do zero para que você possa ver o processo, ver as setas, e saber o que esperar. Agora você vê, eu tenho uma migração bem-sucedida. E se olharmos através deste, se estivermos olhando para uma foto, vemos que só temos um arquivo de migração. Tudo bem, e ele vai para o namespace dos cartões, e o desejo gerado automaticamente vai para o namespace atual, tudo bem. Mas se
percorrermos, seríamos capazes de ver cada coisa que foi feita até este ponto. O R, Uma vez que eu deveria ver é que vamos dizer que você tinha um monte de coluna ADA, remover uma coluna, mudar a nossa coluna, Fazer isso, fazer isso para as tabelas ao longo do caminho, que é um padrão partes de desenvolvimento. Mas você acabou com 20 arquivos de migração. Então nós adicionamos para migração fuzzy poderia ter acabado com 20 porque tentativa e erro mudando aqui e ali. Então o ponto é que se você realmente remover todos os PFAS de migração e fazer uma nova migração, ele vai dar uma olhada em como os dados se parecem, saber qual é a estrutura do banco de dados. Não. E esse arquivo de migração que você obtém tem todas as alterações nesse ponto. Assim, você condensaria facilmente 50, 60 arquivos de migração em um arquivo de migração que apenas fornece a versão mais recente do banco de dados em um único objetivo. Então isso é provavelmente algo que você gostaria de considerar também no futuro. Claro, ter a migração em incrementos também ajuda a reverter, se necessário. Então você pode avaliar o que você precisa fazer. Tudo bem. Mas eu só queria demonstrar por que mudaríamos o arquivo de migração fora do projeto web e quais são as possíveis ramificações. Então, com tudo isso feito, eu acho que eu realmente terminei com esta lição neste momento. Nós refatoramos nosso projeto e sabemos que tudo está onde ele, nosso Tudo sabe como uma nova casa de acordo com o papel que ele desempenha em nossa aplicação.
48. Configurar o ambiente de hospedagem - IIS e SQL Server: Ei pessoal, bem-vindos de volta. Nesta lição, começaremos a configurar nosso ambiente para implantação local de nossa API. E observe, quando dizemos implantação local, isso pode ser facilmente suas máquinas pessoais. Então, na minha situação, vou colocá-la na minha máquina pessoal. Mas também pode ser em uma empresa mushy em nosso servidor algum lugar que esta API precisa servir em toda a rede. E poderia até ser. Então, a Internet é qualquer que seja a situação, ensinando, você, está mostrando
passos críticos para preparar esta máquina para que ela possa hospedar sua API. Então nossa jornada começa aqui onde temos que
baixar o.net favor untimed Lord of the SDK, que temos usado para desenvolvimento. Mas queremos ter certeza de que temos o tempo de execução e
podemos apenas obter esse pacote de hospedagem para Windows. Então, quando você faz isso, você inicia seu instalador. E então você vai em frente e passar por pontos de controle de segurança. E os que está feito, você pode fechar isso. E então sabemos que vamos passar para a configuração,
eu acho, ou serviços de informação da Internet. Então o que queremos fazer é, eu diria novamente, ir para o menu Iniciar e ver o recurso. E então você deseja clicar em desativar os recursos do Windows. Assim, aqueles que eles selecionaram, esta pequena caixa aparecerá e você deseja se
certificar de que você seleciona serviços de informações da Internet. Uma vez que você fizer isso, você vai conseguir aquele quadrado. Esse quadrado significa que não é tudo o que está marcado, o que é bom. Você não precisa de todos os recursos. Eu vou apenas mostrar-lhe os que eu tenho instalado atualmente e então ele pode apenas passar e certificar-se de que eles também estão marcados do seu lado. Então eu tenho o console de gerenciamento e, em seguida, eu tenho essas bibliotecas para recursos de desenvolvimento de aplicativos. Então você pode ter certeza de que você marcar isso fora. Talvez você não precise de todos eles, mas funciona para mim com estes, eu recomendo que você tenha certeza que você tem aqueles. E então, para os recursos HTTP, você pode ir em frente e fazer esses diagnósticos e saúde uma vez que eu, bem, essa seção é realmente opcional, mas eu recomendo que você obtenha a seção de log HTTP. Em seguida, recursos de desempenho, autenticação básica e os outros. Então, uma vez que você tem esses, você pode clicar em OK e, em seguida, pode demorar um pouco para instalar. Eu já os ajudei, então não preciso esperar que eles instalem, mas uma vez que eles terminaram a instalação, então você pode retomar este vídeo. Então, uma vez que você tenha certeza de que você tem, como esse processo está concluído, para ter certeza de
que você tem S, você pode simplesmente ir para o seu menu Iniciar
e digitar S, e então você vai vê-lo aparecer. E então, quando iniciar, você receberá esse console mostrando seu servidor e todos os sites que você tem atualmente listados abaixo. Para ter certeza de que ele está funcionando, você pode realmente simplesmente clicar em sites padrão e ir para Burroughs. E, em seguida, ele irá mostrar-lhe esta página que mostra que você está vendo agora o seu servidor. Agora, outra parte essencial da configuração do ambiente local será certificar-se de que o servidor de banco de dados está instalado e em execução. Então, quando falamos sobre o servidor de banco de dados, temos algumas opções em uma configuração corporativa, você provavelmente já tem ou você deve tê-lo. Você pode verificar com o administrador do sistema tudo o que você precisa fazer. Mas basta ir em frente e certificar-se de que você tem o SQL Server em um nível pessoal. Se você ainda não tem, você tem opções. Você tem desenvolvedor ou express. Então expressa muito livre. Não é necessário nenhum licenciamento. E o que então ele tem algumas limitações em um nível pessoal expressa bem. Desenvolvedor dá-lhe muito mais recursos e é realmente totalmente alimentado. Portanto, é um download muito maior e uma tarefa muito maior do que tê-lo instalado dá acesso a muitos outros recursos. Para essa implantação, você provavelmente pode se safar com o Express, mas talvez se você estiver pensando em longevidade, você provavelmente só quer que os desenvolvedores tenham tudo o que precisa para que você possa fazer o download disso. A instalação é bastante direta e, no final, você
será solicitado a instalar o estúdio de gerenciamento. E caso você tenha perdido essa etapa, você sempre pode apenas Google SMS, que é a abreviação de SQL Server Management Studio. E uma vez que você passar por isso, você sempre pode simplesmente não carregar o estúdio de gerenciamento através deste meio também, que também é uma instalação direta. Então, para iniciar o estúdio de gerenciamento, depois que ele é instalado e se conectar ao seu servidor de banco de dados, você pode ir em frente e clicar no ícone e você verá esta tela inicial de lançamento. E para se conectar ao servidor, você não precisa colocar um nome de servidor. Então eu tenho dois servidores em execução, alguns servidores em execução na minha máquina ou eu sei que eu tenho o SQL Express, então eu tenho uma instância do SQL Express, mas eu também tenho uma instância do desenvolvedor. Então, para chegar a expressão SQL contra dizer ponto barra invertida SQL Express, que realmente não significa host local também. Tudo bem, e se você foi com desenvolvedor, então você só precisa localhost. Então você não precisaria de qualquer outra coisa. Então eu vou usar desenvolvedor, digamos se eu disser localhost e ele vai se conectar, e eu acho que eu tenho alguns bancos de dados, não muitos. Então, podemos prosseguir agora antes de passar para a próxima etapa, eu só quero encorajar você a ter certeza de que você tem acesso de
administrador ou mesmo se você não tem acesso administrativo, se você estiver em uma configuração corporativa onde você está não em uma posição para ser o administrador, que você pelo menos tem acesso suficiente ou você está trabalhando com alguém que tem o acesso para realizar algumas das ações aqui. Então, muitos dos problemas que as pessoas e Colin são ao fazer esse tipo de implantações fora da biblioteca provavelmente faltando e não instalar algo. O próximo maior problema é geralmente permissões e autorizações de autor, certo? Então ele faz com que você esteja trabalhando com alguém que é o caso que tem permissões suficientes para ir ao redor e os possíveis bloqueios de estrada. E se você está no ar máquina pessoal apenas são uma máquina que é sua para gerenciar. Apenas certifique-se de que você tem direitos administrativos.
49. Aplicativo para publicação no IIS e SQL Server: Tudo bem caras, então depois de configurar o seu ambiente e certeza que você visitou que tudo funciona. Agora o que queremos fazer é realmente publicado o site para o nosso, Eu sei que antes de fazer isso, nós temos alguns passos que temos que completar. E uma alteração de código em particular que eu quero fazer é em relação à interface do usuário do swagger. Então, na página de inicialização onde temos app.use swagger UI, eu queria tipo de mudança segurar este ponto final é gerado. E a razão é que eu testemunhei que o quer
é publicar as regras de caminho tipo de cadeias. Então o que quero fazer é torná-lo mais parecido isso foram usados servidor UA ou semente, lambda Tolkien. O que, então, temos as chaves tornando-o um objeto. E nós estamos indo apenas para qualificar o caminho base do MIT para ver string dot é molar espaço em branco c ponto, raiz, prefixo. Tudo bem, e então vamos dizer ponto, ponto, ponto. Então o que acontece é que quando o prefixo raiz muda em relação a se ele está em desenvolvimento como está agora, r. Se for publicado,
o, o caminho precisa parecer um pouco diferente. Então nós estamos fazendo é apenas ver ou colocar um ponto, dois pontos, e então nós vamos apenas prepender isso para o nosso caminho existente, que estava lá antes, e lista de hotéis API. Tudo bem, então você pode ir em frente e fazer essa mudança rápida. E apenas para verificar se ele ainda funciona novamente. E ainda estamos vendo nossa documentação da API Sagar. E você também notaria que a URL tem ponto-ponto. Quando clicarmos, temos isto. Então, quando vamos para esse link pode parecer um pouco diferente, que é eu passei por tudo o que acabamos de fazer. Tudo bem? Então não só confirmar que ele está trabalhando em outra coisa muito importante que queremos fazer é criar o banco de dados. Então, em nosso servidor de banco de dados,
portanto, se você está usando o SQL Express ou
você está usando o desenvolvedor, você pode simplesmente ir para aquela instância específica que você espera hospedar o banco de dados da API, desculpe, em. E então você só quer criar um novo banco de dados. Então você quer que isso precise estar presente para quando fizermos nossas migrações, certo? Então, porque eu não quero que qualquer tipo foi eu vou apenas clicar duas vezes no nome do banco de dados do, dos hosts, da configuração do aplicativo, desculpe,
e, em seguida, ir em frente e usar esse nome para criar o banco de dados. E então você pode ir em frente e confirmar que o banco de dados está lá. Está vazio, certo? Nodal ou demais sobre isso. Mas esta é a implantação inicial, certo? Então o que vamos querer fazer é publicar. Então podemos ir em frente e clicar com o botão direito em nossos projetos. Vemos Publicar, clique nisso
e, em seguida, podemos escolher o nosso alvo. Então, temos algumas opções aqui. Você pode publicar em um 0, que podemos olhar mais tarde para a pasta Docker, FTP. Isso seria útil se você está hospedando como em um GoDaddy ou um desses ou você hafta FTP para o servidor que será hospedado em. Ou você pode ir diretamente para o iOS ou, se você tiver outros perfis, basta importar um perfil. Então eu vou fazer pasta e eu vou explicar por que eu faço foto porque eu estou fazendo uma implantação local. Eu posso fazer isso localmente para a máquina e, em seguida, mover os arquivos para onde eu quero que eles metas. Isso também se aplica quando você está indo e isso é meu baseado na minha experiência. Então, na minha experiência, eu fiz implantações de pastas onde eu escolhi a pasta diretamente no servidor que ele estava indo para por causa de um erro de digitação que eu coloquei no caminho errado e eu tentei e tentei e experimentá-lo e nada foi atualizando. Acontece que eu estava fazendo isso no caminho errado. Eu não notei até que eu escolhi opção que disse excluir tudo na foto. E então eu acabei removendo algum outro poderia marcar fora só para obter o meu pequeno site. Então, minha natureza cautelosa, não, isso é que aprendi através da experiência, me
leva a fazer sempre nossa implantação minha máquina e, em seguida, os arquivos e movê-los para a máquina de destino. E é assim que eu faço. Então é por isso que eu vou demonstrar a vocês,
com base na experiência, com base na experiência, vocês podem escolher se vão ou não fazer do meu jeito ou se as ruas da escola são a máquina alvo que quando não há um caminho certo ou errado, É só uma questão fora. Experiente ensinando-me sabedoria. Tudo bem, então eu vou escolher uma implantação de pasta local. Então ele vai para a pasta bin liberado.net cinco publicado. Tudo bem, podemos clicar em Concluir e depois podemos editar. Então, há certas coisas que queremos fazer. Então, podemos adicionar este ponto altera o local de destino, se desejar. Mas quando vamos para Configurações, podemos escolher outras pequenas configurações. Quero as opções de publicação do arquivo. Então esta é a meia opcional em barcos. Exclua todos os 5p existentes. Então o que fez isso é branco antes de aprender os novos arquivos. E se você não escolher isso,
o que ele vai fazer é provavelmente apenas substituir o que está lá ou o que está em comum de qualquer maneira. Então isso pode ser arriscado porque se for a pasta errada, como eu disse, ele irá remover arquivos críticos. Podemos escolher os bancos de dados. Bancos de dados, use essa string de conexão em tempo de execução. E eu vou pegar isso e eu vou mudar suas conexões com ele porque eu não quero que ele use loca,
DBMS, SQL banco de dados local. Eu queria usar meu host local ou localhost barra SQL Express, qualquer que seja o nome do servidor. Você colocou isso aí. Vou manter o mesmo nome de banco de dados e qualquer outra opção. E depois o barco a vapor, as migrações. Então eu vou dizer aplicar esta migração. E o que isso fará é gerar um script
baseado na situação atual do banco de dados e as migrações e tudo mais, certo? Então podemos ir em frente e fazer isso. Clique em Salvar e clique em Publicar. Então aqui você tem o local alvo e é aqui que ele vai para a minha máquina, Publish. E uma vez que a publicação estiver concluída, eles vão mostrar-lhe, se você quiser. Solo ou não, o que foi no meu caso, e degeneração do script foi concluída com sucesso. Então, deixando de ser apenas a implantação inicial, essa etapa de geração de flagelo é muito importante porque quando você está indo para implantar nosso como uma atualização, ele já está em produção em sua atualização algo Amy alterações de banco de dados, novas migrações, etc Você vai querer fornecer esse script para os administradores de banco de dados são o desenvolvedor sênior. Quero dizer, se você é um desenvolvedor sênior, então tudo bem. Bem, você quer este script para ter mais,
ter mais controle sobre as alterações do banco de dados. Você não quer que ninguém apenas diga, oh, eu estou migrando número de dados de giros ou eu migração sobre os atos obesos? Porque no desenvolvimento temos menos preocupações sobre os dados reais e integridade do que na produção. Então você quer ter cuidado com isso. E vamos seguir em frente. Então eu posso controlar clique e ir diretamente para o sistema de arquivos onde este foi publicado. E eu posso pegar esses arquivos e uma vez que eu vou fazer é em S, então deixe-me apenas trazer para cima em outro lugar no site padrão, nós sabemos disso. Vamos clicar com o botão direito. E então eu vou apenas para explorar. Então, isso agora está trazendo para a pasta Ionic onde eu sou pasta raiz
WW onde todos os aplicativos web devem sair. - Não. Digamos apenas que este é um servidor que tem vários aplicativos em execução. Então, todos eles estão sendo executados a partir do nome do servidor barra o aplicativo web. Mmm. Então o que vamos fazer é criar a API tem uma web up, então vamos obter o nome do servidor ou o nome da máquina cortar as APIs e pontos. Tudo bem, então eu vou criar uma pasta. Vou chamá-lo de API de sublinhado total. E então dentro desta pasta eu vou colocar todos os arquivos. Então, se você é uma cópia e em uma rede, eu recomendo que você arquive para que seja mais fácil copiar. Mas desde que é apenas para desdobra a dobra na mesma máquina aqui. Foi uma operação desconfortável. Então eu quero executar os scripts SQL. Então eu só vou entrar em E f, desculpe, eu meio que rapidamente EFS gills scripts, abrir esse arquivo de script. E então aqui você verá que tudo o que estava
nas migrações está bem aqui em agradável e compreensível SQL. Certo, então mesmo as migrações que fizemos, banco de dados criou todas essas coisas, semeando beta. Então, os dados padrão que estamos colocando em todos esses Anzac migração aqui em scripts SQL. Então é por isso que eu estou dizendo que quando vamos
mudar o banco de dados cada vez que este script é gerado, nós podemos realmente extrair as coisas novas e ter mais controle sobre o que estamos fazendo com a visualização de dados. Tudo bem, então aqui e bem, qualquer maneira o script tipo de protege-lo porque eles dizem se o, então é por isso que eu tenho a tabela de histórico de migração porque ele tira os instantâneos de cada migração. Então diz, se esta migração não existe, então Karel este oxigênio. Então, vamos ver se já está feito. Não preciso fazer isso de novo. Tudo bem. Então podemos executar isto e deixar-me voltar ao topo. Então, com SQL, se você não está tão familiarizado com SQL, a
fim de certificar-se de que o script do Earth é capaz de executar no banco de dados. Você pode na parte superior dizer Usar, e você colocar os nomes do banco de dados. Neste caso, será listagem OTA ou você apenas certifique-se que o banco de dados é selecionado do topo aqui na lista de bancos de dados disponíveis, certo? Então é assim que você pode garantir que sua capacidade de ler está em suas necessidades atuais obesas quando eu clicar em executar, o script é executado com sucesso. Então saiba que eu tenho as tabelas se eu apenas atualizar, eles são todos, eles são todos aqueles para os usuários, hotéis e países, todos aqueles que criamos manualmente, eles estão todos lá. Então eu sei que o banco de dados está preparado e pronto. O que eu vou fazer é continuar com a sessão do aplicativo web API em si. Então Buck no IIS, eu só vou atualizar esta lista porque o que ele vai fazer é listar cada pasta que está na raiz www ver automaticamente isso. E então o que eu vou fazer é clicar com o botão direito do mouse nele e converter ferramenta e aplicativo. Antes de fazer isso, sinto muito, sinto muito. Antes de converter isso para um aplicativo e vamos para o pool de aplicativos. Portanto, um pool de aplicativos é como um contêiner dentro do qual aplicativos da web ou aplicativos da web podem ser executados. Um único princípio de responsabilidade sugere que você faça um pool por dispersão de AP. Porque se apavoramento continuar com várias OPS, todos esses ups param de funcionar. Então você sabe, para isolamento, você pode ter várias piscinas. Alguém está na API de imagem. Piscina para nada muito extravagante ou complicado. A versão dominante CLR sobre quando dizer nenhum código gerenciado porque estamos usando o.NET Core. Então isso é muito, muito importante. E então podemos clicar bem, então tudo bem. Agora a relevância disso é que quando eu estou voltando para a etapa anterior e tudo quando eu clicar com o botão direito e dizer converter, o aplicativo vai me perguntar qual pool de aplicativos eu quero selecionar. Então eu posso ir aqui e selecionar a partir desta lista suspensa API hotel, uma piscina. Esse é o que eu desejo para este aplicativo para iraniano. E então eu posso ir em frente e clicar em OK. E então você notará que ele não se parece mais com uma pasta. Não, parece um pequeno globo da web com o poço, não, parece que está em cima. Tudo bem. Então vamos dar essa volta de arame. Vou para Bros até ao porto 80. E aterrissamos neste lance que está vendo endereço 404, não telefone, tudo bem, mas o que esperávamos é mais ou menos como documentação arrogante. Então deixe-me ver se talvez quando eu tiver solicitado isso vai e lá vamos nós. Então não, pelo menos sabemos que estamos olhando para ele de um localhost. E observe que isso não é dois-pontos host local as portas localhost dois-pontos as portas, o número da porta. Deixe-me apenas mostrar para onde quer que seja claro, localhost dois-pontos, o número da porta representa o ambiente de desenvolvimento. Na situação Maya, hospedeiro local por si só. Representa o IIS. Se você tem vários servidores
web, web, talvez você tenha, wow ME, Poisson ou Apache, ou outros servidores web em execução, então você pode precisar mudar as portas porque agora eu tenho apache. O que é executado na porta 8080 localhost. Tudo bem, o que é o padrão no iOS é o meu padrão. Então host local é o que você vê quando o nome do aplicativo web e, em seguida, a primeira página. Portanto, pelo menos sabemos que estamos servindo de atividade do IIS. Certo, então vamos usar o carteiro e fazer um novo pedido. Então eu só vou pedir todos os hotéis da API. Não perceba o link. Espero que não seja muito pequeno agora eu tenho que ver localhost barra hotel, sublinhar API barra api barra hotel. Tudo bem, então seu local cortar a web até nome barra, o caminho que teríamos resolvido em nosso controlador. Então ele tem que saltar de volta. E eu estou apenas fazendo este solo compreensão completa de todas essas pequenas variáveis e manter se elas separadas, certo? Então a regra que dissemos era APIs barra controlador, eu não disse que poderíamos alterá-lo. Isso provavelmente saberia que estamos implantando, certo? O que um ponto é que porque é API Slashdot significa o que quer que esteja precedendo, ele sempre irá por esse caminho. Então, se é que nós não usamos nossa web em chamá-lo total para cima. Poderia ter sido localhost barra api especial. Se era a média, se era um local raiz fora do servidor de aplicativos. Então, neste caso não é, eu não estou disposto a mudar o nome só porque sua instituição pode ser diferente da minha e eu estou apenas explicando todas as dinâmicas
por trás do meu fim desta van sua pode não porque ele seguiu um caminho diferente. Então, se você implantar diretamente, e mais uma vez, eu não tenho nenhum problema em mostrar se você implantou
seu, sua API diretamente para a raiz deste iônico puxado para a direita de www root, desculpe, você não fez todos nós puxados para longe e colocá-lo aqui mesmo em a raiz, então o swagger de barra do host local realmente serviria para você. Espero que esse pij que estávamos olhando vindo do anfitrião local, certo? Mas por causa desta web up, nós temos que ir para o web app para chegar ao material real. Certo, então vamos testar esse pedido. E quando eu clico em enviar, estou recebendo um erro 500. E tudo o mais legal sobre tudo o que fizemos foi que enviamos todos os blogs, certo? Então eu sempre posso ir para a minha pasta de logs e dar uma olhada no porque eu estou recebendo esses erros. Tudo bem? Então este arquivo de log está me mostrando que algo deu errado na falha de login do cliente de dados para o usuário. E então ele está me mostrando o nome do usuário. Então, no vídeo anterior, eu vi que as permissões vão desempenhar um papel muito importante no que você está fazendo, certo? Então. Para a nossa piscina que acabamos de criar. Para que o usuário abaixo do pool up possa interagir com o banco de dados, precisamos ter certeza de que damos permissão para o banco de dados. Então o que eu vou fazer é ir para o SQL Server ou voltar para o banco de dados. E depois vamos fazer duas coisas. Vão criar um login para esse usuário agrupado. E então vamos adicionar esse login à segurança do banco de dados. Então, em primeiro lugar, novo login ou bem ,
deixe-me, deixe-me apenas ver se eu posso fazê-lo diretamente como um usuário. Então, sob o banco de dados é o nosso objetivo para a segurança dos usuários, em seguida, usuários do que o novo usuário,
e, em seguida, escolher windows user Tudo bem, e então colocar esse nome de usuário como pool, esse é o seu domínio. E o, basicamente o nome do pool é o nome de usuário. Ou podemos clicar em OK. E se olharmos na lista, então vamos ver que os usuários do pool não, adicionado, não. Deixe-me tentar este pedido novamente. Ainda levantando 500. Deixe-me tratar isso um pouco. Então o que eu vou precisar fazer é dar mais permissões. Tudo bem? Então nós adicionamos isso aos livros do banco de dados. Nós não demos nenhum membro a ele, então eu vou apenas sentá-lo. O DB Owner? Não, você vai querer provavelmente ser um pouco mais granular do que eu estou sendo certo sabe, ao definir permissões porque o usuário que pode acessar o banco de dados pode não, você pode não querer dar-lhes a propriedade porque propriedade música e deixar cair o visto, Visa, Andrew Oldham, coisas potencialmente maliciosas, tanto quanto ajuda o usuário. Você quer ser muito consciente de segurança ao dar permissões, certo? Então você pode apenas querer dar-lhes dados, ler, dados ou quais músicas e ler e escrever para o banco de dados. Mas eles não podem fazer qualquer outra operação crítica que possa comprometer os dados. Tudo bem? Na minha situação é minha máquina lá, meus usuários. Vou definir o proprietário do banco de dados. Então eu vou dizer associação DB Proprietário e esquemas próprios. Proprietário do BD. E geralmente você percebe que o esquema padrão, o negócio que você não precisa se preocupar com isso é mais material de nível de banco de dados que só querem colocar nosso aplicativo em funcionamento. Então podemos clicar em OK e então podemos tentar novamente. E então vemos aqui que estamos recebendo dados. Então, estamos recebendo dados do nosso banco de dados API. Agora só para que você saiba que alguns
dos recursos de segurança ou eu sou um recurso nazista, uma configuração que é, eu poderia ter apenas Putin pode não necessariamente funcionar exatamente assim para você há outros fatores são você que as ruas estão fazendo essas coisas. O ter de permissão para dar permissões aos usuários e todas essas coisas desempenham um papel em se você pode ou não
concluir com sucesso todas as atividades como você acabou de me ver fazer isso. No entanto, essas são as etapas básicas para colocar seu aplicativo em funcionamento nas configurações necessárias no banco de dados. E agora voltando é que há poucas coisas que queremos ter certeza de que estamos no lugar. Se você se lembra, quando estávamos configurando nosso JWT, adicionamos uma chave secreta que adicionamos como uma variável de ambiente. - Não. Se você adicionou isso ao estilo perturbador, então você não precisa passar por esta etapa. Se no entanto você fez o que eu fiz e adicionou como uma variável de sistema, então precisamos da nossa API para armazenar essa chave, certo, que ele possa lidar com essas mordidas operação de onde quer que esteja na máquina automática. Então vamos para o editor de configuração. E da lista suspensa para a esquerda, queremos ter certeza de que temos servidor web ponto
do sistema e, em seguida, vamos escolher ASP net core. Tudo bem, então vá em frente, seção cônica, vamos para System.out. Webserver é B.NET Core. E, em seguida, do menu suspenso para a direita, vamos para os hosts de aplicativos, não para o conflito. Sabe, quando fazemos essas duas mudanças, podemos ver o cone Variáveis de Ambiente é igual a 0. Então, vamos apenas clicar nisso. E então vamos adicionar nossa variável de ambiente. Não, a mesma coisa que você adicionou como chave de ambiente. Então eu só queria o meu irrecuperado e
meu nome era a palavra chave e meu valor era este bom. Agora, por mais complicado que seja, quem quer que tenha sido, a questão é que nós o queremos em um local seguro e é isso que este mecanismo está nos oferecendo. Tudo bem? Então você pode simplesmente ir em frente e colocar em seu nome e a chave que você selecionou. E então podemos ir em frente e fechar isso. Agora que foi adicionado. O comentário não é ninguém. Podemos clicar em aplicar para aplicar as alterações e, em seguida, reiniciar ou pools. Então eu me lembro, eu mencionei que quando vários aplicativos estão na piscina, se você se algo acontecer com o pool e todos aqueles acima educados em. Então eu só queria reiniciar ou piscina. Podemos reciclar. E então o que vamos querer fazer é testar nosso login e Tolkien recuperar Ilha e acesso seguro. Então deixe-me apenas verificar novamente se isso ainda, tudo bem, então nossa API ainda está funcionando. Isso é bom. Deixe-me tentar fazer login, então eu vou apenas voltar para um dos meus pedidos mais antigos. Certo. E bem, na verdade, eu não posso usar este pedido mais antigo ainda porque se eu tentar então eu vou apenas duplicar isso. E eu fui remover o número da porta. E também não estou usando HTTPS. Https. Esse é um outro nível de configuração onde eu não quero entrar muito nisso,
nesta lição, nós só queremos que nossa implantação da banda seja executada. Então host local barra hotel, sublinhado API, em seguida, barra api barra Lothian login barra de saída. Certo. Então eu mando receber um quatro oh, um, certo? Não estou autorizado porque este usuário não existe. Então, porque não vimos o usuário. Então, se você, se você vê que o usuário, você provavelmente não tem esse problema. Então eu estou indo apenas para fechar alguns desses pedidos mais antigos estão em. Então vamos tentar registrar o mesmo usuário ou no mesmo usuário. Então mude o caminho. E quando enviamos o pedido, vemos que conseguimos que a ferramenta seja aceita. Então esse usuário foi criado. Vamos ao banco de dados e verve. E podemos ver esse usuário aqui, trauma para example.com na senha. Tudo bem, então agora que temos o usuário criado, vamos tentar nossa operação de login novamente para tentar e obter o Tolkien. Então a costura pede que nós apenas tentar e deixe-me enviar, e aqui está o nosso Tolkien. Tudo bem? Então, se formos para a cadeia com a TDA e olharmos para o nosso Tolkien, onde vemos coisas que estamos acostumados a ver, certo? Ele vai dizer assinatura inválida porque mais uma vez, ele não sabe que a chave foi assinada com, que é o que acabamos de dizer, Abra a variável de ambiente. Mas vemos que o Tolkien tem a inflamação que esperamos. Então é agora que eu vou tentar um fora da operação deletar alma. Deixe-me tentar com o hotel para sabermos que temos três hotéis que vemos isso, certo? Vou apagar o hotel com ID3 do banco de dados para
sabermos que precisamos do nosso Tolkien e teremos o link. Deixa-me mudar isto para hotel. Então, estamos deletando o hotel. Então eu só quero verificar se nosso Tolkien funciona. E quando fizermos isso, vamos ter de volta uma ferramenta para. Então isso significa que se eu for para o banco de dados e olhar na tabela de hotéis, que começou com três, nós só estamos vendo ferramenta. Então você vê nosso Tolkien trabalhou nossos, todos os nossos endpoints, pelo menos o que testamos, então fogos de artifício e até agora implementamos com sucesso nossa API em ou local. Implantação de IS local com nosso banco de dados local de portas. Então, seguindo estas diretrizes, você pode implantar com sucesso a API dentro de sua empresa ou para seu uso pessoal, ou qualquer que seja essa situação.
50. Crie uma conta do Microsoft Azure: Ei pessoal, neste vídeo vamos criar o nosso Microsoft um 0 cones. Como eu disse antes, podemos começar de graça. Para chegar a este sites, vamos para absorver ponto Microsoft.com e, em seguida, eu acho que as estradas que você de acordo com sua região ou seu idioma. Mas isso é o que o site parece deve ser parecido. E você pode ler através dele para ver exatamente o que 0 é todas moradas. Trata-se de ser futurista, permitir mais colaboração e operar de forma mais integrada em um espaço fechado, certo? Eles estão em todo o mundo e você geralmente escolheria a região mais próxima de você. Então eu estou na região do Caribe. Então meu Joel diz, região é leste para nós ou leste EUA dois. Mas não para este vídeo. Este vídeo estamos apenas criando as colunas não estavam configurando nada sobre razões ainda. E assim, para começar, nós podemos aqueles bem, se você já tem uma conta real, então você pode apenas ir em frente e entrar com que live up cones. Mas você pode clicar em Iniciar gratuitamente. E aqui eles dizem que você pode criar um livre ter ido hoje e você pode começar com 12 meses de serviços gratuitos. Então isso é um bom negócio para mim. E se você rolar para baixo, você verá 12 meses de serviços gratuitos, populares e
gratuitos mais US $200 de crédito que expirarão em 30 dias. Então eles dão a você $200 a pode criar máquinas virtuais V, novamente, criar recursos na nuvem e experimentar até que o dinheiro é o. E isso é realmente apenas por um mês. Mas, em seguida, há certos serviços que você só recebe gratuitamente pelo resto do ano, e então você terá alguns outros serviços que são sempre gratuitos. Tudo bem, então o que vamos fazer é ir em frente e clicar em Iniciar grátis. Depois vão pedir-nos para entrar com o nosso vivo de cones. Se você tem uma conta real mais uma vez, ele pode ir em frente e usar isso. Se você não tem outro cone, então você pode ir em frente e criar um. E esta é uma opção muito recente para entrar com o GitHub. Então eu tenho um cone vivo que eu uso, mas eu vou apenas orientá-lo através do criar 1 primeiro. Saiba que o ícone ao vivo não precisa necessariamente estar ao vivo ou em all.com. Não precisa ser uma conta tradicional do Hotmail, pode
ser uma conta do Gmail. Então eu posso realmente usar o mesmo endereço de e-mail que eu usei para o GitHub ou por endereços de e-mail que eu uso quando estou inscrevendo para coisas que eu posso usar que seja Yahoo, Gmail, Hotmail, seja lá o que for. E basta clicar em seguir. E aqui está ele, ele está me dizendo que eu já tenho um ponto da Microsoft desaparecido. Então isso faz isso dirigindo meu ponto no entanto, que uma vez que você tem um endereço de e-mail, ele não tem que ser Hotmail ou um tradicional barco AECOM vivo lá, criando
assim um Microsoft ou Collins para você com esse endereço de e-mail. Então você pode ir em frente e se inscrever. É um processo bastante simples. Agora eles são Conda decidiu que já existia. Essa é uma conta que eu estava usando para me inscrever nos dois pontos grátis. Então. Eu realmente só fui em frente e logado e porque eu realmente não resolver muito mais, eu acho que o seu processo de registro vai realmente parecer muito semelhante a este independentemente, assim por diante para superar o obstáculo de colocar em seu endereço de e-mail e prosseguir, então você provavelmente vai acabar em uma tela como esta, onde você vai ser solicitado para suas informações demográficas apenas para
seu registro mantendo meu país e são enormes em sua Jamaica. E eu estou citando meu número de telefone que eu acho que faz. E então eles dizem, você
quer verificar sua identidade por telefone ou o desejo por cartão? Então eu vou escolher me leva por telefone e eu acabei de receber a mensagem. Não demorou muito. Então eu vou colocar o código e depois verificar. Agora, aqui está a parte que pode impedi-lo se você não estiver preparado para isso, eles vão querer verificar sua identidade por
cartão para que você não seja cobrado a menos que você atualize, significa que eles têm um plano de assinatura da cláusula VOCÊ diferente, então certo. Não, você está se inscrevendo para o plano de assinatura gratuito. Uma vez que as assinaturas gratuitas no plano é feito, então você não será capaz de fazer muito
na plataforma até que você envie nossas novas assinaturas na marca, que coincide com essas atualizações. Então, como eu disse antes, há “P “Como você vai e então há “pay as you-go Dev Slash Test , que é como metade do preço fora do normal PICU legal. Então eu realmente forneci meu cartão de inflamação quando eu me inscrevi. E tendo feito isso, você pode clicar fazê-los clique acordo se você não falar sobre cartão ou você não está confortável em fornecer nossos detalhes do cartão, em seguida,. Gostoso, e você pode parar aqui, tudo bem. Mais tarde, quando realmente estamos implantando no Azure, você ainda pode ver como ele será exibido e ver como ele é benéfico para você. O que, se você quiser, então você pode ir em frente e fornecer suas informações e, em seguida, clique
no contrato e aceitar os termos do contrato e, em seguida, você estaria na plataforma. Então eu só vou assinar meus cones Rayleigh, posso citar um cone Rayleigh, mas um que eu uso e mostro como um 0 se parece. Bem, na verdade eu apenas digitei em Puerto dot 0.com esperando que eles me pediriam para entrar, mas eu fiz isso e ele apenas reescreveu que mus em parecer um cone que eu estava apenas configurando George Williams em gmail.com. Então este painel, então este é o painel no nível muito básico, eles têm um painel ao lado aqui listando ODE. Alguns serviços que você pode obter. Mas então, porque nós não completamos o conjunto de quatro porque eu não completei o estabelecido, pelo
menos quando eu for para assinaturas, eu vou ver que eu não tenho nenhuma assinatura, certo? Então, como eu vou vê-lo na assinatura é como a taxa que você como um cliente, se a sua PSU, meta, empresa ou qualquer outra coisa. Então, se mais tarde eu decidi que eu queria fornecer minhas informações, eu posso apenas voltar e clicar em adicionar. E então isso me levará a completar o sinal de procedimento onde eu realmente adicionar a assinatura. E então este é um julgamento gratuito sobre essa guerra sentado. Só sei que você tem apoio ao desenvolvedor meta PSU como você tem alguns deles, Tudo bem? Então eu provavelmente iria com o pagamento como você vai. Mas isso sim, tudo isso está nas etapas de se inscrever no Azure, e isso é se você quiser continuar com isso. Mas então para este tutorial realmente e verdadeiramente, eu só queria que você chegasse tão longe quanto o painel que você possa ver que isso é o que um Xero se parece. Isso é o que o portal de gerenciamento de carga de trabalho você pode configurar suas máquinas virtuais. Mas para este curso, estaremos olhando para cima serviços.
51. Implante aplicativo e banco banco de banco no Microsoft Azure: Porque vamos voltar. Então já configuramos ou um zerocoins e tudo o que queremos realmente implantar. Então, antes de fazer isso, eu queria fazer uma mudança de configuração de trenó para onde nossos arquivos de log estarão indo porque em um Xero há uma unidade LC, não
há seco local. Então o que eu vou fazer é deixar Cyril Log cria uma pasta dentro de toda a estrutura de pastas para o projeto. E é aí que os registros estarão. Dessa forma, quando vamos ao Azure, não
precisamos nos preocupar com nenhum caminho ou ficar muito chiques. Então, vamos lá e publicar. Dito isto, só estou fazendo isso localmente por simplicidade, há toneladas de mais. O que eu disse robusto ostenta mecanismos de
registro que podemos tirar proveito de entender isso porque eu queria encontrar a maneira mais rentável porque os outros custam dinheiro como você adiciona. Tudo bem, então vamos clicar com o botão direito. Vá para publicar. Vamos criar uma nova editora. Fluoróforos já têm um perfil para implantação local, que é um perfil completo, certo? Então eu posso realmente apenas renomear este aqui para que eu saiba exatamente para que ele é. Perfil I S. Seguro. Tudo bem. Bem, então eu quero um novo. E este vai ser o perfil Azara. Portanto, o que eu quero fazer é implantado em um serviço do Azure up. Não, se você não sabe tanto, vou citar Azara despida. O que acontece é que você pode implantar um aplicativo em uma obrigação como um tipo de restrição de serviço, que
significa que você não precisa se preocupar com este servidor ou qualquer coisa. Eles só vão preparar a noite, tem um bom recipiente para você e colocar seu código lá. E então eles vão segurar as coisas feitas para que você fique como um informador, certo? Ou melhor, essa seria a plataforma de serviços como um serviço. Então eles estão fornecendo a plataforma como um serviço para você apenas colocá-la sobre ele e ele apenas vai funcionar. Então isso é o que eles querem dizer com a observação é, e então o que eles queriam comprar um Windows ou Linux, nós vamos usar o Windows. Caso contrário, ele pode fazê-lo recipiente ou para um registro de contêiner ou para uma máquina virtual. Portanto, basicamente, o mesmo tipo de considerações que teria feito com a implantação do IIS em sua máquina ou máquina de rede, você teria que fazer esses tipos de considerações em relação a uma VM no Azure porque é a mesma coisa que apenas um servidor CM de máquina virtual. E ele Hall, vamos escolher a plataforma como um serviço. O serviço e clique em Avançar. E então este, não, ele pode pedir-lhe para se conectar. Então você tem que dizer, em bem honrado descer dentro deste pequeno Swami, ele mostra o grupo de recursos de assinatura. E eu não tenho muitos desses. Então eu vou apenas ir em frente e pressionar este mais cientista começar a construir sobre ele em cima Serviço os EUA para o nome. Não vou mudar o nome. E então eu tenho alguns grupos de recursos, SIR, de projetos Foss. Mas eu vou criar um novo. Vou chamar-lhe uma lista total. Api. Então esse é o nome desse grupo de recursos. E então o plano de hospedagem aqui, eu posso deixá-lo no padrão, mas então eles têm um plano de hospedagem grátis. E baseado em onde estou no mundo, East US 2 é a minha melhor aposta. E escolha grátis. Então você pode estar em outro lugar do mundo você escolhe o motivo que é mais próximo de você, mas baseado em onde eu estou, East US 2 é minha escolha razoável. Agora escolha as implantações gratuitas. Clique em OK e, em seguida, cria. E depois que o processo é feito, podemos ir em frente e clicar em próximo e então podemos atualizar. Sem apologistas é gerência, então não quero nenhuma gerência. Vou pular este passo e depois clicamos. Então, a próxima tela está nos mostrando qual será o URL do nosso site. Então, qualquer que seja o nome AP que nós sentamos lá
ponto, ponto 0, websites.net porque é grátis. Eles nos dão um subdomínio. E podemos sempre ir em frente e comprar domínio se quisermos, mas não vamos chegar tão longe,
mas faremos com que tenhamos dependência de serviço em um banco de dados. Eles estão vendo se você precisa configurar seu banco de dados para fins de conectividade, certo? Então eu preciso ir e dizer configurar. E, em seguida, os últimos você
quer um banco de dados SQL Server local ou será Azara SQL? Então, mais uma vez, vamos usar a opção PAS onde eles estão apenas nos oferecendo um serviço na nuvem. E só precisamos nos conectar. Então temos que ir em frente e criar uma nova instância de um serviço Nitobi nome de hospedagem, serviço de
hotel, DVs, AC tipo de carga de enchimento algumas coisas. Vou colocá-lo no mesmo grupo de recursos como um todo para listar API. Lá vamos nós. E, em seguida, servidor de banco de dados, eu tenho que criar um novo. Então ele vai preencher algumas coisas, mas eu vou ter que colocar em meus detalhes administrativos. Então, e a senha Bartov, que é bastante terrivelmente rigorosa. Então, apenas certifique-se de que você tem uma caixa especial, letra
maiúscula e um número e você deve ficar bem uma vez que você exceder sete caracteres. Então, uma vez que você colocar em todos esses detalhes, você pode ir em frente e clicar em OK. Ele irá preencher automaticamente o que ele precisa para preencher dentro. Ele não precisa de um, criar o servidor de banco de dados e, em seguida, você teria acesso para se conectar a ele. Certo? E isso está completado. Então vamos clicar em Avançar. E então o que ele vai fazer é dizer, ok, este é o nome da cadeia de conexão de banco de dados. Qual é o nome de usuário? Então nós temos que colocar de volta o nome de usuário que nós apenas usamos para criar o material do banco de dados e a senha. E então ele vai mantê-lo na seção perturbadora do Uzziah. Podemos escolher o cofre de chaves, mas vou deixar isso como as configurações padrão lá. E, em seguida, se quisermos novamente realmente visualizar o valor da cadeia de conexão. Então eu posso realmente mostrar a vocês que a fonte de dados, esta é a conexão com o banco de dados real no Azure, certo? Então, se eu copiar isso apenas para meus próprios propósitos. Isso mostra o catálogo inicial, que é o nome do banco de dados para o qual o ID do usuário será verdadeiro
nesse ponto qualquer domínio e senha, eu usei uma senha simples, é claro, em uma configuração da vida real, você usaria um senha segura. Para que possamos fazer é ir em frente e clique em Avançar. E nós não temos que tocar em nada aqui e apenas dizer termine. Tudo bem, e agora podemos clicar em publicar. E isso pode levar um tempo porque tem que criar alguns recursos. E isso está dizendo que você está publicando o aplicativo sem agrupar o tempo de execução, tomando a compatibilidade de tempo de execução. Então podemos dar isso. O resultado final dessa verificação, no entanto, é que está iniciando o navegador e me enviando este erro 500. Certo, pelo menos sabemos que está respondendo. Então a API está lá, mas ainda temos algumas coisas que precisamos fazer. Então vamos começar indo para o nosso portal. Então apenas clique em gerenciar em um portal 0, nós temos navegado para a velocidade nos mostrando o aplicativo em execução em um 0. Tudo bem, então sabemos que definitivamente não é adorado, está lá. Nós clicamos em manos. É bom nos mostrar o URL, desculpe, previsto pelo HTTPS. E nós estamos conseguindo por esses 500. Então não estamos melhor do que antes, mas pelo menos podemos confirmar algumas coisas. Agora, se vamos para baixo para a configuração, ele tipo de nos mostrar algumas das coisas como nossa cadeia de conexão. Tudo bem, então lembre-se que cadeia de conexão e esse valor oculto, pelo
menos desta cadeia de conexão, eu posso ver o servidor para o banco de dados. Então eu vou apenas copiar isso. Lembra-te que te mostrei mais cedo, por isso vou copiar isso. E, em seguida, no estúdio de gerenciamento, eu vou tentar e me conectar, ele vai apenas clicar nisso. Se ele já o tinha aberto, tudo bem. Caso contrário, você será iniciado no Management Studio e, em seguida, coloque o nome do servidor e quaisquer credenciais existentes e clique em conectar. E ele apenas solicitará que você entre. Então o que acontece é que o firewall está vendo eu não estou permitindo acesso ao banco de dados de qualquer outra fonte que está fora de 0. Então agora o que eu quero fazer é apenas entrar e, em seguida, ele irá adicionar uma exceção para o endereço IP que estou usando. Então esse é um recurso de segurança importante. Então eu vou estar por trás deste endereço IP. Alguém de sua própria casa com um endereço IP diferente não será capaz de acessar o banco de dados
a menos que eles façam login e verifiquem exatamente como eu estou fazendo agora. Então eu vou apenas ir em frente e clicar em OK. Claro, há maneiras de permitir o acesso de todos os lugares, mas não precisamos fazer isso agora. E então quando eu olho na lista de bancos de dados, vemos nosso banco de dados. Só estou confirmando que nosso banco de dados está. Mas olha para isto, não há mesas. E o que eu vou fazer é editar o perfil e ir para as configurações. E nós realmente pulamos este passo. Acho que estamos ansiosos demais, certo? Portanto, não fizemos as etapas de migração, aplicamos essa migração ao publicar. E bem, nós já usamos sua própria cadeia de conexão com o novo banco de dados hospedado em tempo de execução. Então isso
não é realmente necessário para marcar novamente, mas tudo bem. E eu vou salvar e, em seguida, eu vou apenas clicar em publicar novamente. E se olharmos para o log, você verá adicionando banco de dados. E então você vê aqui isso nos dá alguma indicação de alguns scripts acontecendo. Então, vamos verificar novamente. E o que acontece desta vez é que porque dissemos aplicar as migrações, ele realmente foi em frente e preencheu todas as tabelas para nós. Tudo bem, então essas são as partes realmente importantes. Então não precisávamos ser distribuídos manualmente. Mais uma vez, seria prudente em nosso cenário
real de produção ao vivo controlar este processo um pouco mais do que podemos fazer em nossos projetos pessoais e em nosso tempo pessoal. Tudo bem, então você pode verificar meu outro curso sobre implantação e controle de produção nos ambientes. Mas para isso, nós só queremos colocar nossa API em funcionamento e entender,
oh, todos os sistemas trabalharam juntos. Então este é o nosso banco de dados atualmente funcionando em seu servidor. Então vamos voltar para o nosso console de depuração em vez de kudos, ir para o site www root. E então lembre-se que dissemos Coloque o amor a mesma raiz que o sistema de arquivos. Então é por isso que temos acesso à nossa pasta de logs aqui, que nos mostrará nosso registro desde que estamos fazendo essas implantações. Então, se eu apenas ir em frente e baixá-lo, vamos abri-lo em uma nova sessão do navegador. E eu só queria ver por que foi através do erro mais recente. Então diz que algo deu errado com um argumento não como sip son, algum erro de referência de stringer, e alguma codificação que deveria estar acontecendo na linha 46 de extensões de serviço. Então, se olharmos para o código e vermos o que exatamente está acontecendo nessa linha. É onde estamos configurando nosso JWT. E você vê que estamos fazendo tudo isso. E é aqui que diz que a codificação falhou. E falhou porque estamos procurando por C0. E C0 é realmente uma variável de ambiente chamada chave. Então lembre-se que tivemos que sentar que está aberto. Eu acho que nós temos que fazer a mesma coisa que o seu, tudo bem, então o que eu vou fazer é voltar para o nosso painel de gerenciamento, ir para baixo para a configuração. E então, a partir daqui, posso dizer novas configurações do aplicativo. Vou dizer que a nova configuração do aplicativo é a chave junto com o valor. Então, quero dizer, eu posso continuidades com o mesmo valor. Eu provavelmente vou usar um valor mais simples, mas então para a consistência entre o ambiente você provavelmente queria parecer coisas. Então é, você sabe, um ou outro usa um simples em corpos de
desenvolvimento de um complicado na produção ou você usa um por ambientes. Para segurança e separação de papéis, situações, desenvolvedor pode não ser capaz de simplesmente entrar em produção e manipular qualquer coisa, porque ele provavelmente não sabe. Mas para simplificar, vou manter a chave Cmd atravessada. E eu vou clicar em OK. Vá em frente e salve isso, continue. E ele vai usar dizer que vamos reiniciar o aplicativo, tudo bem. Vá em frente e reinicie. E assim que isso for reiniciado, eu vou para a visão geral, ir para Burrows estão em para que não possamos manos em qualquer lugar. Estamos pegando isso, Sally, agora
estamos ganhando 500. Este é o mesmo erro que obtivemos se você passou pela implantação do iOS. Isso é tudo o que temos, ganha-ganha e rota. Então, se eu disser slash swagger, isso me levará ao documento swagger que está sendo hospedado em nossos sites do Azure. Então eu vou fazer um teste rápido. Então eu vou tentar obter a execução do país. E então eu recuperei com sucesso todos os países atualmente na base de dados. Então isso significa que se eu tentar usar o carteiro, eu vou apenas copiar este URL para o Postman. E eu vou apenas criar um novo espaço de trabalho porque às vezes você pode sobrecarregar os outros. Então eu vou apenas criar um novo espaço de trabalho, Azur desordenado. E então o que eu vou fazer aqui são apenas pedidos relacionados com a revista Dwell, certo? Então o país que eu queria ter não há autores está no topo. Mas então, como você pode ver, você pode obter todos os países imediatamente fora do mas através. Vamos tentar uma dessas tentativas de registro e, em seguida, fazer algo que é seguro. Então, eu só vou estar invertendo entre o espaço de trabalho original onde eu já
tinha os pedidos e este novo. Então eu vou até o posto. Eu só copiei isso. E em vez de te chatear com a criação, acabei de o fazer. Então, o novo ponto final seria qualquer que o nome do site é barra e, em seguida, APIs. Então é por isso que eu não o removi desde a implantação IS que eu levantei porque faz mais sentido aqui. Certo? Esconda um login de barra cone e então podemos enviar. E eu tenho uma causa árabe que eu tinha a carga de login em vez do registro payloads apologistas. Então nós estamos fazendo nosso registro e nós temos o payload carrinhos com a senha de e-mail. E este é o mesmo que testamos de um que estamos em nosso local. Então eu só quero verificar se tudo ainda funciona como funciona localmente e nós aceitamos nossa ferramenta. Então, isso é bom. Estamos debaixo de um camião. Então o que eu posso fazer é repetir o pedido de login. Então basta clicar nisso, trazer sobre o pedido de login e, em seguida, podemos enviar Tolkien mais alto. Excelente. E então o que vamos fazer é tentar excluir nossa criação é algo que sabemos que tínhamos dito que uma dessas bandeira autorizada. E, claro, eu não estou entediando você formando o link onde você sabe que eles têm que formar o link corretamente. O ponto final é api barra hotel com o ID. É o método de exclusão. E então adicionamos nosso
token de autorização ao portador e o token que acabamos de receber do login. E então, quando clicamos, recuperamos nossa ferramenta para nenhuma resposta de conteúdo. Então, se eu for ao banco de dados apenas para verificar, mais uma vez, nosso banco de dados Azur, podemos verificar que não temos mais hotel com o ID3. Então sabemos que podemos registrar um usuário para nosso conhecimento publicamente a API diploide. Então,
se eu tornasse esse link mais fácil de lembrar, então você poderia realmente navegar até ele. Com certeza, no momento em que você está fazendo isso, ouça, isso provavelmente não existe mais, mas o ponto é que é assim que você pode publicar sua API para o mundo. E usando swagger, você tornou mais fácil para qualquer um poder vir e dizer, Oh, é assim que este endpoint funciona. E estes são todos esses. E você vê que nós mantivemos nosso país V2 para falar de versões amble de nossas APIs. Mantemos a API padrão da previsão do tempo, mas é claro, não, podemos limpar todas essas coisas. E algumas limpezas que eu sugiro
seriam como com o país e o hotel realmente e verdadeiramente, eu deveria ter chamado isso de pontos finais. Países e hotéis tipo de controladores realmente deveria ter sido países controlador e controlador de hotéis. Mas isso é semântica. Isso é apenas uma questão de apresentação sobre neste ponto, podemos confirmar que a funcionalidade está funcionando.