[PT-BR] Este documento contém as últimas novidades, breaking changes e novas features do Dext Framework. As atualizações mais recentes aparecem primeiro.
[EN] This document contains the latest news, breaking changes and new features of the Dext Framework. Most recent updates appear first.
A centralização definitiva da documentação e preparação para o lançamento v1.0!
The definitive documentation centralization and preparation for v1.0 release!
[PT-BR] Consolidamos toda a documentação fragmentada no Dext Book (EN/PT-BR). Agora existe uma fonte única de verdade para todos os módulos, com paridade técnica e exemplos atualizados. [EN] Consolidated all fragmented documentation into the Dext Book (EN/PT-BR). There is now a single source of truth for all modules, with technical parity and updated examples.
- 📚 Centralized Book - Migração total de arquivos soltos para uma estrutura de capítulos organizada (
Docs/BookeDocs/Book.pt-br). - 🗺️ Unified Roadmap - Novo roadmap consolidado refletindo as fases finais para a v1.0 estável.
- 🧹 Artifact Cleanup - Arquivamento de documentos de design e especificações antigas para a pasta
Docs/Archive.
[PT-BR] Ajustes finais em roteamento, injeção de dependência e performance do motor JSON para garantir estabilidade absoluta. [EN] Final adjustments in routing, dependency injection, and JSON engine performance to ensure absolute stability.
A new engine for collections, designed for the future of Dext!
Um novo motor de coleções, desenhado para o futuro do Dext!
[PT-BR] Refatoramos completamente o núcleo de coleções do framework para garantir segurança de memória e performance superior.
- 🛡️ Zero-Leak Architecture - Substituição total de classes manuais por interfaces (
IList<T>,IDictionary<K,V>). O gerenciamento de memória agora é automático, eliminando riscos de vazamento em closures e threads. - 🧬 Ownership Intelligence - Controle de propriedade nativo. As listas gerenciam o ciclo de vida dos objetos de forma inteligente, destruindo-os apenas quando apropriado.
- ⚡ LINQ Engine - Suporte completo a operações funcionais lazies (
Where,Select,Any,OrderBy,GroupBy) integradas nativamente às coleções. - 🔍 Native IExpression Integration - Coleções agora suportam filtragem via especificações e árvores de expressão do Dext, mantendo paridade entre filtros em memória e filtros de banco (ORM).
[EN] Completely refactored the collections core to ensure memory safety and superior performance.
- 🛡️ Zero-Leak Architecture - Total replacement of manual classes with interfaces (
IList<T>,IDictionary<K,V>). Memory management is now automatic, eliminating leakage risks in closures and threads. - 🧬 Ownership Intelligence - Native ownership control. Lists manage object lifecycles intelligently, destroying them only when appropriate.
- ⚡ LINQ Engine - Full support for lazy functional operations (
Where,Select,Any,OrderBy,GroupBy) natively integrated into collections. - 🔍 Native IExpression Integration - Collections now support filtering via Dext specifications and expression trees, maintaining parity between in-memory and database (ORM) filters.
[PT-BR] Lançamento de documentação bilíngue completa e novos capítulos no Dext Book dedicados a coleções e gerenciamento de memória. [EN] Launch of full bilingual documentation and new Dext Book chapters dedicated to collections and memory management.
[PT-BR]
- 🏗️ Namespace Refactoring - O pacote
Dext.UIserá renomeado paraDext.Vcl.UIpara melhor clareza e evitar conflitos com futuras implementações de UI (ex: FMX ou Web). - 🐧 Linux Improvements - Continuação da limpeza de dependências de Windows nos pacotes Core e Hosting para garantir compatibilidade 100% com CI/CD em Linux.
[EN]
- 🏗️ Namespace Refactoring - The
Dext.UIpackage will be renamed toDext.Vcl.UIfor better clarity and to avoid conflicts with future UI implementations (e.g., FMX or Web). - 🐧 Linux Improvements - Ongoing removal of Windows dependencies in Core and Hosting packages to ensure 100% compatibility with Linux CI/CD.
A evolução final do Dext ORM e Web API antes da v1.0!
The final evolution of Dext ORM and Web API before v1.0!
[PT-BR] Simplificamos drasticamente a exposição de dados e a execução de consultas complexas.
- ⚡ MapDataApi - Nova sintaxe fluente para criar endpoints REST completos a partir de uma entidade com uma única linha de código.
- 🛠️ FromSql Support - Agora você pode executar SQL puro diretamente via
DbContext.Users.FromSql(...)mantendo o mapeamento automático para objetos. - 🔗 Multi-Mapping ([Nested]) - Suporte a hidratação recursiva estilo Dapper. Mapeie objetos complexos em uma única query usando o atributo
[Nested]. - 🔒 Pessimistic Locking - Controle total de concorrência com suporte nativo a
FOR UPDATE(PostgreSQL/Oracle) eUPDLOCK(SQL Server). - 🧬 Stored Procedures Evolution - Mapeamento declarativo via
[StoredProcedure]e atributos[DbParam]para parâmetros de entrada e saída.
[EN] Drastically simplified data exposure and complex query execution.
- ⚡ MapDataApi - New fluent syntax to create full REST endpoints from an entity with a single line of code.
- 🛠️ FromSql Support - You can now execute raw SQL directly via
DbContext.Users.FromSql(...)while maintaining automatic object mapping. - 🔗 Multi-Mapping ([Nested]) - Dapper-style recursive hydration support. Map complex objects in a single query using the
[Nested]attribute. - 🔒 Pessimistic Locking - Full concurrency control with native support for
FOR UPDATE(PostgreSQL/Oracle) andUPDLOCK(SQL Server). - 🧬 Stored Procedures Evolution - Declarative mapping via
[StoredProcedure]and[DbParam]attributes for input and output parameters.
[PT-BR] Foco em performance e flexibilidade na filtragem de dados.
- 🚀 Zero-Allocation JSON - Motor "Database as API" agora utiliza
TUtf8JsonWriterpara streaming direto do banco para o socket, minimizando alocações de memória. - 🔍 Dynamic Specification Mapping - Filtragem avançada via QueryString integrada (
_gt,_lt,_sort, etc) que mapeia automaticamente para o SQL. - 🏗️ Core Interception - O motor de Proxy e ClassProxy foi movido para o Core, eliminando dependências circulares e otimizando o Lazy Loading.
[EN] Focus on performance and flexibility in data filtering.
- 🚀 Zero-Allocation JSON - "Database as API" engine now uses
TUtf8JsonWriterfor direct streaming from database to socket, minimizing memory allocations. - 🔍 Dynamic Specification Mapping - Integrated advanced QueryString filtering (
_gt,_lt,_sort, etc) that automatically maps to SQL. - 🏗️ Core Interception - The Proxy and ClassProxy engine has been moved to Core, eliminating circular dependencies and optimizing Lazy Loading.
- eShopOnWeb: Implementação completa do clássico demo da Microsoft adaptado para Dext.
- HelpDesk: Sistema de chamados com arquitetura em camadas e testes de integração.
- MultiTenancy: Demonstração de isolamento de dados por Schema e por Banco.
- SmartPropsDemo: Uso avançado de
Prop<T>eNullable<T>com persistência.
- SQL Generator: Melhoria na geração de Foreign Keys, ignorando propriedades de navegação durante o
CREATE TABLE. - Memory Management: Resolvido conflitos de ownership no
THandlerInvokere memory leaks no seeding de dados. - Lazy Loading: Correção de Access Violations causados por inicialização incorreta de proxies.
- TActivator: Priorização inteligente de construtores de classes derivadas.
Controle total sobre tipos de dados e suporte a bancos de dados legados!
Full control over data types and support for legacy databases!
[PT-BR] O atributo [DbType] agora é propagado corretamente até o driver de baixo nível. Isso garante que o banco de dados receba o tipo exato de dado esperado, evitando erros de conversão implícita.
- 🎯 Mapeamento Exato - Use
[DbType(ftDate)]para garantir que umTDateTimeseja enviado apenas como data. - 💰 Suporte a High-Precision - Use
[DbType(ftFMTBcd)]para campos monetários de alta precisão. - 🧪 Compatibilidade FireDAC - Integração total com os tipos de parâmetros do FireDAC.
[EN] The [DbType] attribute is now correctly propagated down to the low-level driver. This ensures the database receives the exact expected data type, avoiding implicit conversion errors.
- 🎯 Exact Mapping - Use
[DbType(ftDate)]to ensure aTDateTimeis sent as date only. - 💰 High-Precision Support - Use
[DbType(ftFMTBcd)]for high-precision currency fields. - 🧪 FireDAC Compatibility - Full integration with FireDAC parameter types.
[PT-BR] Melhoramos a estabilidade da paginação em versões antigas de bancos de dados que não suportam a sintaxe OFFSET/FETCH.
- 🏛️ Oracle Legacy - Implementada paginação robusta via
ROWNUMcompatível com Oracle 11g e anteriores. - 🔄 SQL Wrapper Architecture - Nova arquitetura de dialeto que permite "envelopar" queries para suportar qualquer estratégia de paginação.
- 🔗 Fluent Mapping - Adicionado suporte a
HasDbType(ADataType)na API fluente para configuração explícita de tipos. - 🐍 Improved Snake Case - Nova lógica no
TSnakeCaseNamingStrategyque agora lida corretamente com acrônimos (ex:THTTPLogEntryvirahttp_log_entryem vez deh_t_t_p_log_entry).
[EN] We've improved paging stability for older database versions that do not support the OFFSET/FETCH syntax.
- 🏛️ Oracle Legacy - Robust paging implementation via
ROWNUMcompatible with Oracle 11g and earlier. - 🔄 SQL Wrapper Architecture - New dialect architecture that allows "wrapping" queries to support any paging strategy.
- 🔗 Fluent Mapping - Added support for
HasDbType(ADataType)in the fluent API for explicit type configuration. - 🐍 Improved Snake Case - New logic in
TSnakeCaseNamingStrategythat now correctly handles acronyms (e.g.,THTTPLogEntrybecomeshttp_log_entryinstead ofh_t_t_p_log_entry).
Consulte dados dentro de colunas JSON/JSONB como se fossem propriedades nativas!
Query data inside JSON/JSONB columns as if they were native properties!
[PT-BR] Agora você pode consultar dados semi-estruturados armazenados em colunas JSON diretamente na API fluente do ORM. Esta feature permite:
- 🔍 Filtrar por propriedades JSON - Busque registros baseado em valores dentro do JSON
- 🌳 Acessar propriedades aninhadas - Navegue em estruturas JSON complexas com notação de ponto
- ✅ Verificar existência de chaves - Use
.IsNullpara encontrar registros sem determinada propriedade - 🔄 Conversão automática de tipos - O framework gera casts SQL apropriados automaticamente
Exemplo Completo:
type
[Table('UserSettings')]
TUserSetting = class
public
[PK, AutoInc]
property Id: Integer read FId write FId;
[JsonColumn] // Marca a coluna como JSON
property Preferences: string read FPreferences write FPreferences;
end;
// Consultas JSON fluentes
var Users := Context.UserSettings
.Where(Prop('Preferences').Json('theme') = 'dark')
.Where(Prop('Preferences').Json('notifications.email') = True)
.ToList;
// Verificar chaves inexistentes
var NoProfile := Context.UserSettings
.Where(Prop('Preferences').Json('profile').IsNull)
.ToList;[EN] You can now query semi-structured data stored in JSON columns directly from the ORM's fluent API. This feature enables:
- 🔍 Filter by JSON properties - Find records based on values inside JSON
- 🌳 Access nested properties - Navigate complex JSON structures with dot notation
- ✅ Check key existence - Use
.IsNullto find records missing a property - 🔄 Automatic type conversion - Framework generates appropriate SQL casts automatically
| Database | JSON Function | Column Type | Status |
|---|---|---|---|
| PostgreSQL | #>> operator |
JSONB / JSON |
✅ Full Support |
| SQLite 3.9+ | json_extract() |
TEXT |
✅ Full Support |
| MySQL 5.7+ | JSON_EXTRACT() |
JSON |
✅ Full Support |
| SQL Server 2016+ | JSON_VALUE() |
NVARCHAR(MAX) |
✅ Full Support |
[PT-BR] O Dext gera automaticamente os casts SQL corretos:
- INSERT PostgreSQL:
::jsonbaplicado automaticamente em colunas[JsonColumn] - Comparações numéricas:
::textaplicado para comparar JSON text com números - NULL checking: Gera
IS NULLcorretamente para expressões JSON
[EN] Dext automatically generates correct SQL casts:
- INSERT PostgreSQL:
::jsonbapplied automatically on[JsonColumn]columns - Numeric comparisons:
::textapplied to compare JSON text with numbers - NULL checking: Correctly generates
IS NULLfor JSON expressions
[PT-BR] Nova diretiva de compilação para habilitar funções JSON no SQLite:
// Em Dext.inc
{$DEFINE DEXT_ENABLE_SQLITE_JSON} // Requer sqlite3.dll 3.9+ com JSON1[EN] New compilation directive to enable JSON functions in SQLite:
// In Dext.inc
{$DEFINE DEXT_ENABLE_SQLITE_JSON} // Requires sqlite3.dll 3.9+ with JSON1💡 Dica/Tip: SQLite 3.51.2+ já inclui suporte JSON por padrão. Baixe em sqlite.org.
- English: JSON Queries Guide
- Português: Guia de Consultas JSON
[PT-BR] Implementação motivada por limitações de relacionamento identificadas no novo projeto WebSalesSystem. Suporte completo a relacionamentos Muitos-para-Muitos via atributo [ManyToMany]. Gerenciamento automático de tabelas de ligação, suporte a Lazy Loading e Eager Loading (Include). Novos métodos LinkManyToMany, UnlinkManyToMany e SyncManyToMany adicionados ao IDbSet<T>.
[EN] Implementation driven by relationship limitations identified in the new WebSalesSystem project. Full support for Many-to-Many relationships via [ManyToMany] attribute. Automatic join table management, support for Lazy and Eager loading (Include). New methods LinkManyToMany, UnlinkManyToMany, and SyncManyToMany added to IDbSet<T>.
[PT-BR] Expansão do mapeamento para suportar os requisitos de modelagem do WebSalesSystem:
[SoftDelete]: Filtro automático e deleção lógica.[Version]: Controle de concorrência otimista.[CreatedAt]/[UpdatedAt]: Auditoria automática de timestamps.[JsonColumn]: Armazenamento de objetos e listas como JSON.[DbType],[Precision],[MaxLength]: Controle refinado de tipos e constraints.
[EN] Mapping expansion to support WebSalesSystem modeling requirements:
[SoftDelete]: Automatic filtering and logical deletion.[Version]: Optimistic concurrency control.[CreatedAt]/[UpdatedAt]: Automatic timestamp auditing.[JsonColumn]: Storage of objects and lists as JSON.[DbType],[Precision],[MaxLength]: Refined control over types and constraints.
- WebSalesSystem List Deserialization: Resolvido
EBindingExceptionna desserialização deIList<T>em DTOs complexos. Implementado fallback paraTSmartList<T>noTActivatorquando fábricas de coleções não são encontradas. - Lazy Loading Memory Leak: Correção de
Invalid pointer operationcausado por dupla liberação de entidades. Agora oLazyLoaderrespeita o ciclo de vida doDbContext(OwnsObjects := False). - FireDAC Params: Resolvido erro de "Parameter not found" causado por limpeza incorreta de definições de parâmetros em reuso de comandos.
- M2M Index: Corrigido erro de índice (off-by-one) na recuperação de IDs da tabela de ligação.
[PT-BR] TDextServices e os Builders (AddHealthChecks, AddBackgroundServices) agora são Records. Não é mais necessário (nem possível) chamar .Free. Isso elimina os memory leaks causados por capturas de ciclos em closures.
[EN] TDextServices and Builders (AddHealthChecks, AddBackgroundServices) are now Records. It is no longer necessary (nor possible) to call .Free. This eliminates memory leaks caused by cycle captures in closures.
| Antes / Before | Depois / After |
|---|---|
[Controller] |
[ApiController] |
[Get] |
[HttpGet] |
[Post] |
[HttpPost] |
[Put] |
[HttpPut] |
[Delete] |
[HttpDelete] |
[Patch] |
[HttpPatch] |
[PT-BR] Os atributos antigos continuam funcionando mas estão deprecated. Use preferred names para melhor compatibilidade com o ecossistema .NET. O novo atributo [Route] agora é suportado na classe para prefixos de rota.
[EN] Old attributes still work but are deprecated. Use preferred names for better compatibility with the .NET ecosystem. The new [Route] attribute is now supported at the class level for route prefixes.
Novo Exemplo / New Example:
[ApiController]
[Route('/api/orders')]
TOrdersController = class
[HttpGet]
procedure GetAll(Ctx: IHttpContext);
[HttpPost('{id}/cancel')]
procedure Cancel(Ctx: IHttpContext; [FromRoute] Id: string);
end;[PT-BR] As seguintes classes foram marcadas como deprecated por causarem memory leaks ou serem redundantes com a nova API TDextServices:
[EN] The following classes have been marked as deprecated because they caused memory leaks or are redundant with the new TDextServices API:
| Classe Deprecated | Substituição / Replacement |
|---|---|
TServiceCollectionExtensions |
TDextServices |
TServiceProviderExtensions |
IServiceProvider.GetService<T> |
TApplicationBuilderModelBindingExtensions |
TApplicationBuilderExtensions |
TApplicationBuilderWithModelBinding |
TApplicationBuilderExtensions.MapPost<T> |
Antes / Before (memory leak):
TApplicationBuilderModelBindingExtensions
.WithModelBinding(App)
.MapPost<TUserRequest>('/api/users',
procedure(Req: TUserRequest)
var UserService: IUserIntegrationService;
begin
UserService := TServiceProviderExtensions.GetService<IUserIntegrationService>(App.GetServiceProvider);
UserService.ProcessUser(Req);
end
);Depois / After (sem leak, DI automático):
TApplicationBuilderExtensions.MapPost<TUserRequest, IUserIntegrationService>(App, '/api/users',
procedure(Req: TUserRequest; UserService: IUserIntegrationService)
begin
// Service injetado automaticamente!
UserService.ProcessUser(Req);
end
);Os tipos e métodos antigos foram marcados como deprecated e continuarão funcionando. Recomendamos migrar para a nova API.
The old types and methods have been marked as deprecated and will continue to work. We recommend migrating to the new API.
| Antes / Before | Depois / After |
|---|---|
TDextSettings |
TJsonSettings |
TDextCaseStyle |
TCaseStyle |
TDextEnumStyle |
TEnumStyle |
TDextFormatting |
TJsonFormatting |
TDextDateFormat |
TDateFormat |
.WithCamelCase |
.CamelCase |
.WithCaseInsensitive |
.CaseInsensitive |
.WithEnumAsString |
.EnumAsString |
Sintaxe antiga / Old syntax:
TDextJson.SetDefaultSettings(TDextSettings.Default.WithCamelCase.WithCaseInsensitive);Sintaxe nova / New syntax:
DefaultJsonSettings(JsonSettings.CamelCase.CaseInsensitive);| Antes / Before | Depois / After |
|---|---|
.WithOrigins(...) |
.Origins(...) |
.WithMethods(...) |
.Methods(...) |
.WithHeaders(...) |
.Headers(...) |
TCorsBuilder.Create... |
Cors... |
Sintaxe antiga / Old syntax:
App.Builder.UseCors(
procedure(Builder: TCorsBuilder)
begin
Builder.WithAllowAnyOrigin.WithAllowAnyMethod;
end);Sintaxe nova / New syntax:
Builder.UseCors(Cors.AllowAnyOrigin.AllowAnyMethod.AllowAnyHeader);| Antes / Before | Depois / After |
|---|---|
.WithTitle(...) |
.Title(...) |
.WithVersion(...) |
.Version(...) |
.WithDescription(...) |
.Description(...) |
TOpenAPIBuilder.Create... |
Swagger... |
Sintaxe antiga / Old syntax:
var SwaggerOpts := TOpenAPIBuilder.Create;
SwaggerOpts.WithTitle('My API');
SwaggerOpts.WithVersion('v1');
App.Builder.UseSwagger(SwaggerOpts);Sintaxe nova / New syntax:
Builder.UseSwagger(Swagger.Title('My API').Version('v1'));| Antes / Before | Depois / After |
|---|---|
[DextController('/api')] |
[Route('/api')] ou [Controller('/api')] |
[DextGet('')] |
[Get('')] |
[DextPost('')] |
[Post('')] |
[DextPut('/{id}')] |
[Put('/{id}')] |
[DextDelete('/{id}')] |
[Delete('/{id}')] |
[DextPatch('/{id}')] |
[Patch('/{id}')] |
EDextHttpException |
HttpException |
| Antes / Before | Depois / After |
|---|---|
TDextApplication |
TWebApplication |
TDextAppBuilder |
AppBuilder |
TDextWebHost |
WebHost |
TWebApplication.Create |
WebApplication (Global Function) |
Sintaxe antiga / Old syntax:
[DextController('/api/orders')]
TOrdersController = class
[DextGet('')]
procedure GetAll(Ctx: IHttpContext);
[DextPost('')]
procedure Create(Ctx: IHttpContext; Request: TCreateOrderRequest);
end;Sintaxe nova / New syntax:
[Route('/api/orders')]
TOrdersController = class
[Get('')]
procedure GetAll(Ctx: IHttpContext);
[Post('')]
procedure Create(Ctx: IHttpContext; Request: TCreateOrderRequest);
end;-
Função global
JsonSettings: Retorna umTJsonSettingspadrão para configuração fluente.Global function
JsonSettings: Returns a defaultTJsonSettingsfor fluent configuration. -
Procedure
DefaultJsonSettings: Atalho paraTDextJson.SetDefaultSettings.Procedure
DefaultJsonSettings: Shorthand forTDextJson.SetDefaultSettings. -
Função global
Cors: Cria umTCorsBuilderpara configuração fluente.Global function
Cors: Creates aTCorsBuilderfor fluent configuration. -
Função global
Swagger: Cria umTOpenAPIBuilderpara configuração fluente.Global function
Swagger: Creates aTOpenAPIBuilderfor fluent configuration. -
Função global
WebApplication: Atalho paraTWebApplication.Create.Global function
WebApplication: Shorthand forTWebApplication.Create. -
Modulariedade (DEXT_ENABLE_ENTITY): Agora é possível desativar a dependência do ORM/Banco de dados globalmente no
Dext.incao comentar a diretiva{$DEFINE DEXT_ENABLE_ENTITY}. Isso reduz o tamanho do binário para projetos que não utilizam o ORM.Modularity (DEXT_ENABLE_ENTITY): It is now possible to disable ORM/Database dependency globally in
Dext.incby commenting the{$DEFINE DEXT_ENABLE_ENTITY}directive. This reduces binary size for projects not using the ORM. -
Regra de Ordem de Importação ("Last Helper Wins"): Para garantir que todos os métodos fluentes (Core + Entity + Web) estejam disponíveis no
TDextServices, as units devem ser importadas na ordem específica:Dext, Dext.Entity, Dext.Web.Unit Order Rule ("Last Helper Wins"): To ensure all fluent methods (Core + Entity + Web) are available in
TDextServices, units must be imported in a specific order:Dext, Dext.Entity, Dext.Web. -
Padrão
var Builder: Novo padrão recomendado noTStartup.Configure:
procedure TStartup.Configure(const App: IWebApplication);
begin
var Builder := App.Builder;
DefaultJsonSettings(JsonSettings.CamelCase.CaseInsensitive);
Builder
.UseExceptionHandler
.UseHttpLogging;
Builder.UseCors(Cors.AllowAnyOrigin.AllowAnyMethod.AllowAnyHeader);
Builder.MapControllers;
Builder.UseSwagger(Swagger.Title('My API').Version('v1'));
end;- RFC-001 criado em
Docs/RFC/RFC-001-JSON-API-CLEANUP.md - RFC-002 criado em
Docs/RFC/RFC-002-DEXT-WEB-API-CLEANUP.md - SKILL.md atualizado com novas convenções
- Exemplo
DextFood.Startup.pasatualizado
Correção crítica no driver FireDAC: Transações explícitas agora funcionam corretamente.
Critical fix in FireDAC driver: Explicit transactions now work correctly.
O construtor TFireDACTransaction.Create agora vincula corretamente a transação ao Connection.Transaction e Connection.UpdateTransaction, garantindo que os comandos SQL respeitem a transação ativa.
Dext Rest Client: Novo cliente HTTP moderno para Delphi com:
- API fluente e intuitiva
- Suporte a async/await com Promises
- Serialização JSON integrada
- Interceptadores de request/response
- Retry policies
var Response := RestClient
.BaseUrl('https://api.example.com')
.Get('/users')
.Execute;Navigator Framework: Sistema de navegação para aplicações MVVM Desktop.
INavigatorinterface para navegação entre viewsTSimpleNavigatorimplementação leve- Integração com DI Container
- Gerenciamento automático de lifecycle de ViewModels
Navigator.NavigateTo<TCustomerEditViewModel>(
procedure(VM: TCustomerEditViewModel)
begin
VM.LoadCustomer(CustomerId);
end);Smart Properties (Prototype Pattern): Consultas LINQ-like com propriedades tipadas.
var Customer := Prototype.Entity<TCustomer>;
var List := Db.Customers
.Where(Customer.Active = True)
.Where(Customer.City = 'São Paulo')
.OrderBy(Customer.Name)
.ToList;Se você encontrar bugs ou tiver sugestões, por favor abra uma issue no GitHub.
If you find bugs or have suggestions, please open an issue on GitHub.