Разочарованные текущими ограничениями предложения отчетности (SSRS, Crystal Reports) и моими пользователями, в основном финансовыми / деловыми людьми, знакомыми с Excel, я подумываю написать свой собственный механизм отчетов с использованием компонента Excel, такого как SpreadsheetGear или Aspose.Cells, и интегрировать его в наше приложение WinForms.
Обе библиотеки предлагают компонент WinForms для просмотра электронных таблиц, поэтому сгенерированный отчет электронной таблицы будет показан пользователю в форме после сохранения его параметров, после чего он сможет его сохранить.
Я сделал это в отдельном проекте winforms, и это очевидно просто. Просто поместите элементы управления параметрами в форму, подключитесь к базе данных, сгенерируйте электронную таблицу, и все готово.
Однако выполнение этого для каждого отчета, очевидно, повлечет за собой значительное дублирование «стандартного» кода и дизайна формы и снижает удобство обслуживания и возможность обновления приложения.
В связи с этим я рассматриваю возможность написания отчетов в виде плагинов (DLL), которые будут предоставлять только код / логику для генерации отчета и будут возвращать конечный объект рабочего листа вызывающей стороне (форма «Предварительный просмотр отчета»).
Подумав, я думаю, что обязанности между вызывающим абонентом и надстройкой будут распределены следующим образом:
DLL / надстройка отчета предоставит вызывающей стороне (главному пользовательскому интерфейсу) список параметров, которые пользователь должен передать для этого отчета, вместе с его именем, его возможными значениями (списком со списком, для пример).
После этого главный пользовательский интерфейс будет создавать их в форме. Тип элемента управления будет выведен на основании типа данных параметра (строка будет TextBox и т. Д.).
Главный пользовательский интерфейс будет передавать в DLL-отчет отчета заполненные параметры в метод генерации отчета вместе с некоторыми специфическими настройками приложения (строка подключения, имя пользователя приложения).
Затем библиотека отчетов DLL сгенерирует отчет и вернет в главный пользовательский интерфейс сгенерированный объект листа / отчета и отобразит его в элементе предварительного просмотра.
Чтобы достичь этого технически, я считаю, что мне нужно создать интерфейс для моих библиотек отчетов и реализовать такие методы, как
List<ReportParameter> GetReportsParameters()
Report GenerateReport()
Из основного интерфейса я бы получал к ним доступ и вызывал их через Reflection.
Похоже ли это на хорошую стратегию и оставляет ли она приличное пространство для расширения в будущем?
Я хотел бы добиться хорошего баланса между модульностью, не ограничивая при этом гибкость, поскольку моя архитектура надстроек слишком статична для будущего.
Не могли бы вы дать несколько полезных советов, чтобы убедиться в этом, и поделитесь, если вы достигли подобных результатов в прошлом?
Спасибо.
(Я занимаюсь разработкой на C #, .Net 4.0 и WinForms. Серверная часть базы данных - SQL Server 2005).