Files
demo-ddd-without-oop/csharp-oop-simplified2/Domain/Account.cs
T
2026-04-21 23:13:26 +01:00

38 lines
1.0 KiB
C#

namespace CsharpOopSimplified2.Domain;
/// Domain entity / aggregate root representing a bank account
public sealed class Account
{
public Guid Id { get; private set; }
public Money Balance { get; private set; }
// Often present to satisfy serializers / ORMs.
private Account()
{
Balance = new Money(0);
}
public Account(Guid id, Money openingBalance)
{
if (openingBalance.Amount < 0)
throw new ArgumentOutOfRangeException(nameof(openingBalance));
Id = id;
Balance = openingBalance;
}
// Domain behaviour attached to the entity.
public void Withdraw(Money amount)
{
if (amount.Amount <= 0)
throw new InvalidOperationException("Withdrawal amount must be positive.");
// Sometimes, validation is modelled with custom exceptions instead
if (Balance.Amount - amount.Amount < 0)
throw new InsufficientBalanceException(Balance, amount);
Balance = Balance.Subtract(amount);
}
}