Exercício - Registar e consumir serviços

Concluído

ASP.NET aplicativos principais 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 interno para gerenciar os serviços que um aplicativo usa.

Sua equipe lidera tarefas para criar um site barebones 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 em componentes que precisam dele.

Criar uma aplicação 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 C# Dev Kit no Visual Studio Code.

  1. Abra o Visual Studio Code.

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

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

  4. Procure e selecione ASP.NET Core Empty.

    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 Solution Explorer painel para exibir os arquivos do projeto.

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

Executar a aplicação

Teste o aplicativo para garantir que ele seja executado.

  1. No Visual Studio Code, pressione F5 para criar 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.

    Este 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 pare o aplicativo pressionando Shift+F5 no Visual Studio Code.

Criar um serviço

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

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

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

  3. Substitua o conteúdo do 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 WelcomeService classe com um GetWelcomeMessage método 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 _serviceCreated campos e _serviceId são definidos no construtor e nunca mudam durante o tempo de vida da instância de serviço.

Registar o serviço

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

  1. Abra o arquivo Program.cs .

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

    using MyWebApp.Services;
    

    Esta diretiva resolve a referência à WelcomeService classe.

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

    builder.Services.AddSingleton<WelcomeService>();
    

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

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

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

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

    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();
    

Testar as alterações

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

Usar 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 Explorer . Selecione Nova pasta. Nomeie a pasta Interfaces.

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

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

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

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

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

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

    using MyWebApp.Interfaces;
    

    Esta diretiva resolve a referência à interface adicionada IWelcomeService na próxima etapa.

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

    public class WelcomeService : IWelcomeService
    

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

  7. Abra o arquivo Program.cs .

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

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

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

    Gorjeta

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

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

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

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

    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();
    

Testar as alterações

Vamos testar o aplicativo para garantir que ele ainda funcione conforme o esperado.

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