Esta documentação descreve a implementação e uso de DomainDataType, Value Objects, validações personalizadas e utilitários desenvolvidos no SSAG3.0. As abordagens apresentadas foram criadas para garantir consistência, automação e flexibilidade no desenvolvimento e personalização do sistema.
O DomainDataType é um enum que define os tipos de dados suportados no sistema. Ele é usado para configurar tabelas e campos de forma dinâmica, permitindo a geração automática de banco de dados e a validação dos dados em tempo de execução.
public enum DomainDataType
{
CHAR, // Texto fixo
VARCHAR, // Texto variável
INT, // Número inteiro
BIGINT, // Número inteiro maior
DECIMAL, // Número decimal
FLOAT, // Número de ponto flutuante
CURRENCY, // Valor monetário
DATE, // Data
DATETIME, // Data e hora
TIMESTAMP, // Marca de tempo
BOOLEAN, // Valores booleanos
JSON, // Dados JSON
XML, // Dados XML
BLOB, // Dados binários
CPF, // Cadastro de Pessoa Física
CNPJ, // Cadastro de Pessoa Jurídica
EMAIL, // Endereço de E-mail
PHONE, // Número de Telefone
CEP, // Código Postal
GUID, // Identificador Único Global
GUID_SHORT // Identificador Único Global Curto
}
Benefícios:
Centralização: Tipos de dados padronizados.
Automação: Geração automática de banco de dados.
Validação Consistente: Redução de erros por uso padronizado.
Os Value Objects encapsulam tipos de dados complexos, como CPF, CNPJ e E-mail, com validações e comportamentos específicos.
public class Cpf
{
[Required]
[StringLength(11, MinimumLength = 11, ErrorMessage = "O CPF deve ter 11 dígitos.")]
[RegularExpression(@"^\d{11}$", ErrorMessage = "CPF inválido.")]
public string Value { get; private set; }
public Cpf(string value)
{
if (!IsValid(value))
throw new ArgumentException("CPF inválido.");
Value = value;
}
private bool IsValid(string value)
{
// Implementar validação de CPF
return true;
}
public override string ToString() => Value;
}
As validações personalizadas garantem a consistência e a conformidade dos dados com as regras de negócio.
| Tipo de Validação | Classe/Attribute | Descrição |
|---|---|---|
| CPF | CpfValidation |
Valida o formato e dígitos verificadores de CPF. |
| CNPJ | CnpjValidation |
Valida o formato e dígitos verificadores de CNPJ. |
EmailValidation |
Valida sintaxe de e-mail. | |
| Telefone | FoneValidation |
Valida DDI, número e ramal opcional. |
| CEP | CepValidation |
Valida formato de CEP (BR). |
| GUID Short | GuidShortValidation |
Valida formato e unicidade de GUID curtos. |
public class SYS_EXAMPLE
{
[Key]
[Required]
[GuidShortValidation] // Validação personalizada para GUID Short
public GuidShort Id { get; set; }
[Required]
public Guid SequentialId { get; set; } // Sequential GUID
[Required]
[StringLength(100)]
public string Nome { get; set; }
[Required]
[CpfValidation]
public Cpf CPF { get; set; }
[Required]
[CnpjValidation]
public Cnpj CNPJ { get; set; }
[Required]
[EmailValidation]
public Email Email { get; set; }
[Required]
[FoneValidation]
public Fone Telefone { get; set; }
[Required]
[CepValidation]
public Cep CEP { get; set; }
[Required]
public DomainDataType Tipo { get; set; }
[Range(0, 100)]
public int Inteiro { get; set; }
[Range(0.01, 9999.99)]
public decimal DecimalValue { get; set; }
[Range(0.01, 9999.99)]
public Currency ValorMonetario { get; set; }
[Required]
public bool Ativo { get; set; }
[DataType(DataType.Date)]
public DateTime DataCriacao { get; set; }
[DataType(DataType.DateTime)]
public DateTime UltimaAtualizacao { get; set; }
[MaxLength(1000)]
public string Observacao { get; set; }
[DataType(DataType.Json)]
public string Metadata { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SYS_EXAMPLE>(entity =>
{
entity.Property(e => e.Id).HasMaxLength(22).IsRequired();
entity.Property(e => e.SequentialId).IsRequired();
entity.Property(e => e.Nome).HasMaxLength(100).IsRequired();
entity.Property(e => e.Inteiro).HasColumnType("INT");
entity.Property(e => e.DecimalValue).HasColumnType("DECIMAL(18,2)");
entity.Property(e => e.ValorMonetario).HasColumnType("DECIMAL(18,2)");
entity.Property(e => e.Metadata).HasColumnType("JSON");
});
}
DomainDataType para padronizar tipos.Esta tabela auxilia na escolha do identificador mais adequado para cada tipo de contexto no sistema.
| Contexto | Identificador | Justificativa |
|---|---|---|
| Clientes, Fornecedores, etc. | GuidShort | Compacto, legível, ideal para URLs e identificações. |
| Pedidos, Notas Fiscais | Sequential Guid | Alta frequência, otimiza índices e registros ordenados. |
| Movimentações Financeiras | Sequential Guid | Performance crítica em bancos de dados grandes. |
| Logs/Auditoria | Sequential Guid | Mantém ordem cronológica com eficiência, facilitando auditorias e rastreabilidade. |
Esta tabela compara diferentes tipos de identificadores quanto a armazenamento, performance, chances de colisão e facilidade de uso.
| Tipo | Armazenamento | Performance | Colisão | Facilidade de Uso |
|---|---|---|---|---|
| GUID (Default) | 16 bytes | Alta | Baixa | Alta (suporte nativo em várias linguagens). |
| GuidShort | 22 caracteres ou 16 bytes como binário | Alta | Baixa | Alta (mais legível e compacto para URLs). |
| Sequential GUID | 16 bytes | Muito Alta | Baixa | Média (exige configuração específica). |
| GuidCompact | Compactado | Média | Baixa | Baixa (menos comum e menos suporte nativo). |
GuidShort:
Sequential GUID:
GUID (Default):
GuidCompact:
Veja Também
Utilitários de Geração de Identificadores
| Última Atualização | Responsável | Status |
|---|---|---|
| 29 de novembro de 2024 | Márcio de Matos Costa | Padronização do Core |