2009-06-03 8 views
0

Je suis actuellement en train de tenter de refactoriser une application qui a beaucoup d'endroits où elle affiche des listes ou des tables de données, avec des totaux ou des moyennes à la fin et des pourcentages ou des totaux cumulatifs. record.Modélisation de collections avec statistiques associées, et NHibernate

Typiquement, la collection est modélisée comme une liste d'objets et les autres données sont calculées dans le code aspx derrière (yuck). Je voudrais déplacer cette logique dans mon modèle afin de le rendre testable et réutilisable. Le mieux que je peux trouver en ce moment est de créer une classe de collection à laquelle tous ces objets sont ajoutés. Cette collection peut ensuite exposer des propriétés qui représentent diverses statistiques. Comme ceci:

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); } 
    } 
} 

Cela fonctionne bien pour les totaux. Mais maintenant je dois calculer un% de changement pour chaque jour. Je peux ajouter ceci aux ventes quotidiennes, et puis le mettre à jour de la classe de collection qui semble également fonctionner très bien. Sauf qu'il rend difficile la persistance avec Nhibernate car il n'y a aucun moyen de tirer des événements de la liste des ventes que le SalesCollection peut accrocher et calculer les autres statistiques.

Je suppose que ce que je cherche est une manière propre de modéliser ce type de données, qui peut être persisté pour Nhibernate facilement.

Répondre

1

Je laisserais votre collection seul, et d'exposer est aussi quelque chose comme ça

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

puis il suffit de créer des méthodes d'extension pour IEnumerable qui feront vos calculs.

public static decimal CalculateSomething (this IEnumerable<DailySales>sales) 
{ 
    return {your calculation here} 
} 
Questions connexes