 DDD - 
Lógica de negócios e exceções em 
entidades
DDD - 
Lógica de negócios e exceções em 
entidades
|  | Hoje veremos como lidar com lógica de negócios e exceções em entidades na abordagem do Domain Driven Design. | 
A lógica de negócios, como validações, cálculos ou transições de estado, pode ser implementada nas entidades para garantir a integridade e a consistência do domínio.
Vejamos um exemplo de entidade Order em um sistema de comércio eletrônico. A entidade Order pode ter diversas regras de negócios associadas a ela, como garantir que o pedido tenha um cliente válido, contenha pelo menos um item ou atenda a determinados critérios de processamento.
| public class Order
{
    public int Id { get; set; }
    public Customer Customer { get; set; }
    public List<OrderItem> Items { get; set; }
    public void AddItem(OrderItem item)
    {
        if (item == null)
        {
            throw new ArgumentNullException(nameof(item));
        }
        // lógica adicional para validação do item
        Items.Add(item);
    }
    // Outros métodos e propriedades
} | 
A seguir temos algumas diretrizes para lidar com lógica de negócios em entidades :
Tratamento de exceções
As exceções desempenham um papel crucial no tratamento de erros e na notificação 
dos clientes sobre cenários excepcionais. No DDD, exceções podem ser usadas para 
comunicar erros específicos de domínio ou violações de regras de negócios.
Continuando com nosso exemplo de entidade Order, 
vamos considerar um cenário onde o pedido deve ter um valor total mínimo para 
processamento. Se o pedido não atender a esses critérios, podemos lançar uma 
exceção personalizada para indicar a violação.
| public class InsufficientOrderValueException : Exception
{
    public InsufficientOrderValueException(string message) : base(message)
    {
    }
}
public class Order
{
    public void Process()
    {
        decimal totalValue = CalculateTotalValue();
        if (totalValue < minimumValue)
        {
            throw new InsufficientOrderValueException("O pedido não atende o valor mínimo.");
        }
        // processa o pedido
    }
    // outros métodos
} | 
No trecho de 
código acima, definimos uma exceção personalizada 
InsufficientOrderValueException para representar a violação específica. 
Dentro do método Process calculamos o valor total 
do pedido e verificamos se atende ao requisito mínimo. Caso contrário, lançamos 
a exceção personalizada com uma mensagem de erro apropriada.
Ao usar exceções personalizadas, podemos diferenciar entre diferentes tipos de 
erros e tratá-los adequadamente em nosso aplicativo ou propagá-los ao cliente 
para ações apropriadas.
A seguir temos algumas diretrizes para lidar com exceções em entidades:
Lembre-se de que a consistência do domínio é crucial, e a maneira como você projeta a lógica de negócios e trata as exceções deve refletir a compreensão profunda do domínio e das regras que regem o sistema.
Assim, no Domain-Driven Design (DDD), a camada de domínio é o coração da aplicação, onde reside a lógica de negócios e as regras que definem o comportamento e a semântica do domínio. Portanto, realizar o tratamento de exceções na camada de domínio é uma abordagem coerente por várias razões:
Entretanto é importante ressaltar que nem todas as exceções devem ser tratadas no domínio. Erros de infraestrutura, como problemas de conexão de banco de dados ou falhas de rede, são geralmente tratados em camadas superiores, como a camada de aplicação ou a camada de apresentação, pois essas camadas são responsáveis por lidar com as complexidades técnicas da aplicação.
E estamos 
conversados... 
"E (Jesus) os ensinava, dizendo: Não está escrito: A minha casa será chamada, 
por todas as nações, casa de oração? Mas vós a tendes feito covil de ladrões."
Marcos 11:17
Referências:
C# - Calculando a diferença entre duas datas
NET - Padrão de Projeto - Null Object Pattern
C# - Fundamentos : Definindo DateTime como Null ...
C# - Os tipos Nullable (Tipos Anuláveis)