Подтвердить что ты не робот

Лучевые архитекторные зависимости в одном слое: инфраструктура и веб-связь

Я разрабатываю приложение ASP.NET MVC с помощью Theion Architecture, описанной Джеффри Палермо.

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

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

Чтобы обеспечить фактическую реализацию интерфейсов IViewModelMapping, я создал пространство имен ObjectMapping в проекте Infrastructure, которое будет изолировать фактическую реализацию сопоставления с инфраструктурой лука. При этом для этого потребуется, чтобы инфраструктура зависела от BOTH Core и Web.

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

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

Предлагаемая архитектура выглядит следующим образом: обратите внимание, что инфраструктура имеет зависимость от Core AND Web. Веб остается изолированным и имеет доступ только к основной бизнес-логике.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Попробуйте переместить Отображение объектов на Веб.

Ответ 3

Уровень вашего веб-интерфейса/интерфейса может зависеть от уровня инфраструктуры. Но это не очень хороший дизайн, чтобы иметь зависимость от уровня Web on Infrastructure. Архитектура лука говорит, что ваши зависимости как можно дальше наружу.

Вы можете создать папку "\ Builder" в пользовательском интерфейсе. Добавьте в него один файл интерфейса, например.. IBuilder или IMapper и объявите в нем способ, например ConvertToViewModel или CreateMapping. что бы вы ни хотели.

* Builder ** IBuilder.cs -declare метод здесь. ** Builder.cs - - Внедрите здесь метод, определите отображение между ViewModel и его соответствующим DomainModel (ссылка из основного уровня) и верните соответствующий ViewModel здесь.