Разделение проблем, инверсия зависимостей и проекции 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.
Мой совет - не беспокойтесь о слоях здесь, вам все равно понадобится вертикальное соединение для одного запроса на всех этих слоях.
Проблемы уже разделены через эти объекты модели. Остальное излишне.