Мы пытаемся создать довольно простую систему отчетности для нашей аналитической команды. Это наша третья или четвертая итерация той же системы, но мы выполняем консолидацию и переписываем большую часть внутренней логики, чтобы упростить создание отчетов в будущем.
Одна из проблем, с которыми мы сталкиваемся, - это формирование интерфейсов, которые будут реализованы нашими виджетами для отчетов, чтобы протолкнуть их к нашему ViewComponents
.
Пример пары виджетов может выглядеть примерно так:
public interface IWidget<T>
{
WidgetType WidgetType { get; set; }
string WidgetName { get; set; }
T ViewModel { get; set; }
}
public class ChartWidget : IWidget<Chart>
{
public WidgetType WidgetType { get; private set; }
public string WidgetName { get; set; }
public Chart ViewModel { get; set; }
public ChartWidget() {
WidgetType = WidgetType.Chart;
}
}
public class HeadlineBarWidget : IWidget<HeadlineBarData>
{
public WidgetType WidgetType { get; private set; }
public string WidgetName { get; set; }
public HeadlineBarData ViewModel { get; set; }
public ChartWidget() {
WidgetType = WidgetType.HeadlineBar;
}
}
Но отчет будет содержать коллекцию виджетов, и эту коллекцию необходимо будет перебрать в представлении, чтобы выбрать нужные ViewComponents и предоставить им подходящую модель, которую они ожидают. К сожалению, кажется, что большинство типов коллекций должны обеспечивать безопасность типов, и мне нужен способ сделать это немного лучше. В нашем нынешнем виде наш IWidget
объект определяет ViewModel как object
, и я не думаю, что это хорошая практика.