Лук archicecture зависимости в том же слое: Инфраструктура и веб-передача

Я разрабатываю приложение MVC ASP.NET с помощью Луковой Архитектуры, описанной Jeffrey Palermo.

Это - проект ASP.NET MVC 2.0, где я требую, чтобы все представления были использованием со строгим контролем типов выделенные Модели Представления - мы не будем передавать модели предметной области нашим представлениям. Мы используем AutoMapper, чтобы сделать перевод - AutoMapper изолируется в инфраструктуре, сеть не знает или заботится, что AutoMapper используется.

В настоящее время я определяю интерфейсы IViewModelMapping в веб-проекте - просто, потому что этот сервис будет использоваться Контроллерами, и он имеет прямой доступ к своим собственным Моделям Представления. Таким образом, интерфейс может получить доступ к обоим Модели предметной области (в Ядре) и Модели Представления (в сети).

Для обеспечения фактической реализации интерфейсов IViewModelMapping я создал пространство имен ObjectMapping в Инфраструктурном проекте, который изолирует фактическую реализацию отображения к Внутриструктуре лука. При этом это потребует, чтобы Инфраструктура имела зависимость и от Ядра И ОТ сети.

Мой вопрос: так как оба из этих проектов технически на окраине лука (в том же слое) - одному проекту позволяют иметь зависимость от другого проекта в том слое? Кто-либо замечает какие-либо потенциальные ловушки с этим дизайном?

Альтернативный дизайн переместил бы интерфейсы IViewMapper в Ядро - но это будет невозможно, потому что Ядро не имеет доступа к классам ViewModel. Я мог также переместить модели представления в Ядро, но я чувствую, что они не принадлежали бы там, так как они характерны для уровня UI.

Предлагаемая архитектура следующим образом - замечают, что Инфраструктура имеет зависимость от Ядра И сети. Сеть остается изолированной и только имеет доступ к логике Основного бизнеса.

http://www.matthidinger.com/images/onion-arch.png

38
задан Matt Hidinger 25 February 2010 в 21:11
поделиться

1 ответ

Вы правы, что не хотите, чтобы инфраструктура зависела от UI (Web), но иногда я нарушаю это правило.

Я бы подумал, что вместо IViewModelMapping создайте IMapper с помощью метода Map (). Затем интерфейс может иметь реализации, которые могут иметь отношение к отображению модели представления или, может быть, просто к обычному отображению. В любом случае этот интерфейс может быть в Core, потому что он семантически не привязан к какому-либо типу модели.

Отличная графика. Надеюсь, я ответил на ваш вопрос. Общая философия луковой архитектуры заключается в том, чтобы держать вашу бизнес-логику и модель в середине (ядре) вашего приложения и выдвигать ваши зависимости как можно дальше наружу.

28
ответ дан 27 November 2019 в 03:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: