Разделение проблем, инверсия зависимостей и проекции AutoMapper

Что касается проекта MVVM, в котором для проекций применяется AutoMapper.EF6, у меня возникли трудности с разделением задач доступа к данным и слоев моделей представления и сохранением инверсии зависимостей между этими слоями.

Предположим, у нас есть эти слои и классы.

Models Layer: 
    Entity
    IEntityDA

ViewModel Layer:
    EntityVM
    EntityFormVM<TEntityVM, TEntity>

DataAccess Layer: 
    EntityDA: (Inherits from IEntityDA<TEntity>)

Теперь в EntityFormVM я получаю IQueriable из экземпляра IEntityDA, проецирую его в список TEntityVM и, наконец, вызываю IEntityDA.Dispose(). Таким образом, DA раскрывает IQueriable! Я не знаю, правильно ли это! и VM ответственна за удаление контекста, так как DA не знает, когда работа закончена!

С другой стороны, у меня есть несколько альтернатив, таких как инвертирование зависимости между DA и VM. Поэтому у меня будет EntityDA, который проецирует результаты в TEntityVM и возвращает их. Но DA будет зависеть от ВМ!

Какова лучшая практика здесь?

1 ответ

Во-первых, просто признать, что IQueryable это дырявая абстракция. Чтобы эффективно использовать его с любым используемым ORM, вам необходимо использовать расширения, специфичные для ORM.

Мой совет - не беспокойтесь о слоях здесь, вам все равно понадобится вертикальное соединение для одного запроса на всех этих слоях.

Проблемы уже разделены через эти объекты модели. Остальное излишне.

Другие вопросы по тегам