Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

IntegrationToAPI

A Real flux of and integration between Legacy and externalAPI using Dependency Injection Container

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

🧩 IntegrationToAPI

IntegrationToAPI é um projeto em Delphi que demonstra o uso de injeção de dependência com o Spring4D, seguindo uma arquitetura limpa e modular.
O objetivo principal é receber um input, validá-lo e realizar uma integração REST para obter um serial (GUID), armazenando o resultado em um banco de dados em memória.

Disclaimer: Este projeto de teste é resultado de um projeto real colocado em produção numa aplicação híbrida Delphi 7-10.2; A funcionalidade integra um sistema em andamento a uma busca por numeração regulatória em uma API externa. Foi utilizado DI manual e devido ás praticas da app foi utilizado métodos de validação, Rest e Repository junto a classe de services. Porém, eu queria aplicar boas práticas e arquitetura moderna, então decidi criar este projeto estudo baseado na mesma necessidade.


🚀 Funcionalidades

  • ✅ Recebe um input e processa via handler
  • ✅ Valida a entrada antes de prosseguir
  • ✅ Realiza chamada REST para obter um serial (GUID)
  • ✅ Armazena o resultado em um repositório em memória
  • ✅ Utiliza injeção de dependência via Spring4D
  • ✅ Arquitetura modular com separação entre camadas (features, infra, etc.)
  • ✅ Testes unitários dedicados na pasta tests

🏗️ Estrutura do Projeto

A estrutura do projeto segue uma aboradagem vertical slices, facilitando a organização por recursos (features):

text
IntegrationToAPI/
│
├── src/
│ ├── features/
│ │ ├── GetSerial/
│ │ │ ├── GetSerial.Handler.pas
│ │ │ ├── GetSerial.Validation.pas
│ │ │ ├── GetSerial.Repository.pas
│ │ │ └── ...
│ │
│ ├── infra/
│ │ ├── Repository/
│ │ │ ├── GenericRepository.pas
│ │ │ └── InMemoryRepository.pas
│ │ └── ...
│ │
│ └── IntegrationToAPI.dpr
│
├── tests/
│ ├── GetSerialTests.pas
│ └── ...
│
├── boss.json
├── README.md
└── LICENSE

🧱 Arquitetura e Componentes Principais

🔹 GetSerial (Feature principal)

  • Handler: Responsável por orquestrar o fluxo — recebe o input, chama o validador e o repositório.
  • Validation: Executa as validações de entrada antes da chamada REST.
  • Repository: Implementa um repositório que é lazy loaded, ou seja, é criado apenas quando sua propriedade é acessada pela primeira vez.

🔹 Infra

  • Contém implementações genéricas e suporte de infraestrutura.
  • Inclui um repositório genérico em memória usado para simular persistência de dados.

💉 Injeção de Dependência

A injeção de dependência é feita com o Spring4D.
O container é configurado para resolver automaticamente as dependências entre as classes:

delphi
TGetSerialHandler = class
private
  FValidator: ISerialValidator;
  FRepository: Lazy<ISerialRepository>;
public
  constructor Create(aValidator: ISerialValidator; 
    aRepository: Lazy<ISerialRepository>;
    aLogger: ILogger);

  procedure Handle(const aInput: TInputSerial);
end;

* O validador e o reposit??rio s??o injetados no ctor (construtor).

* O reposit??rio ?? instanciado somente quando a propriedade ?? acessada.

???? Depend??ncias

O projeto depende das seguintes bibliotecas:

Spring4D
 ??? Inje????o de depend??ncia e containers IoC.
    https://bitbucket.org/sglienke/spring4d/src/master/

RestFluent
 ??? Biblioteca de requisi????es REST fluente.

GenericRepository
 ??? Implementa????o gen??rica de reposit??rios em mem??ria.

Essas depend??ncias podem ser instaladas facilmente via BOSS

