← Назад к вопросам

Что такое слой Domain?

1.0 Junior🔥 151 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое слой Domain (Доменный слой)?

В контексте архитектуры ПО, особенно в подходах Domain-Driven Design (DDD) и многослойной (layered) архитектуре, слой Domain (Доменный слой) — это ядро приложения, которое инкапсулирует бизнес-логику, правила и сущности, отражающие предметную область (домен) задачи. Его главная цель — обеспечить понятное и поддерживаемое представление сложной бизнес-деятельности в коде, независимо от технических деталей (например, баз данных, UI или внешних API).

Ключевые характеристики и компоненты Domain Layer

  1. Представление предметной области:

    • Слой Domain моделирует реальные бизнес-концепции, такие как Заказ, Клиент или Счет, переводя их в классы и объекты. Например, в системе электронной коммерции доменный слой будет содержать сущности Product и Order, со всеми связанными правилами.
    public class Order
    {
        public Guid Id { get; private set; }
        public Customer Customer { get; private set; }
        private List<OrderItem> _items = new List<OrderItem>();
        public IReadOnlyCollection<OrderItem> Items => _items.AsReadOnly();
        public decimal TotalAmount { get; private set; }
    
        public void AddItem(Product product, int quantity)
        {
            // Бизнес-правило: проверка доступности товара
            if (!product.IsInStock(quantity))
                throw new DomainException("Недостаточно товара на складе");
            
            var item = new OrderItem(product, quantity);
            _items.Add(item);
            UpdateTotalAmount();
        }
    
        private void UpdateTotalAmount()
        {
            TotalAmount = _items.Sum(item => item.Subtotal);
        }
    }
    
  2. Инкапсуляция бизнес-логики:

    • Вся бизнес-логика (расчеты, валидации, правила) содержится внутри доменных объектов, а не размазана по коду UI или базы данных. Это соответствует принципу бизнес-логики в модели (Rich Domain Model). Например, метод AddItem выше инкапсулирует правило проверки запаса товара.
  3. Основные строительные блоки DDD:

    • Сущности (Entities): Объекты с уникальной идентичностью (например, Order с Id), которые могут меняться со временем.
    • Value Objects (Объекты-значения): Неизменяемые объекты без идентичности, определяемые своими атрибутами (например, Address или Money).
    public class Address : ValueObject
    {
        public string Street { get; }
        public string City { get; }
        public string PostalCode { get; }
    
        public Address(string street, string city, string postalCode)
        {
            Street = street;
            City = city;
            PostalCode = postalCode;
        }
    
        protected override IEnumerable<object> GetEqualityComponents()
        {
            yield return Street;
            yield return City;
            yield return PostalCode;
        }
    }
    
    • Агрегаты (Aggregates): Кластеры связанных сущностей и value objects, обрабатываемые как единое целое. Например, Order (агрегат-корень) с коллекцией OrderItem.
    • Доменные события (Domain Events): События, фиксирующие факты в домене (например, OrderPlacedEvent), для реализации реактивной логики.
    • Репозитории (Repositories): Абстракции для доступа к агрегатам, объявленные в доменном слое, но реализуемые в слое инфраструктуры.
    public interface IOrderRepository
    {
        Task<Order> GetByIdAsync(Guid orderId);
        Task AddAsync(Order order);
        Task UpdateAsync(Order order);
    }
    
  4. Независимость от внешних слоев:

    • Domain layer не зависит от Infrastructure (базы данных, внешние сервисы), Presentation (UI) или Application (координация workflow). Это обеспечивается через инверсию зависимостей (Dependency Inversion). Например, репозитории определяются как интерфейсы в домене, а их реализации — в инфраструктуре.

Преимущества использования Domain Layer

  • Читаемость и сопровождение: Код отражает бизнес-терминологию (ubiquitous language), что упрощает понимание разработчиками и экспертами предметной области.
  • Тестируемость: Бизнес-логика изолирована, что позволяет легко писать модульные тесты без зависимостей от внешних систем.
  • Гибкость и эволюция: Изменения в бизнес-правилах вносятся централизованно, без затрагивания UI или базы данных.
  • Снижение рисков: Инкапсуляция правил предотвращает их нарушение в других частях приложения.

Пример в контексте многослойной архитектуры

В типичной DDD-архитектуре, слой Domain находится в центре:

  • Presentation Layer (Web API, MVC): Принимает запросы и делегирует выполнение Application Layer.
  • Application Layer: Координирует задачи (например, использование IOrderRepository и IOrderService), но не содержит бизнес-логики.
  • Domain Layer: Содержит ядро бизнес-логики (сущности, правила).
  • Infrastructure Layer: Реализует доступ к данным, внешним API и т.д.

Заключение

Domain Layer — это фундамент для создания устойчивых и масштабируемых приложений со сложной логикой. Он фокусируется на предметной области, а не на технических деталях, способствуя долгосрочной поддержке кода. В C#-разработке его использование часто сопровождается паттернами DDD, что делает его ключевым элементом для backend-систем в финансах, электронной коммерции или управлении ресурсами. На практике, реализация требует тесного сотрудничества с бизнес-экспертами и тщательного моделирования, но окупается за счет снижения количества ошибок и ускорения разработки.

Что такое слой Domain? | PrepBro