# guilhermebarbarino/pattern-strategy-calculo-frete architecture

> Architecture diagram of the GitHub repository guilhermebarbarino/pattern-strategy-calculo-frete, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/guilhermebarbarino/pattern-strategy-calculo-frete
- Repository: https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete

## Overview

Aplicação de console para cotação de frete: o usuário informa CEPs, peso, distância e modalidade; o sistema valida os CEPs, consulta os endereços e calcula a cotação usando uma estratégia adequada. O README documenta as três modalidades e o padrão Strategy; o código amostrado confirma a orquestração, consulta ViaCEP com cache e estratégias registradas por DI. A implementação de algumas estratégias e do formatador não foi amostrada; seus caminhos vêm da árvore, então suas ligações detalhadas foram omitidas.

Main entry points: [`CalculoFrete.ConsoleApp/Program.cs`](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/Program.cs) (Inicialização DI), [`CalculoFrete.Aplicacao/Services/ServicoCalculoFreteComEndereco.cs`](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Services/ServicoCalculoFreteComEndereco.cs) (Cálculo com endereço), [`CalculoFrete.Aplicacao/Services/ServicoCalculoFrete.cs`](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Services/ServicoCalculoFrete.cs) (Seleção de estratégia), [`CalculoFrete.ConsoleApp/IU/MenuConsole.cs`](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/MenuConsole.cs) (Menu console)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_console["Interface console"]
  node_program["Inicialização DI<br/>[Program.cs]"]
  node_menu["Menu console<br/>[MenuConsole.cs]"]
  node_reader["Leitor console<br/>[LeitorConsole.cs]"]
  node_formatter["Formatador console"]
end

subgraph group_app["Aplicação"]
  node_fullservice["Cálculo com endereço"]
  node_freightservice["Seleção de estratégia"]
  node_readercontract["Contrato de leitura<br/>[ILeitorConsole.cs]"]
  node_formattercontract["Contrato de formatação"]
end

subgraph group_domain["Domínio"]
  node_request["Solicitação de frete"]
  node_result["Resultado da cotação"]
  node_quote["Cotação de frete<br/>[CotacaoFrete.cs]"]
  node_address["Endereço CEP<br/>[EnderecoCep.cs]"]
  node_strategycontract["Contrato de estratégia"]
  node_cepcontract["Contrato de consulta CEP<br/>[IConsultaCep.cs]"]
  node_validationerror["Erro de validação"]
end

subgraph group_infra["Infraestrutura"]
  node_storestrategy["Retirada na loja"]
  node_expressstrategy["Frete expresso"]
  node_economystrategy["Frete econômico"]
  node_viacepclient["Cliente ViaCEP<br/>[ClienteViaCep.cs]"]
  node_cache["Cache CEP memória"]
end

node_user(("Usuário"))
node_viacep["Serviço ViaCEP"]

node_program -->|"inicia"| node_menu
node_program -->|"registra"| node_freightservice
node_program -->|"registra"| node_fullservice
node_program -->|"registra"| node_storestrategy
node_program -->|"registra"| node_expressstrategy
node_program -->|"registra"| node_economystrategy
node_program -->|"registra cliente"| node_viacepclient
node_program -->|"registra cache"| node_cache
node_program -->|"registra"| node_reader
node_program -->|"registra"| node_formatter
node_menu -->|"solicita entrada"| node_reader
node_user -->|"informa dados"| node_reader
node_reader -->|"cria solicitação"| node_request
node_menu -->|"envia solicitação"| node_fullservice
node_fullservice -->|"consulta CEP"| node_cepcontract
node_fullservice -->|"solicita cálculo"| node_freightservice
node_fullservice -->|"monta resultado"| node_result
node_fullservice -->|"lança validação"| node_validationerror
node_freightservice -->|"avalia estratégias"| node_strategycontract
node_freightservice -->|"invoca estratégia"| node_storestrategy
node_freightservice -->|"invoca estratégia"| node_expressstrategy
node_freightservice -->|"invoca estratégia"| node_economystrategy
node_freightservice -->|"retorna cotação"| node_quote
node_viacepclient -->|"lê e grava"| node_cache
node_viacepclient -.->|"consulta endereço"| node_viacep
node_viacepclient -->|"cria endereço"| node_address
node_fullservice -->|"retorna resultado"| node_menu
node_menu -->|"formata resultado"| node_formatter
node_menu -->|"exibe cotação"| node_user

