【发布时间】:2017-03-15 11:38:14
【问题描述】:
我在一些我必须生成的报告中看到了一个反复出现的模式。这些报告是基于日期范围的报告,需要按不同级别汇总。
为简单起见,我们假设此报告在叶节点级别(最低级别)生成标题和配额。在行项目级别(这是各种叶节点的集合),我想汇总配额并提供单独的标题。这些订单项将进一步汇总到另一个级别,这将再次汇总配额并具有唯一的标题。
所以报告会是这样的:
ROOT LEVEL | Title = "Main Report" | Quota = 100
Month Level | Title = "Jan" | Quota = 100
Week Level | Title = "Week 1" | Quota = 25
Week Level | Title = "Week 2" | Quota = 75
我有没有办法使用复合模式来构建它?我尝试了很多方法。他们中的大多数都达不到要求,因为我无法有效地将配额汇总/汇总到更高的级别。
我可以像这样构建一个界面:
public interface IInventoryReportItem
{
string Title { get; set; }
int Quota { get; set; }
}
然后我可以像这样构建一个订单项:
public class LineItem : IInventoryReportItem
我也可以像这样建立一个集合:
public class LineItems : IList<IInventoryReportItem>, IInventoryReportItem
{
private readonly List<IInventoryReportItem> _subLineItems;
public LineItems()
{
_subLineItems = new List<IInventoryReportItem>();
}
我的报告会是这样的:
public class InventoryReport
{
public DateRange DateRange { get; set; }
public LineItems LineItems { get; set; }
}
我现在可以轻松地以分层方式构建报表,但我仍然需要从外部调用聚合函数,而不是它为我自动计算:
var report = new InventoryReport();
var week1Days = new LineItems
{
new LineItem {Quota = 20, Title = "Day 1"},
new LineItem {Quota = 10, Title = "Day 2"}
};
var week2Days = new LineItems
{
new LineItem {Quota = 10, Title = "Day 1"},
new LineItem {Quota = 10, Title = "Day 2"}
};
var week1 = new LineItems {week1Days};
week1.Quota = week1.Sum(x => x.Quota);
week1.Title = "Week1";
var week2 = new LineItems {week2Days};
week2.Quota = week2.Sum(x => x.Quota);
week2.Title = "Week2";
var month1 = new LineItems(new List<IInventoryReportItem> {week1, week2});
month1.Title = "January";
month1.Quota = month1.Sum(x => x.Quota);
report.LineItems = new LineItems(new List<IInventoryReportItem> {month1});
有没有办法让我仍然可以灵活地添加单个订单项或一系列项目,并且它还可以使用组合自动计算/聚合数据?
任何帮助都会很棒!
谢谢你, 阿努普
【问题讨论】:
-
为
LineItems'Quota属性实现一个getter,检查其自身的长度,如果大于0,则对其子Quotas 求和。我不确定这是否符合“复合模式”,但我不会让模式妨碍有效的代码。
标签: c# design-patterns