Exercício: Desenvolver recursos de código usando ferramentas do GitHub Copilot
Você e seu colega de trabalho se encontram para conversar sobre seus objetivos para o aplicativo de biblioteca. Você quer aprimorar a experiência do usuário para bibliotecários e leitores. Você aborda vários novos recursos que poderiam ser adicionados ao aplicativo.
Você concorda em trabalhar nos seguintes recursos:
Disponibilidade de um livro: Permitir que um bibliotecário determine o status de disponibilidade de um livro. Esse recurso deve exibir uma mensagem indicando se um livro está disponível para empréstimo ou a data-limite da devolução se o livro estiver atualmente emprestado para um outro leitor.
Empréstimos de livros: Permitir que um bibliotecário empreste um livro a um leitor (se o livro estiver disponível). Esse recurso deve exibir a opção para um leitor retirar um livro emprestado, atualizar o arquivo Loans.json com o novo empréstimo e exibir os detalhes do empréstimo atualizados para o leitor.
Reservas de livros: Permitir que um bibliotecário reserve um livro para um leitor (a menos que o livro já esteja reservado). Esse recurso deve implementar um novo processo de reserva de livro. Esse recurso poderá requerer a criação de um novo arquivo Reservations.json, juntamente com as novas classes e interfaces necessárias para dar suporte ao processo de reserva.
Cada um de vocês irá trabalhar em um dos novos recursos e, em seguida, vocês devem se reunir novamente. Você vai trabalhar no recurso para determinar o status de disponibilidade de um livro. Seu colega de trabalho vai trabalhar no recurso de emprestar um livro a um leitor. O recurso final, reservar um livro para um leitor, será desenvolvido após os outros dois recursos terem sido concluídos.
Durante esse exercício, você vai efetuar as seguintes tarefas:
Criar um branch de "disponibilidade do livro" no repositório de código.
Desenvolver um novo recurso de "disponibilidade do livro".
- Usar sugestões do GitHub Copilot para ajudar a implementar o código com mais rapidez e precisão.
- Sincronizar as atualizações de código com o branch de "disponibilidade do livro" do seu repositório remoto.
Criar uma solicitação de pull para mesclar suas alterações no branch principal do repositório.
Criar um novo branch no repositório
Antes de começar a desenvolver o novo recurso de "disponibilidade do livro", você precisa criar um novo branch no repositório. Isso permitirá que você trabalhe no novo recurso sem afetar o branch principal do repositório. Você pode mesclar o novo recurso no branch principal quando estiver pronto.
Use as seguintes etapas para concluir esta seção do exercício:
Certifique-se de que você esteja com a solução AccelerateDevGitHubCopilot aberta no Visual Studio Code.
Selecione o modo de exibição Controle do Código-Fonte e certifique-se de que o repositório local esteja sincronizado com o repositório remoto (Pull ou Sincronização).
No canto inferior esquerdo da janela, selecione principal.
Para criar uma nova ramificação, digite book availability e selecione + Create new branch.
Para enviar o novo branch por push para o repositório remoto, selecione Publicar Branch.
Desenvolver um recurso que permita que um bibliotecário determine o status de disponibilidade de um livro
Nesta seção do exercício, você vai usar o GitHub Copilot como uma ajuda para implementar um novo recurso do aplicativo de biblioteca. Seu novo recurso permite que um bibliotecário determine o status de disponibilidade de um livro.
O recurso de disponibilidade do livro deve incluir as seguintes atualizações de código:
- Adicionar uma nova ação
SearchBooksaCommonActions. - Atualizar o método
WriteInputOptionsem ConsoleApp.cs. Adicionar suporte para a nova opçãoCommonActions.SearchBooks. Mostrar a opção para verificar se um livro está disponível para empréstimo. - Atualizar o método
ReadInputOptionsem ConsoleApp.cs. Adicionar suporte para a nova opçãoCommonActions.SearchBooks. - Atualizar o método
PatronDetailsem ConsoleApp.cs. AdicionarCommonActions.SearchBooksaoptionsantes de chamarReadInputOptions. Adicionar umelse ifpara se encarregar da açãoSearchBooks. O blocoelse ifdeverá chamar um novo método chamadoSearchBooks. - Criar um novo método
SearchBooksem ConsoleApp.cs. O métodoSearchBooksdeverá ler um título de livro fornecido pelo usuário. Verificar se um livro está disponível para empréstimo e mostrar uma mensagem informando que "book.titleestá disponível para empréstimo" ou "book.titleestá emprestado para outro leitor. A data-limite da devolução éloan.DueDate".
Use as seguintes etapas para concluir esta seção do exercício:
Abra a exibição do GERENCIADOR DE SOLUÇÕES.
Abra o arquivo CommonActions.cs e, a seguir, selecione a enumeração
CommonActions.Você precisa adicionar uma nova ação
SearchBooksaCommonActions.Abra o chat embutido e insira o seguinte prompt:
Update selection to include a new `SearchBooks` action.O GitHub Copilot deverá sugerir uma atualização de código que adicione a nova ação
SearchBooksà enumeraçãoCommonActions.Reveja a atualização sugerida e, a seguir, selecione Aceitar.
public enum CommonActions { Repeat = 0, Select = 1, Quit = 2, SearchPatrons = 4, RenewPatronMembership = 8, ReturnLoanedBook = 16, ExtendLoanedBook = 32, SearchBooks = 64 }Abra o arquivo ConsoleApp.cs.
Localize e, em seguida, selecione o método
WriteInputOptions.Você precisa adicionar suporte para a nova opção
CommonActions.SearchBooks. Mostrar a opção para verificar se um livro está disponível para empréstimo.Abra o chat embutido e insira o seguinte prompt:
Update selection to include an option for the `CommonActions.SearchBooks` action. Use the letter "b" and the message "to check for book availability".O GitHub Copilot deverá sugerir uma atualização de código que adicione um novo bloco
ifpara a açãoSearchBooks.Reveja a atualização sugerida e, a seguir, selecione Aceitar.
A atualização sugerida deve ser semelhante ao seguinte trecho de código:
static void WriteInputOptions(CommonActions options) { Console.WriteLine("Input Options:"); if (options.HasFlag(CommonActions.ReturnLoanedBook)) { Console.WriteLine(" - \"r\" to mark as returned"); } if (options.HasFlag(CommonActions.ExtendLoanedBook)) { Console.WriteLine(" - \"e\" to extend the book loan"); } if (options.HasFlag(CommonActions.RenewPatronMembership)) { Console.WriteLine(" - \"m\" to extend patron's membership"); } if (options.HasFlag(CommonActions.SearchPatrons)) { Console.WriteLine(" - \"s\" for new search"); } if (options.HasFlag(CommonActions.SearchBooks)) { Console.WriteLine(" - \"b\" to check for book availability"); } if (options.HasFlag(CommonActions.Quit)) { Console.WriteLine(" - \"q\" to quit"); } if (options.HasFlag(CommonActions.Select)) { Console.WriteLine("Or type a number to select a list item."); } }Role levemente para cima para localizar e, a seguir, selecionar o método
ReadInputOptions.Você precisa adicionar suporte para a nova opção
CommonActions.SearchBooks. Inclua um caso que envolva o usuário selecionando a açãoSearchBooks.Abra o chat embutido e insira o seguinte prompt:
Update selection to include an option for the `CommonActions.SearchBooks` action.O GitHub Copilot deverá sugerir uma atualização de código que adicione um novo
caseenvolvendo o usuário que está selecionando a açãoSearchBooks.Reveja a atualização sugerida e, a seguir, selecione Aceitar.
A atualização sugerida deve ser semelhante ao seguinte trecho de código:
static CommonActions ReadInputOptions(CommonActions options, out int optionNumber) { CommonActions action; optionNumber = 0; do { Console.WriteLine(); WriteInputOptions(options); string? userInput = Console.ReadLine(); action = userInput switch { "q" when options.HasFlag(CommonActions.Quit) => CommonActions.Quit, "s" when options.HasFlag(CommonActions.SearchPatrons) => CommonActions.SearchPatrons, "m" when options.HasFlag(CommonActions.RenewPatronMembership) => CommonActions.RenewPatronMembership, "e" when options.HasFlag(CommonActions.ExtendLoanedBook) => CommonActions.ExtendLoanedBook, "r" when options.HasFlag(CommonActions.ReturnLoanedBook) => CommonActions.ReturnLoanedBook, "b" when options.HasFlag(CommonActions.SearchBooks) => CommonActions.SearchBooks, _ when int.TryParse(userInput, out optionNumber) => CommonActions.Select, _ => CommonActions.Repeat }; if (action == CommonActions.Repeat) { Console.WriteLine("Invalid input. Please try again."); } } while (action == CommonActions.Repeat); return action; }Role para baixo para localizar e, a seguir, selecionar o método
PatronDetails.Existem duas coisas que você precisa fazer:
- Precisa adicionar
CommonActions.SearchBooksaoptionsantes de chamarReadInputOptions. - Também precisa adicionar um
else ifpara se encarregar da açãoSearchBooks. O blocoelse ifdeverá chamar um novo método chamadoSearchBooks.
Você pode abordar essas duas coisas juntas.
- Precisa adicionar
Abra o chat embutido e insira o seguinte prompt:
Update selection to add `CommonActions.SearchBooks` to `options` before calling `ReadInputOptions`. Add an `else if` block to handle the `SearchBooks` action. The `else if` block should call a new method named `SearchBooks`.O GitHub Copilot deverá sugerir uma atualização de código que adicione
CommonActions.SearchBooksaoptionsantes de chamarReadInputOptions.Reveja a atualização sugerida e, a seguir, selecione Aceitar.
async Task<ConsoleState> PatronDetails() { Console.WriteLine($"Name: {selectedPatronDetails.Name}"); Console.WriteLine($"Membership Expiration: {selectedPatronDetails.MembershipEnd}"); Console.WriteLine(); Console.WriteLine("Book Loans:"); int loanNumber = 1; foreach (Loan loan in selectedPatronDetails.Loans) { Console.WriteLine($"{loanNumber}) {loan.BookItem!.Book!.Title} - Due: {loan.DueDate} - Returned: {(loan.ReturnDate != null).ToString()}"); loanNumber++; } CommonActions options = CommonActions.SearchPatrons | CommonActions.Quit | CommonActions.Select | CommonActions.RenewPatronMembership | CommonActions.SearchBooks; CommonActions action = ReadInputOptions(options, out int selectedLoanNumber); if (action == CommonActions.Select) { if (selectedLoanNumber >= 1 && selectedLoanNumber <= selectedPatronDetails.Loans.Count()) { var selectedLoan = selectedPatronDetails.Loans.ElementAt(selectedLoanNumber - 1); selectedLoanDetails = selectedPatronDetails.Loans.Where(l => l.Id == selectedLoan.Id).Single(); return ConsoleState.LoanDetails; } else { Console.WriteLine("Invalid book loan number. Please try again."); return ConsoleState.PatronDetails; } } else if (action == CommonActions.Quit) { return ConsoleState.Quit; } else if (action == CommonActions.SearchPatrons) { return ConsoleState.PatronSearch; } else if (action == CommonActions.RenewPatronMembership) { var status = await _patronService.RenewMembership(selectedPatronDetails.Id); Console.WriteLine(EnumHelper.GetDescription(status)); // reloading after renewing membership selectedPatronDetails = (await _patronRepository.GetPatron(selectedPatronDetails.Id))!; return ConsoleState.PatronDetails; } else if (action == CommonActions.SearchBooks) { return await SearchBooks(); } throw new InvalidOperationException("An input option is not handled."); }Observação
As sugestões do chat embutido talvez também possam criar um stub para o método
SearchBooks.Reserve um minuto para refletir sobre os requisitos do processo para o método
SearchBooks.O que o método precisa fazer? O que ele deverá retornar? Isso requer algum parâmetro?
O método
SearchBooksdeve implementar o seguinte processo:Solicitar ao usuário um título de livro.
Ler o título do livro fornecido pelo usuário.
Verificar se um livro está disponível para empréstimo
Exibir uma mensagem informando uma das seguintes opções:
- "
book.titleestá disponível para empréstimo" - "
book.titleestá emprestado para outro leitor. A data-limite da devolução éloan.DueDate".
- "
Para criar as opções de mensagem, seu código precisará acessar os seguintes arquivos JSON:
-
Books.jsoné necessário para encontrar oTitlee aBookIdcorrespondentes. -
Loans.jsoné necessário para encontrar aReturnDatee aDueDatepara oBookItemIdcorrespondente. OBookItemIdé igual aoBookIdnoBooks.json.
Certifique-se de que você tenha o seguinte método
SearchBookscriado no arquivo ConsoleApp.cs:async Task<ConsoleState> SearchBooks() { return ConsoleState.PatronDetails; }Observação
Certifique-se de remover todos os comentários de código criados pelo GitHub Copilot. Os comentários desnecessários e incorretos podem influenciar as sugestões do GitHub Copilot negativamente.
Selecione o método
SearchBooks.Abra o chat embutido e insira o seguinte prompt:
Update selection to obtain a book title. Prompt the user to "Enter a book title to search for". Read the user input and ensure the book title isn't null.O GitHub Copilot deverá sugerir uma atualização de código que capture o título do livro fornecido pelo usuário.
Reveja a atualização sugerida e, a seguir, selecione Aceitar.
async Task<ConsoleState> SearchBooks() { string? bookTitle = null; while (String.IsNullOrWhiteSpace(bookTitle)) { Console.Write("Enter a book title to search for: "); bookTitle = Console.ReadLine(); } // Perform book search logic here return ConsoleState.PatronDetails; }Selecione o método
SearchBooks.Observação
O GitHub Copilot pode criar um método separado para lidar com a entrada do usuário de um título de livro. Você pode continuar a desenvolver a lógica primária no método
SearchBooks.Abra o modo de exibição de chat.
Adicione os seguintes arquivos ao contexto de chat: ConsoleApp.cs, JsonData.cs, JsonLoanRepository.cs, Books.json, Loans.json e BookItems.json.
Digite a seguinte solicitação:
@workspace Explain how to update the `SearchBooks` method and ConsoleApps class to find a matching book title in the `Books.json` file. Use the user supplied book title to find a matching book. If a book is found, use Loans.json to check if the book is available for loan. If the book has been returned, display a message stating "`book.title` is available for loan". If the book is on loan, display a message stating "`book.title` is on loan to another patron. The return due date is `loan.DueDate`".Reserve um minuto para rever as atualizações sugeridas.
O GitHub Copilot deve propor atualizações semelhantes às seguintes sugestões:
Para atualizar o método
SearchBookse a classeConsoleApppara encontrar um título de livro correspondente no arquivoBooks.jsone verificar se o livro está disponível para empréstimo, siga estas etapas:a. Adicione um método para pesquisar livros por título na classe
JsonData. b. Atualize o métodoSearchBooksna classeConsoleApppara usar esse novo método. c. Verifique o status do empréstimo do livro e exiba a mensagem apropriada.Aqui está o código atualizado:
Etapa 1: Adicionar um método para pesquisar livros por título na classe JsonData
public class JsonData { // Existing code... public Book? SearchBookByTitle(string title) { return Books?.FirstOrDefault(b => b.Title.Equals(title, StringComparison.OrdinalIgnoreCase)); } }Etapa 2: Atualizar o método SearchBooks na classe ConsoleApp
public class ConsoleApp { // Existing fields... JsonData _jsonData; public ConsoleApp(ILoanService loanService, IPatronService patronService, IPatronRepository patronRepository, ILoanRepository loanRepository, JsonData jsonData) { _patronRepository = patronRepository; _loanRepository = loanRepository; _loanService = loanService; _patronService = patronService; _jsonData = jsonData; } // Existing methods... async Task<ConsoleState> SearchBooks() { string bookTitle = ReadBookTitle(); Book? book = _jsonData.SearchBookByTitle(bookTitle); if (book == null) { Console.WriteLine($"No book found with title: {bookTitle}"); return ConsoleState.PatronDetails; } Loan? loan = _jsonData.Loans?.FirstOrDefault(l => l.BookItemId == book.Id && l.ReturnDate == null); if (loan == null) { Console.WriteLine($"{book.Title} is available for loan."); } else { Console.WriteLine($"{book.Title} is on loan to another patron. The return due date is {loan.DueDate}."); } return ConsoleState.PatronDetails; } // Existing methods... }Etapa 3: Atualizar o Program.cs para passar JsonData para ConsoleApp
using Microsoft.Extensions.DependencyInjection; using Library.Infrastructure.Data; using Library.ApplicationCore; using Microsoft.Extensions.Configuration; var services = new ServiceCollection(); var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appSettings.json") .Build(); services.AddSingleton<IConfiguration>(configuration); services.AddScoped<IPatronRepository, JsonPatronRepository>(); services.AddScoped<ILoanRepository, JsonLoanRepository>(); services.AddScoped<ILoanService, LoanService>(); services.AddScoped<IPatronService, PatronService>(); services.AddSingleton<JsonData>(); services.AddSingleton<ConsoleApp>(); var servicesProvider = services.BuildServiceProvider(); var consoleApp = servicesProvider.GetRequiredService<ConsoleApp>(); consoleApp.Run().Wait();Com essas alterações, o método
SearchBooksna classeConsoleAppagora procurará um livro por título no arquivoBooks.jsone verificará seu status de empréstimo no arquivoLoans.json. Se o livro estiver disponível para empréstimo, ele exibirá uma mensagem informando que o livro está disponível. Se o livro estiver emprestado, ele exibirá uma mensagem informando que o livro está emprestado e fornecerá a data da devolução.Adicione o método sugerido ao final da classe
JsonData.public Book? SearchBookByTitle(string title) { return Books?.FirstOrDefault(b => b.Title.Equals(title, StringComparison.OrdinalIgnoreCase)); }Atualize o arquivo Program.cs usando as atualizações sugeridas.
using Microsoft.Extensions.DependencyInjection; using Library.Infrastructure.Data; using Library.ApplicationCore; using Microsoft.Extensions.Configuration; var services = new ServiceCollection(); var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appSettings.json") .Build(); services.AddSingleton<IConfiguration>(configuration); services.AddScoped<IPatronRepository, JsonPatronRepository>(); services.AddScoped<ILoanRepository, JsonLoanRepository>(); services.AddScoped<ILoanService, LoanService>(); services.AddScoped<IPatronService, PatronService>(); services.AddSingleton<JsonData>(); services.AddSingleton<ConsoleApp>(); var servicesProvider = services.BuildServiceProvider(); var consoleApp = servicesProvider.GetRequiredService<ConsoleApp>(); consoleApp.Run().Wait();Adicione a declaração de campo
JsonData _jsonData;à classeConsoleAppantes do construtor da classe.Adicione um parâmetro
JsonData jsonDataao construtor da classeConsoleAppe use-o para inicializar o campo_jsonDatadentro do construtor.O construtor da classe atualizado deve se parecer com o seguinte trecho de código:
public ConsoleApp(ILoanService loanService, IPatronService patronService, IPatronRepository patronRepository, ILoanRepository loanRepository, JsonData jsonData) { _patronRepository = patronRepository; _loanRepository = loanRepository; _loanService = loanService; _patronService = patronService; _jsonData = jsonData; }Observe que JsonData não é reconhecido na classe
ConsoleApp.Você precisará adicionar
using Library.Infrastructure.Data;à parte superior do arquivoConsoleApp.cs.Verifique se a instrução
using Library.Infrastructure.Data;é adicionada à parte superior do arquivoConsoleApp.cs.Use as sugestões de código para atualizar o método
SearchBooks:O código sugerido deve usar uma consulta LINQ para pesquisar o livro por título. Se o livro for encontrado, outra consulta LINQ será usada para determinar se o livro está emprestado. O código também inclui uma lógica para exibir o status de disponibilidade do livro com base nos resultados da pesquisa. A lógica usada para exibir mensagens de resposta pode ser implementada de várias maneiras. Um exemplo é fornecido no trecho de código abaixo.
O trecho de código a seguir mostra uma possível implementação do método
SearchBooks:async Task<ConsoleState> SearchBooks() { string bookTitle = ReadBookTitle(); Book? book = _jsonData.SearchBookByTitle(bookTitle); if (book == null) { Console.WriteLine($"No book found with title: {bookTitle}"); return ConsoleState.PatronDetails; } Loan? loan = _jsonData.Loans?.FirstOrDefault(l => l.BookItemId == book.Id && l.ReturnDate == null); if (loan == null) { Console.WriteLine($"{book.Title} is available for loan."); } else { Console.WriteLine($"{book.Title} is on loan to another patron. The return due date is {loan.DueDate}."); } return ConsoleState.PatronDetails; }Selecione o método
SearchBooks.Abra o modo de exibição de Chat e, em seguida, insira o seguinte prompt:
Explain the LINQ queries and the evaluation of the book's availability status.Reserve um minuto para rever as explicações fornecidas pelo GitHub Copilot.
Para a consulta que verifica se o livro está emprestado, você deve ver uma descrição semelhante à seguinte explicação:
**Search for the Loan Status of the Book**Loan? loan = _jsonData.Loans?.FirstOrDefault(l => l.BookItemId == book.Id && l.ReturnDate == null);- _jsonData.Loans: Accesses the list of loans from the JsonData class. - ?.: The null-conditional operator ensures that if _jsonData.Loans is null, the entire expression will return null without throwing a NullReferenceException. - FirstOrDefault: A LINQ method that returns the first element in the collection that matches the specified condition, or null if no such element is found. - Lambda Expression: l => l.BookItemId == book.Id && l.ReturnDate == null - l.BookItemId == book.Id: Checks if the BookItemId of the loan matches the Id of the book being searched. - l.ReturnDate == null: Checks if the loan's ReturnDate is null, indicating that the book is currently on loan and has not been returned. - Result: If a matching loan is found, it is assigned to the loan variable. If no matching loan is found, loan is null. **Evaluation of the Book's Availability Status** After executing the LINQ queries, the method evaluates the availability status of the book: - If `loan` is `null`, the book has been returned. The method prints that the book is available for loan. - If `loan` is not `null`, the book is currently on loan (no return date). The method prints that the book is on loan and provides the date when the book should be returned.Verifique a lógica implementada pela consulta Verificar se o Livro está Emprestado.
Operador Condicional Nulo: O operador
?.é um operador condicional nulo e garante que, se_jsonData.Loansfornull, a expressão inteira será avaliada comonullsem gerar umaNullReferenceException.Expressão Lambda: A expressão lambda
l => l.BookItemId == book.Id && l.ReturnDate == nulldefine a condição do métodoFirstOrDefaulte verifica cada objeto deloanlpara ver se seuBookItemIdcorresponde àIddo objetobooke se aReturnDateénull.Esse código tenta localizar o primeiro
loanna coleção_jsonData.Loans, onde oBookItemIdcorresponde àIddobookfornecido e aReturnDateénull. Se nenhumloancomo esse for encontrado ou se_jsonData.Loansfornull, oloanserá definido comonull.Observação
A maioria das bibliotecas modernas tem várias cópias do mesmo livro. Esse código pressupõe que haja apenas uma cópia de cada livro. Se a biblioteca tiver várias cópias do mesmo livro, o código precisará ser atualizado para lidar com vários empréstimos para o mesmo livro. Para os fins desse treinamento, estamos pressupondo que exista apenas uma cópia de cada livro e que a lógica fornecida seja suficiente.
Crie a solução para garantir que não haja nenhum erro.
Você verá mensagens de Aviso, mas não deverá haver nenhum erro.
Para criar a solução no modo de exibição Gerenciador de Soluções, clique com o botão direito do mouse em AccelerateDevGitHubCopilot e, a seguir, selecione Compilar.
Sincronizar suas alterações com o repositório remoto
Selecione o modo de exibição Controle do Código-Fonte.
Verifique se os arquivos atualizados estão listados em Alterações.
Use o GitHub Copilot para gerar uma mensagem para o Commit.
Para preparar e fazer o commit de suas alterações, selecione Commit e, a seguir, selecione Sim.
Faça a sincronização (ou Efetue Push) das alterações para o repositório remoto.
Verifique seu trabalho
Nesta seção do exercício, você irá executar as seguintes tarefas:
- Certificar-se de que o novo recurso determine corretamente o status de disponibilidade de um livro.
- Criar uma solicitação de pull para mesclar suas alterações no branch principal do repositório.
Certificar-se de que o novo recurso funcione conforme o esperado
Como você não tem testes automatizados, um teste manual pode ser usado para verificar se o novo recurso funciona conforme o esperado. O uso de uma fonte de dados que possa ser verificada é importante. Nesse caso, você usa os arquivos Books.json e Loans.json para verificar se o novo recurso reporta o status de disponibilidade de um livro corretamente.
Use as seguintes etapas para concluir esta seção do exercício:
Abra a exibição do Gerenciador de Soluções.
Para executar o aplicativo, clique com o botão direito do mouse em Library.Console, selecione Depurar e, em seguida, selecione Iniciar Nova Instância.
Quando solicitado a obter um nome de leitor, digite Um e, em seguida, pressione Enter.
Você deverá ver uma lista de leitores que correspondam à consulta da pesquisa.
No prompt "Opções de Entrada", digite 2 e, a seguir, pressione Enter.
Inserir 2 selecionará o segundo leitor da lista.
Você deverá ver o nome do leitor e o status de filiação seguidos dos detalhes do empréstimo do livro.
No prompt "Opções de Entrada", digite b e, a seguir, pressione Enter.
Inserir b seleciona a opção de pesquisar o status de disponibilidade de um livro.
Você deverá ver um prompt para inserir um título de livro.
Digite Livro 1 e pressione Enter.
Nos dados originais que você baixou, o Livro 1 está atualmente emprestado ao Leitor 49 e, portanto, não deve estar disponível.
Certifique-se de que o aplicativo esteja mostrando uma mensagem indicando que o livro está emprestado para outro leitor.
Certifique-se de que o Livro 9 foi devolvido pelo Leitor 1.
No exercício anterior, durante um teste do aplicativo Biblioteca, você fez com que o Leitor 1 devolvesse o Livro 9. Se o aplicativo mostrar que o Livro 9 não foi devolvido pelo Leitor 1, use as opções de entrada para selecionar e devolver o Livro 9 antes de prosseguir.
Observação
O arquivo
Library.Console.csprojgarante que os arquivos de dados JSON sejam copiados para o diretório de saída quando o aplicativo for compilado. No entanto, executar as operações Limpar ou Reconstruir irá, essencialmente, redefinir os dados. As operações repetidas Compilar não redefinem os dados no diretório de saída (/bin/Debug/net8.0/).No prompt "Opções de Entrada", digite b e, a seguir, pressione Enter.
Digite Livro 9 e pressione Enter.
Certifique-se de que o aplicativo mostre uma mensagem indicando que o livro está disponível para empréstimo.
No prompt "Opções de Entrada", digite q e, a seguir, pressione Enter.
Interrompa a sessão de depuração.
Abra o arquivo
Loans.json.O arquivo
Loans.jsoné usado para acompanhar o status do empréstimo de cada livro. Você pode usar o arquivoLoans.jsonpara verificar se os status de disponibilidade do Livro 1 e do Livro 9 estão corretos.O arquivo
Loans.jsonatualizado deve estar localizado na pastaLibrary.Console\bin\Debug\net8.0\Jsonou na pastaLibrary.Console\Json.Se você estiver usando o depurador do Visual Studio Code para executar o aplicativo, o arquivo
Loans.jsonatualizado deverá estar localizado na pastaLibrary.Console\bin\Debug\net8.0\Json.Se você estiver usando um comando
dotnet runa partir da pastaAccelerateDevGitHubCopilot\src\Library.Console>para executar o aplicativo, o arquivoLoans.jsonatualizado deverá estar localizado na pastaLibrary.Console\Json.
Certifique-se de que tanto a ID de empréstimo 37 quanto a ID de empréstimo 46 se destinem ao Livro 1 (
"BookItemId": 1).- A ID de empréstimo 37 deverá ter um valor
ReturnDate(2024-01-17) - A ID de empréstimo 46 não deverá ter um valor
ReturnDate. O valorReturnDatedeverá sernull.
O valor
ReturnDateé usado para determinar se o livro está emprestado atualmente. Se o valorReturnDatefornull, o livro será considerado como estando emprestado.- A ID de empréstimo 37 deverá ter um valor
Certifique-se de que a ID de empréstimo 22 se destine ao Livro 9 (
"BookItemId": 9) e de que o valorReturnDateesteja definido como a data de hoje.Se você estiver executando no depurador e tiver limpado a solução após fazer alterações no arquivo
Loans.json, essas alterações serão perdidas. Após você limpar a solução, o arquivoLoans.jsonserá redefinido para os dados originais da próxima vez que você executar o aplicativo. Você pode atualizar o arquivoLoans.jsonmanualmente para testar o status de disponibilidade do Livro 1 e do Livro 9.
Criar uma solicitação de pull para mesclar suas alterações no branch principal
Você concluiu o novo recurso que permite que um bibliotecário determine o status de disponibilidade de um livro. Agora, você precisa mesclar suas alterações no branch principal do repositório. Você pode criar uma solicitação de pull para mesclar suas alterações no branch principal.
Use as seguintes etapas para concluir esta seção do exercício:
Abra seu repositório do GitHub no seu navegador da web.
Abra a guia Solicitações de pull.
Selecione Nova solicitação de pull.
Em Comparar alterações, certifique-se de que a base esteja configurada para o branch principal.
Certifique-se de que comparar esteja configurado para o branch disponibilidade de livros.
Após você configurar os branches, uma comparação das alterações entre o branch principal e o branch disponibilidade de livros será exibida. Você deve ver as alterações de cada um dos arquivos que você atualizou.
Selecione Criar solicitação de pull.
Digite um título e uma descrição para a solicitação de pull.
Você pode usar o seguinte título e descrição:
- Título: feat: Adicionar uma funcionalidade de pesquisa para livros no ConsoleApp
-
Descrição: Essa solicitação de pull adiciona um novo recurso que permite que um bibliotecário determine o status de disponibilidade de um livro. O recurso inclui uma nova ação
SearchBooksemCommonActions, atualiza para os métodosWriteInputOptions,ReadInputOptionsePatronDetailsnoConsoleAppe adiciona um novo métodoSearchBooksnoConsoleApp.
Observação
Os membros de uma empresa com uma assinatura do GitHub Copilot Enterprise podem usar o GitHub Copilot para gerar um resumo de uma solicitação de pull no site GitHub.com. Você pode usar o resumo para ajudar os revisores a entender suas alterações ou para entender rapidamente as alterações em uma solicitação de pull que você está revisando. Selecione GitHub Actions e, em seguida, selecione Resumo para gerar um resumo da pull request.
Aqui temos um exemplo de um resumo de solicitação de pull que foi gerado usando uma conta do GitHub Copilot Enterprise:
Certifique-se de que o título e a descrição reflitam as atualizações do seu código e, a seguir, selecione Criar uma solicitação de pull.
Aguarde a conclusão das verificações e, a seguir, certifique-se de que todas as verificações tenham sido aprovadas e de que não haja nenhum conflito com o branch base.
Pode levar um minuto para que as verificações sejam concluídas. Você precisa resolver todos os problemas identificados antes de mesclar as alterações no branch principal.
Para mesclar suas alterações no branch principal, selecione Mesclar solicitação de pull e, a seguir, selecione Confirmar mesclagem.
Observe que você pode excluir o branch
book-availabilityapós mesclar as alterações.Abra o Visual Studio Code.
Alterne para o branch principal do repositório.
Efetue pull das alterações a partir do repositório remoto.
Certifique-se de que as alterações que você fez no branch disponibilidade de livros agora estejam no branch principal.