Я разрабатываю приложение MVC ASP.NET с помощью Луковой Архитектуры, описанной Jeffrey Palermo.
Это - проект ASP.NET MVC 2.0, где я требую, чтобы все представления были использованием со строгим контролем типов выделенные Модели Представления - мы не будем передавать модели предметной области нашим представлениям. Мы используем AutoMapper, чтобы сделать перевод - AutoMapper изолируется в инфраструктуре, сеть не знает или заботится, что AutoMapper используется.
В настоящее время я определяю интерфейсы IViewModelMapping в веб-проекте - просто, потому что этот сервис будет использоваться Контроллерами, и он имеет прямой доступ к своим собственным Моделям Представления. Таким образом, интерфейс может получить доступ к обоим Модели предметной области (в Ядре) и Модели Представления (в сети).
Для обеспечения фактической реализации интерфейсов IViewModelMapping я создал пространство имен ObjectMapping в Инфраструктурном проекте, который изолирует фактическую реализацию отображения к Внутриструктуре лука. При этом это потребует, чтобы Инфраструктура имела зависимость и от Ядра И ОТ сети.
Мой вопрос: так как оба из этих проектов технически на окраине лука (в том же слое) - одному проекту позволяют иметь зависимость от другого проекта в том слое? Кто-либо замечает какие-либо потенциальные ловушки с этим дизайном?
Альтернативный дизайн переместил бы интерфейсы IViewMapper в Ядро - но это будет невозможно, потому что Ядро не имеет доступа к классам ViewModel. Я мог также переместить модели представления в Ядро, но я чувствую, что они не принадлежали бы там, так как они характерны для уровня UI.
Предлагаемая архитектура следующим образом - замечают, что Инфраструктура имеет зависимость от Ядра И сети. Сеть остается изолированной и только имеет доступ к логике Основного бизнеса.
Вы правы, что не хотите, чтобы инфраструктура зависела от UI (Web), но иногда я нарушаю это правило.
Я бы подумал, что вместо IViewModelMapping создайте IMapper с помощью метода Map (). Затем интерфейс может иметь реализации, которые могут иметь отношение к отображению модели представления или, может быть, просто к обычному отображению. В любом случае этот интерфейс может быть в Core, потому что он семантически не привязан к какому-либо типу модели.
Отличная графика. Надеюсь, я ответил на ваш вопрос. Общая философия луковой архитектуры заключается в том, чтобы держать вашу бизнес-логику и модель в середине (ядре) вашего приложения и выдвигать ваши зависимости как можно дальше наружу.