Моделирование коллекций со связанной статистикой и NHibernate - PullRequest
0 голосов
/ 03 июня 2009

В настоящее время я пытаюсь провести рефакторинг приложения, в котором много мест, где отображаются списки или таблицы данных, с итоговыми или средними значениями в конце и процентными изменениями или совокупными итогами для каждой записи.

Как правило, коллекция моделируется как список объектов, а другие данные рассчитываются в коде aspx (yuck). Я хотел бы перенести эту логику в мою модель, чтобы сделать ее тестируемой и пригодной для повторного использования.

Лучшее, что я могу придумать на данный момент, - это создать класс коллекции, в который будут добавлены все эти объекты. Эта коллекция может затем выставить свойства, которые представляют различные статистические данные. Как это:

public class DailySales
{
    public DateTime Date { get; set; }
    public decimal Value { get; set; }
}

public class SalesCollection
{
    public List<DailySales> Sales { get; private set; }

    public decimal TotalSales
    {
        get { return Sales.Sum(x => x.Value); }
    }
}

Это хорошо работает для итогов. Но теперь мне нужно рассчитать% изменения за каждый день. Я могу добавить это к ежедневным продажам, а затем обновить его из класса коллекции, который также, кажется, работает довольно хорошо. За исключением того, что это делает его сохранение с помощью Nhibernate довольно сложным, поскольку нет способа вызывать события из списка продаж, к которым SalesCollection может подключиться, и рассчитать другую статистику.

Полагаю, я ищу чистый способ моделирования данных такого типа, который можно легко сохранить в Nhibernate.

1 Ответ

1 голос
/ 03 июня 2009

Я бы оставил вашу коллекцию в покое, и разоблачить это как-то так

private IList<DailySales> _dailySales;
public IEnumerable<DailySales> DailySales
{
  get
  {
     return _dailySales;
  }
}

, а затем просто создайте методы расширения для IEnumerable, которые будут выполнять ваши вычисления.

public static decimal CalculateSomething (this IEnumerable<DailySales>sales)
{
   return {your calculation here}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...