boss install github.com/mak58/RestClient
boss install github.com/mak58/GenericRepositoryListMemory

Incluir os caminhos das libs no Delphi SearchPath;
..\..\Delphi-libs\spring4d\Source;
..\..\Delphi-libs\spring4d\Source\Base;
..\..\Delphi-libs\spring4d\Source\Base\Logging;
..\..\Delphi-libs\spring4d\Source\Base\Patches;
..\..\Delphi-libs\spring4d\Source\Base\Patterns;
..\..\Delphi-libs\spring4d\Source\Core\Container;
..\..\Delphi-libs\spring4d\Source\Core\Interception;
..\..\Delphi-libs\spring4d\Source\Core\Services;
..\..\Delphi-libs\spring4d\Source\Base\Collections;
..\..\Delphi-libs\RestClient\v12.1.2
..\..\Delphi-libs\GenericRepositoryListMemory

???? Testes

Os testes unit??rios est??o localizados na pasta tests/ e cobrem:

Valida????o de entrada

Cria????o e persist??ncia de serial

Integra????o entre handler, validador e reposit??rio

Execute os testes diretamente do Delphi Test Insight ou via DUnitX.

?????? Execu????o
Clone o reposit??rio:

git clone https://github.com/mak58/IntegrationToAPI.git
Abra o projeto no Delphi.

Compile e execute o projeto principal IntegrationToAPI.dpr.

Insira o input e acompanhe a integra????o REST retornando um GUID.

???? Refer??ncia

Livro Inje????o de depend??ncia com Delphi - Nick Hodges
https://leanpub.com/dependencyinjectionindelphi

???? Licen??a

Este projeto ?? licenciado sob a Apache License 2.0 ??? veja o arquivo LICENSE
 para mais detalhes.

??? Autor

Desenvolvido por Marcio Koehler

???? Contribui????es, sugest??es e PRs s??o bem-vindos!

UML

                                           +********************************************+
                                           |           TGetSerial  class                |
                                           |********************************************|
                                           | - FValidator: IValidateSerial              |
                                           | - FRepository: Lazy<ISerialRepository>     |
                                           | - FRestClient: TRestClient                 |
                                           |--------------------------------------------|
                                           | + Create(AValidator, ARepository)          |
                                           | + Handle(Input: string): void              |
                                           +********************************************+
                                                          |      ^
                                                          |      |
                                                          |      |
                                                          |      |
                                                          |      |  Lazy Injection
                                                          |      |
                                                          V      |
                                +********************************************+     
                                |          ISerialRepository (interface)     |     
                                |********************************************|     
                                | + Add(Serial: string): void                |     
                                | + GetAll(): TList<string>                  |     
                                +********************************************+     
                                                          ^
                                                          | Implements
                                                          |
                                                          |
                                +********************************************+
                                |        TInMemoryRepository class           |
                                |********************************************|
                                | - FData: TListObject<T>                     |
                                |--------------------------------------------|
                                | + Add(Serial: T): void               |
                                | + GetAll(): TListObject<T>                  |
                                +********************************************+

                                                          ^
                                                          |
                                                          | DI (ctor)
                                                          |
                                                          |
                                +********************************************+
                                |          TValidateSerial  class            |
                                |********************************************|
                                | Implements: IValidateSerial                |
                                |--------------------------------------------|
                                | + Validate(Input: string): Boolean         |
                                +********************************************+

                                                          ^
                                                          |
                                                          |  creates internally
                                                          |
                                                          |
                                +********************************************+
                                |             TRestClient  class             |
                                |********************************************|
                                | + MapGet(): TResult                      |
                                |--------------------------------------------|
                                | Custom class (not injected by DI)          |
                                +********************************************+

Input ??????> TGetSerial ??????> TValidateSerial ??????> (valida????o ok?)
                                  ???
                                  ?????????> TRestClient ??????> GUID ??????> Lazy<ISerialRepository>.Save()