Exercício - Cadastre-se e consuma serviços

Concluído

Os aplicativos ASP.NET Core geralmente precisam acessar os mesmos serviços em vários componentes. O ASP.NET Core usa um contêiner de injeção de dependência integrado para gerenciar os serviços que um aplicativo usa.

O líder da sua equipe lhe incumbe de criar um site básico para sua empresa. O site deve exibir uma mensagem de boas-vindas na página principal. Você decide criar um serviço para gerar a mensagem de boas-vindas. Em seguida, você registrará o serviço no contêiner de serviço para que ele possa ser injetado nos componentes que precisam dele.

Criar um aplicativo ASP.NET Core

Você precisa de um aplicativo ASP.NET Core para desempenhar o papel do aplicativo da sua equipe. Vamos criar um novo aplicativo ASP.NET Core usando a extensão Kit de Desenvolvimento em C# no Visual Studio Code.

  1. Inicie o Visual Studio Code.

  2. Pressione Ctrl+Shift+P para abrir a paleta de comandos.

  3. Pesquise e selecione .NET: Novo Projeto....

  4. Pesquise e selecione ASP.NET Núcleo Vazio.

    Uma captura de tela da paleta de comandos com ASP.NET Core Empty selecionado.

  5. Selecione ou crie uma pasta para o novo projeto.

  6. Nomeie o novo aplicativo MyWebApp.

  7. Selecione Criar projeto para criar o projeto.

  8. Quando o novo projeto for aberto, expanda o painel Solution Explorer para exibir os arquivo do projeto.

    Uma captura de tela do painel Gerenciador de Soluções no Visual Studio Code.

Executar o aplicativo

Teste o aplicativo para garantir que ele seja executado.

  1. No Visual Studio Code, pressione F5 para compilar e executar o aplicativo.

    1. Quando solicitado, selecione C# como o depurador.
    2. Quando solicitado, selecione C#: MyWebApp [Configuração Padrão] como a configuração de inicialização a ser usada.

    Esse comando inicia o aplicativo e o hospeda em um servidor Web local. Uma janela do navegador é aberta e exibe, “Olá, Mundo!”

  2. Feche a janela do navegador e interrompa o aplicativo pressionando Shift+F5 no Visual Studio Code.

Criar um serviço

Agora que você tem um aplicativo funcional, vamos criar um serviço que gere uma mensagem de boas-vindas para a página principal.

  1. Clique com o botão direito do mouse no projeto MyWebApp no painel Do Explorer . Selecione Nova Pasta. Nomeie a pasta Serviços.

  2. Clique com o botão direito do mouse na pasta Serviços . Selecione Novo Arquivo. Nomeie o arquivo WelcomeService.cs.

  3. Substitua o conteúdo de WelcomeService.cs pelo seguinte código:

    namespace MyWebApp.Services;
    
    public class WelcomeService : IWelcomeService
    {
    
        DateTime _serviceCreated;
        Guid _serviceId;
    
        public WelcomeService()
        {
            _serviceCreated = DateTime.Now;
            _serviceId = Guid.NewGuid();                
        }
    
        public string GetWelcomeMessage()
        {
            return $"Welcome to Contoso! The current time is {_serviceCreated}. This service instance has an ID of {_serviceId}";
        }
    }
    

    Esse código define uma classe WelcomeService com um método GetWelcomeMessage que gera uma mensagem de boas-vindas. A mensagem inclui a hora atual em que o serviço foi criado, bem como um identificador exclusivo para cada instância do serviço.

    Observe que os campos _serviceCreated e _serviceId são definidos no construtor e nunca mudam durante o tempo de vida da instância do serviço.

Registrar o serviço

