Para estruturar o consumo da API do Blazor Server pelos projetos Blazor WebAssembly (WASM) de forma limpa e escalável, a melhor estratégia é centralizar a lógica de dados. Como você gerencia múltiplos sites de clientes, duplicar o código de requisições HTTP em cada projeto geraria um pesadelo de manutenção.
Aqui está o passo a passo para arquitetar essa solução:
1. Criar uma Biblioteca de Classes Compartilhada (Shared Library)
Crie um projeto do tipo Razor Class Library (RCL) ou uma Class Library .NET Core padrão na mesma solução.
- Modelos Únicos: Coloque nesta biblioteca todas as classes DTO (Data Transfer Objects) que a API envia e que o Blazor WASM recebe.
- Interfaces de Serviços: Defina as regras de negócio em interfaces (ex:
IClientService,IProductService).
2. Implementar os Serviços Client-Side na Biblioteca
Dentro da mesma biblioteca compartilhada, crie a implementação dessas interfaces usando o
HttpClient.3. Configurar a Injeção de Dependência no Blazor WASM
Em cada um dos projetos Blazor WebAssembly dos seus clientes, adicione a referência para a biblioteca compartilhada. No arquivo
Program.cs de cada site WASM, configure o HttpClient apontando para a URL da sua API do Blazor Server:4. Habilitar o CORS no Blazor Server
Como os sites dos clientes (WASM) rodarão em domínios ou portas diferentes da sua API principal, o navegador bloqueará as requisições por padrão. No
Program.cs do seu Blazor Server (API), configure a política de CORS:5. Autenticação e Segurança (JWT)
Para garantir que um cliente não acesse os dados de outro:
- Implemente autenticação baseada em Tokens JWT na API do Blazor Server.
- No Blazor WASM, use um
DelegatingHandlercustomizado para anexar automaticamente o token JWT no cabeçalho de cada requisição HTTP. [1]
Para organizar seu código de forma limpa e evitar duplicação, você deve criar um novo projeto do tipo Class Library (.NET Standard ou .NET 8/9) dentro da sua solução. Vamos chamá-lo de
SeuProjeto.Shared.Aqui está a estrutura exata de onde cada arquivo deve ficar:
1. No Projeto Compartilhado (SeuProjeto.Shared)
Este projeto será referenciado tanto pela API (Blazor Server) quanto por todos os sites dos clientes (Blazor WASM).
- 📂 Pasta:
DTOs- O que fica aqui: As classes de transferência de dados (ex:
ClienteDto.cs,PedidoDto.cs,LoginRequest.cs). - Motivo: A API precisa saber o formato dos dados que vai enviar, e o WASM precisa saber o formato dos dados que vai receber.
- O que fica aqui: As classes de transferência de dados (ex:
- 📂 Pasta:
Interfaces- O que fica aqui: As interfaces dos contratos de serviço (ex:
IClienteService.cs,IProdutoService.cs). - Motivo: Permite que o Blazor WASM use a interface para fazer requisições HTTP, enquanto o Blazor Server pode usar a mesma interface para buscar dados diretamente do banco de dados (se você desejar).
- O que fica aqui: As interfaces dos contratos de serviço (ex:
- 📂 Pasta:
Services(Opcional, apenas os clients HTTP)- O que fica aqui: A implementação da lógica que faz o
HttpClient.GetFromJsonAsync(ex:ClienteHttpClientService.cs). - Motivo: Centraliza a escrita de código de requisição web. Nenhum projeto WASM precisará reescrever códigos de fetch do HTTP.
- O que fica aqui: A implementação da lógica que faz o
2. No Projeto Principal (SeuProjeto.Server / API)
Este projeto terá a referência de
SeuProjeto.Shared.- 📂 Pasta:
Controllers(ou Endpoints)- O que fica aqui: Seus controladores API (ex:
ClientesController.cs). Eles recebem as requisições HTTP do WASM, chamam a lógica do banco de dados e retornam os DTOs que estão na pasta compartilhada.
- O que fica aqui: Seus controladores API (ex:
- 📂 Pasta:
Services(Implementação de Banco)- O que fica aqui: A lógica real que consulta o banco de dados via Entity Framework (ex:
ClienteSqlService.cs).
- O que fica aqui: A lógica real que consulta o banco de dados via Entity Framework (ex:
3. Nos Projetos dos Clientes (SeuProjeto.ClientWasm1, SeuProjeto.ClientWasm2, etc.)
Estes projetos apenas consomem a estrutura pronta. Eles terão a referência de
SeuProjeto.Shared.- Não criam pastas de DTOs ou Interfaces.
- Arquivo
Program.cs: Você apenas registra a interface e o serviço que vieram do projeto compartilhado. - Nas páginas Razor: Você apenas injeta a interface.
Para te ajudar a dar o próximo passo na configuração, você prefere ver um exemplo prático de como criar o código da interface e do serviço HTTP que conecta os dois lados, ou quer focar primeiro em como configurar o arquivo
Program.cs do WASM para injetar essas dependências?
Comentários