Этот проект представляет собой общее ядро (Shared Kernel) для реализации Domain-Driven Design (DDD) в приложениях. Он содержит базовые абстракции и реализации для сущностей, агрегатов, value objects, доменных событий и исключений.
- Entity - базовая сущность с идентификатором
- AggregateRoot - корень агрегата с поддержкой доменных событий
- ValueObject - базовый value object с реализацией сравнения
- IAggregateRoot - интерфейс корня агрегата
- IDomainEvent - интерфейс доменного события
- Поддержка коллекции событий в агрегатах
- DomainException - базовое доменное исключение
- DomainRequiredFieldException - обязательное поле не заполнено
- DomainMinLengthFieldException - минимальная длина не соблюдена
- DomainMaxLengthFieldException - максимальная длина превышена
- DomainRangeFieldException - значение вне допустимого диапазона
- DomainValidationFieldException - невалидное поле
- DomainResourceNotFoundException - ресурс не найден
- DomainResourceAlreadyExistsException - ресурс уже существует
- DomainExceptionCodes - коды доменных исключений
- DomainFieldCodes - коды доменных полей
- IAddItem - добавление сущностей
- IAddItemAsync - добавление сущностей асинхронно
- IAddRangeItems - добавление списка сущностей
- IAddRangeItemsAsync - добавлене списка сущностей асинхронно
- IGetItem<TAggregate, TKey> - получение сущностей
- IGetItemAsync<TAggregate, TKey> - получение сущностей асинхронно
- IUpdateItem - обновление
- IUpdateItemAsync - обновление сущностей асинхронно
- IDeleteItem - удаление сущностей
- IDeleteItemAsync - удаление сущностей асинхронно
- IDeleteRangeItems - удаление списка сущностей
- IDeleteRangeItemsAsync - удаление списка сущностей асинхронно
- IUnitOfWork - Unit of Work паттерн
public class User : Entity<Guid>
{
public string Name { get; private set; }
public Email Email { get; private set; }
public User(Guid id, string name, Email email) : base(id)
{
Name = name;
Email = email;
}
}public class Order : AggregateRoot<Guid>
{
private readonly List<OrderItem> _items = new();
public IReadOnlyCollection<OrderItem> Items => _items.AsReadOnly();
public decimal TotalAmount { get; private set; }
public Order(Guid id) : base(id) { }
public void AddItem(Product product, int quantity)
{
var item = new OrderItem(product.Id, product.Price, quantity);
_items.Add(item);
TotalAmount += item.TotalPrice;
AddDomainEvent(new OrderItemAddedEvent(Id, product.Id, quantity));
}
}public class Email : ValueObject
{
public string Value { get; }
public Email(string value)
{
Value = SetCharField("email.field", value, 5, 255);
if (!IsValidEmail(value))
throw new DomainValidationFieldException("email.field", "valid email format");
}
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Value;
}
private static bool IsValidEmail(string email)
{
// валидация email
return true;
}
}try
{
var user = new User(Guid.NewGuid(), "", new Email("invalid-email"));
}
catch (DomainRequiredFieldException ex)
{
// Обработка обязательного поля
Console.WriteLine($"Field {ex.FieldName} is required");
}
catch (DomainValidationFieldException ex)
{
// Обработка невалидного поля
Console.WriteLine($"Field {ex.FieldName} must have {ex.MustHave}");
}-
Типобезопасность - строгая типизация для идентификаторов и агрегатов
-
Иммутабельность - защита внутреннего состояния сущностей
-
Доменные события - встроенная поддержка событийной модели
-
Локализация - коды ошибок для поддержки многоязычности
-
Валидация - встроенные методы валидации в ValueObject
-
Async поддержка - асинхронные операции в репозиториях