click node_program "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/Program.cs"
click node_menu "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/MenuConsole.cs"
click node_reader "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/LeitorConsole.cs"
click node_formatter "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/FormatadorConsole.cs"
click node_fullservice "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Services/ServicoCalculoFreteComEndereco.cs"
click node_freightservice "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Services/ServicoCalculoFrete.cs"
click node_readercontract "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Interfaces/ILeitorConsole.cs"
click node_formattercontract "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Interfaces/IFormatadorConsole.cs"
click node_request "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/SolicitacaoFrete.cs"
click node_result "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/ResultadoCalculoFrete.cs"
click node_quote "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/CotacaoFrete.cs"
click node_address "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/EnderecoCep.cs"
click node_strategycontract "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Interfaces/IEstrategiaCalculoFrete.cs"
click node_cepcontract "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Interfaces/IConsultaCep.cs"
click node_validationerror "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Erros/ErroValidacaoFrete.cs"
click node_storestrategy "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Strategy/EstrategiaRetiradaNaLoja.cs"
click node_expressstrategy "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Strategy/EstrategiaFreteExpresso.cs"
click node_economystrategy "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Strategy/EstrategiaFreteEconomico.cs"
click node_viacepclient "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Client/APi/ClienteViaCep.cs"
click node_cache "https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Cache/CacheCepInMemory.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_program,node_menu,node_reader,node_formatter toneBlue
class node_fullservice,node_freightservice,node_readercontract,node_formattercontract toneAmber
class node_request,node_result,node_quote,node_address,node_strategycontract,node_cepcontract,node_validationerror toneMint
class node_storestrategy,node_expressstrategy,node_economystrategy,node_viacepclient,node_cache toneRose
class node_user,node_viacep toneIndigo
```

## Components

### Interface console

- [Inicialização DI](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/Program.cs): `CalculoFrete.ConsoleApp/Program.cs`
- [Menu console](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/MenuConsole.cs): `CalculoFrete.ConsoleApp/IU/MenuConsole.cs`
- [Leitor console](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/LeitorConsole.cs): `CalculoFrete.ConsoleApp/IU/LeitorConsole.cs`
- [Formatador console](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.ConsoleApp/IU/FormatadorConsole.cs): `CalculoFrete.ConsoleApp/IU/FormatadorConsole.cs`

### Aplicação

- [Cálculo com endereço](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Services/ServicoCalculoFreteComEndereco.cs): `CalculoFrete.Aplicacao/Services/ServicoCalculoFreteComEndereco.cs`
- [Seleção de estratégia](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Services/ServicoCalculoFrete.cs): `CalculoFrete.Aplicacao/Services/ServicoCalculoFrete.cs`
- [Contrato de leitura](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Interfaces/ILeitorConsole.cs): `CalculoFrete.Aplicacao/Interfaces/ILeitorConsole.cs`
- [Contrato de formatação](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Aplicacao/Interfaces/IFormatadorConsole.cs): `CalculoFrete.Aplicacao/Interfaces/IFormatadorConsole.cs`

### Domínio

- [Solicitação de frete](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/SolicitacaoFrete.cs): `CalculoFrete.Dominio/Models/SolicitacaoFrete.cs`
- [Resultado da cotação](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/ResultadoCalculoFrete.cs): `CalculoFrete.Dominio/Models/ResultadoCalculoFrete.cs`
- [Cotação de frete](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/CotacaoFrete.cs): `CalculoFrete.Dominio/Models/CotacaoFrete.cs`
- [Endereço CEP](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Models/EnderecoCep.cs): `CalculoFrete.Dominio/Models/EnderecoCep.cs`
- [Contrato de estratégia](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Interfaces/IEstrategiaCalculoFrete.cs): `CalculoFrete.Dominio/Interfaces/IEstrategiaCalculoFrete.cs`
- [Contrato de consulta CEP](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Interfaces/IConsultaCep.cs): `CalculoFrete.Dominio/Interfaces/IConsultaCep.cs`
- [Erro de validação](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Dominio/Erros/ErroValidacaoFrete.cs): `CalculoFrete.Dominio/Erros/ErroValidacaoFrete.cs`

### Infraestrutura

- [Retirada na loja](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Strategy/EstrategiaRetiradaNaLoja.cs): `CalculoFrete.Infra/Strategy/EstrategiaRetiradaNaLoja.cs`
- [Frete expresso](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Strategy/EstrategiaFreteExpresso.cs): `CalculoFrete.Infra/Strategy/EstrategiaFreteExpresso.cs`
- [Frete econômico](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Strategy/EstrategiaFreteEconomico.cs): `CalculoFrete.Infra/Strategy/EstrategiaFreteEconomico.cs`
- [Cliente ViaCEP](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Client/APi/ClienteViaCep.cs): `CalculoFrete.Infra/Client/APi/ClienteViaCep.cs`
- [Cache CEP memória](https://github.com/guilhermebarbarino/pattern-strategy-calculo-frete/blob/main/CalculoFrete.Infra/Cache/CacheCepInMemory.cs): `CalculoFrete.Infra/Cache/CacheCepInMemory.cs`

### Other components

- **Usuário**
- **Serviço ViaCEP**

## Connections

- Inicialização DI → Menu console: inicia
- Inicialização DI → Seleção de estratégia: registra
- Inicialização DI → Cálculo com endereço: registra
- Inicialização DI → Retirada na loja: registra
- Inicialização DI → Frete expresso: registra
- Inicialização DI → Frete econômico: registra
- Inicialização DI → Cliente ViaCEP: registra cliente
- Inicialização DI → Cache CEP memória: registra cache
- Inicialização DI → Leitor console: registra
- Inicialização DI → Formatador console: registra
- Menu console → Leitor console: solicita entrada
- Usuário → Leitor console: informa dados
- Leitor console → Solicitação de frete: cria solicitação
- Menu console → Cálculo com endereço: envia solicitação
- Cálculo com endereço → Contrato de consulta CEP: consulta CEP
- Cálculo com endereço → Seleção de estratégia: solicita cálculo
- Cálculo com endereço → Resultado da cotação: monta resultado
- Cálculo com endereço → Erro de validação: lança validação
- Seleção de estratégia → Contrato de estratégia: avalia estratégias
- Seleção de estratégia → Retirada na loja: invoca estratégia
- Seleção de estratégia → Frete expresso: invoca estratégia
- Seleção de estratégia → Frete econômico: invoca estratégia
- Seleção de estratégia → Cotação de frete: retorna cotação
- Cliente ViaCEP → Cache CEP memória: lê e grava
- Cliente ViaCEP → Serviço ViaCEP: consulta endereço
- Cliente ViaCEP → Endereço CEP: cria endereço
- Cálculo com endereço → Menu console: retorna resultado
- Menu console → Formatador console: formata resultado
- Menu console → Usuário: exibe cotação
