Принадлежат ли прикладные сервисы к уровню домена или к уровню приложения?

У меня есть приложение N-Layered Winforms с 4 слоями следующим образом:

Уровень презентации

Уровень приложения

Уровень домена

Уровень инфраструктуры

На моем уровне приложения есть класс Product Services, который используется для всех действий, связанных с репозиториями для Продуктов.

Принадлежит ли файл интерфейса для класса сервисов продуктов к уровню приложения или уровню домена? Я спрашиваю, потому что интерфейсный файл для моих репозиториев определен на уровне домена, хотя они реализованы на уровне инфраструктуры.

Заранее спасибо.


person Robertcode    schedule 27.02.2016    source источник
comment
Возможно, этот вопрос больше подходит для programmers.stackexchange.com. И, насколько я понимаю, каждый уровень в идеальном n-уровне должен знать только об одноуровневом нижнем уровне (UI- ›Application-› Domain- ›Infra, но Application не должно знать об Infra), поэтому в вашем случае это кажется, это нарушение правильного n-го уровня.   -  person Eugene Podskal    schedule 27.02.2016
comment
@EugenePodskal, ссылаясь на другие сайты, часто бывает полезно указать, что перекрестная публикация не одобряется   -  person gnat    schedule 27.02.2016
comment
@Robertcode класс Product Services, который используется для всех действий, связанных с репозиторием .... что вы имеете в виду? что на самом деле делает сервис?   -  person guillaume31    schedule 29.02.2016
comment
@ guillaume31 Класс Product Services находится на уровне приложения. Его цель - обрабатывать все операции CRUD для Продукта. Таким образом, все запросы пользовательского интерфейса на уровне представления для добавления, обновления или удаления продукта передаются классу Product Services, который, в свою очередь, передает запрос в домен для проверки, а затем в ProductRepository. Результаты, возвращаемые репозиторием, преобразуются в DTO службой продукта и отправляются обратно в пользовательский интерфейс для отображения.   -  person Robertcode    schedule 05.03.2016


Ответы (2)


Концепция сервиса может принадлежать любому слою. Если вы запрашиваете службы приложений, они должны находиться на уровне приложения.

С другой стороны, если эти службы напрямую обращаются к домену, они все равно домен. То есть я ожидал найти как интерфейс службы, так и одну или несколько реализаций в любом проекте с префиксом Domain.

Кстати, проект не имеет ничего общего с программными слоями. Это просто организационная единица, которая группирует файлы по некоторым критериям. Самым важным моментом является то, что ваш поток должен работать с инверсией контроля для склеивания слоев.

person Matías Fidemraizer    schedule 27.02.2016

С DDD обычно рекомендуется использовать инверсию зависимостей (D в SOLID), поэтому дерево зависимостей должно быть

                      Domain Layer
                            |
                           / \ 
                          /   \
        Presentation Layer     Infrastructure Layer

Таким образом, «уровни» представления и инфраструктуры зависят от вашего домена, а не наоборот (общая версия этого также известна как Гексагональная архитектура или порты и адаптеры)

И уровень приложения действительно является частью вашего домена, поскольку он определяет, как должны работать варианты использования. Я никогда не использовал (и не видел) прикладной уровень в приложении, но я поместил службы приложений в другой пакет внутри того же артефакта (терминология здесь может быть немного отличается, поскольку я пришел из фона Java).

person Augusto    schedule 29.02.2016
comment
Я постоянно вижу уровни приложений. Например, этот образец автор: Вон У Вернона есть слой application (с несколькими пакетами под ним) помимо domain. См. Также gorodinski.com/blog/2012 / 04/14 / - person guillaume31; 29.02.2016
comment
Уровень приложения действительно использует повсеместный язык домена во всех случаях использования, однако для меня технически он не является частью уровня домена. Уровень приложения также может выполнять стандартные действия, не связанные с доменом, такие как проверка того, что confirmPassword равно password, проверка максимальной длины строк и т. Д. - person guillaume31; 29.02.2016