Agora que você tem um serviço, precisa registrá-lo no contêiner de serviço.

  1. Abra o arquivo Program.cs .

  2. Adicione a seguinte diretiva para a parte superior do arquivo:

    using MyWebApp.Services;
    

    Essa diretiva resolve a referência à classe WelcomeService.

  3. Imediatamente após a linha var builder = WebApplication.CreateBuilder(args);, adicione o seguinte código:

    builder.Services.AddSingleton<WelcomeService>();
    

    WebApplication.CreateBuilder cria uma nova instância da classe WebApplicationBuilder chamada builder. O código anterior registra a classe WelcomeService com o contêiner de serviço com um tempo de vida singleton.

  4. Altere a linha app.MapGet("/", () => "Hello World!"); para o seguinte código:

    app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    

    Esse código mapeia uma solicitação HTTP GET para a URL raiz (/) para um delegado que retorna a mensagem de boas-vindas gerada pelo serviço WelcomeService.

    Seu arquivo Program.cs deve ter esta aparência:

    using MyWebApp.Services;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<WelcomeService>();
    
    var app = builder.Build();
    
    app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    
    app.Run();
    

Teste as mudanças

  1. Salve todas as alterações e execute o aplicativo como antes.
  2. Quando a janela do navegador abrir, observe que a URL raiz exibe a mensagem de boas-vindas gerada pelo serviço WelcomeService.
  3. Feche a janela do navegador e interrompa o aplicativo pressionando Shift+F5 no Visual Studio Code.

Use uma interface

Sua equipe analisa seu código e outro desenvolvedor sugere que você use uma interface para registrar serviços, pois essa abordagem torna o código mais flexível e fácil de manter.

  1. Clique com o botão direito do mouse no projeto MyWebApp no painel Do Explorer . Selecione Nova Pasta. Nomeie a pasta Interfaces.

  2. Clique com o botão direito do mouse na pasta Interfaces . Selecione Novo Arquivo. Nomeie o arquivo IWelcomeService.cs.

  3. Substitua o conteúdo de IWelcomeService.cs pelo seguinte código:

    namespace MyWebApp.Interfaces
    
    public interface IWelcomeService
    {
        string GetWelcomeMessage();
    }
    

    Esse código define uma interface IWelcomeService com um método GetWelcomeMessage. Todos os serviços que implementam essa interface devem fornecer uma implementação para o método GetWelcomeMessage.

  4. Abra o arquivo Serviços/WelcomeService.cs .

  5. Adicione a seguinte diretiva para a parte superior do arquivo:

    using MyWebApp.Interfaces;
    

    Essa diretiva resolve a referência à interface IWelcomeService que você adiciona na próxima etapa.

  6. Atualize a declaração da classe WelcomeService para implementar a interface IWelcomeService:

    public class WelcomeService : IWelcomeService
    

    Essa é a única alteração que você precisa fazer na WelcomeService classe para implementar a IWelcomeService interface. A classe WelcomeService já tem um método GetWelcomeMessage que corresponde à assinatura do método na interface IWelcomeService.

  7. Abra o arquivo Program.cs .

  8. Atualize a linha builder.Services.AddSingleton<WelcomeService>(); para o seguinte código:

    builder.Services.AddSingleton<IWelcomeService, WelcomeService>();
    

    Esse código registra a classe WelcomeService com o contêiner de serviço usando a interface IWelcomeService.

    Dica

    Pense nisso como se dissesse: "Quando um componente solicita um IWelcomeService, forneça uma instância de WelcomeService."

  9. Atualize a linha app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); para o seguinte código:

    app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    

    A função anônima agora espera um IWelcomeService em vez de um WelcomeService.

    Seu arquivo Program.cs deve ter esta aparência:

    using MyWebApp.Interfaces;
    using MyWebApp.Services;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<IWelcomeService, WelcomeService>();
    
    var app = builder.Build();
    
    app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    
    app.Run();
    

Teste as mudanças

Vamos testar o aplicativo para ter certeza de que ele ainda funciona conforme o esperado.

  1. Salve todas as alterações e execute o aplicativo como antes.
  2. Quando a janela do navegador abrir, observe que a URL raiz exibe a mensagem de boas-vindas gerada pelo serviço WelcomeService.
  3. Deixe o aplicativo em execução para o próximo exercício.