Я работаю над реализацией функциональности в существующем приложении MVC3 + NHibernate, которая позволила бы пользователям определять пользовательские представления для объектов данных. Проблема, с которой я столкнулся в NHibernate, заключается в том, что реальные объекты сущностей не включают (и я думаю, что они не должны) включать свойства для каждого типа агрегата, который пользователь может захотеть включить в представление.
Например, пользователь может захотеть создать представление, которое отображает список всех продуктов вместе со столбцами для итогов продаж за этот месяц, в прошлом месяце и с начала года. Или представление, показывающее продавцов и их общее количество продаж за различные периоды времени, как это. Или один показывает доход от продажи за определенный период времени.
В идеале я хотел бы, чтобы эти агрегаты можно было добавлять в приложение, не требуя изменения самих объектов сущностей, например, через дополнительные классы, определяющие совокупность.
Не похоже, что это хорошая работа для NHibernate, поэтому я думал о реализации отдельного доступа к данным в приложении специально для этих представлений (которые более уместно называть отчетами). Вот несколько вариантов, которые я рассмотрел:
- Использование чего-то вроде Massive или Dapper , что позволило бы мне использовать ExpandoObjects для учета множества возможных агрегатов, но я не работал с ним, и похоже, что это может быть слишком упрощенным для сложных агрегатов.
- Возвращаясь к основам, используя SQL-запросы или sprocs, ADO.NET и SqlDataReaders, чтобы вручную заполнять объекты, возможно, даже ExpandoObjects, например, Massive, но я управляю SQL.
- Создание объекта-обертки для агрегатов, который будет включать свойство, ссылающееся на сущность NHibernate, возможно, с использованием обобщенных типов (например,
SalesByMonth<Product>
). Проблема здесь заключается в неэффективности многоуровневых вызовов базы данных по сравнению с вызовами базы данных NHibernate.
Я не хочу использовать полнофункциональное решение для составления отчетов, потому что агрегаты, вероятно, будут довольно простыми, и я хочу, чтобы это было интегрировано в внешний вид сайта, чтобы пользователи могли нажимать ссылки на позиции для просмотра связанной сущности.
Как вы рассматривали подобные требования в прошлом, и если да, то как? Мне не хватает какой-то возможности NHibernate, которая могла бы обеспечить функциональность этого типа в моем текущем наборе объектов-сущностей?