【问题标题】:Data Transfer Objects and Reporting数据传输对象和报告
【发布时间】:2012-06-05 06:48:10
【问题描述】:

我有这些场景:

//This class maps to the "Item" table in the database
public class Item
{
   public int itemID { get; set;}
   public string itemName { get; set; }
   public int quantity { get; set; }
}

//Items record are returned from the database as list    
List<Item> items = ItemDAO.GetItems();

我想生成一个包含聚合值的报告(来自查询/存储过程)

ItemID| ItemName | Qty | QtySoldThisMonth | QtySoldThisYr
-----------------------------------------------------------
123   | Vit. C   |  20 |   55             |    400
239   | Maloxin  |  25 |   12             |    210

Item 类没有这些额外的字段 使用可能具有不同列数的数据表会更容易,但我使用的是列表

请问,我该怎么做

【问题讨论】:

  • QtySoldThisMonth 和 QtySoldThisYr 是生成的值。不能有这个专栏。你的表中有日期列吗?
  • @Pranalee 为什么选择日期栏?我知道如何获取这些值,在我的报告中显示它们是问题
  • @Shoaib Shaikh 感谢您的链接。我已经阅读了内容,它增加了我的知识。但是你能在 ItemDAO.GetItemsByXXX() 中返回一个匿名类型吗?
  • 不,您不能从任何方法中返回匿名类型。但你可以将匿名类型绑定到 UIControls

标签: c# .net oop design-patterns data-transfer-objects


【解决方案1】:

您始终可以专门为该聚合视图创建另一个 DTO 并在您的报告中使用它。

比每个视图的特定 DTO 更通用的解决方案是为 Item 的报告创建 DTO,并使用字段集合而不是类属性在 DTO 中存储聚合值。

例如:

 class AggregatedReportField {
     public string FieldName { get; set; }
     public decimal FieldValue { get; set; }
 }

 class ItemReportDTO {

     public Dictionary<string, AggregatedReportField> ReportFields { get; private set; }

     public ItemReportDTO()
     {
         ReportFields = new Dictionary<string, AggregatedReportField>();
     }

     public void Add(AggregatedReportField field)
     {
         if (!ReportFields.ContainsKey(fieldl.FieldName))
              ReportFields.Add(field.FieldName, field);
     }
 }

在您的 DAO 中,您将首先从数据库中获取值,为每个值创建 AggregatedReportField 实例,并将它们与名称一起添加到您的 DTO。在您的报告中,您必须使用 DTO.ReportFields["SomeValue"].FieldValue 引用您的聚合值。

上面的代码只是一个例子,包含一些不好的做法(暴露的字典)。

【讨论】:

  • 这意味着对于我的报告的每一个变体,我都必须创建一个新的 DTO?
  • 你可以这样,是的。我使用字典. 用另一个更通用的解决方案更新了我的答案
【解决方案2】:

我建议您将实体(如项目)和报告行(包含其他字段)分开。

我认为,你必须选择:

  1. 创建单独的类来表示每个报告(或报告的行)
  2. 创建代表所有报告的类(它将包含有关列和所有数据的元数据)

您应该选择什么取决于您的要求。这些报告可以在 java 代码中使用 DAO 和聚合值,或者直接调用存储的函数而不使用 DAO。

【讨论】:

    【解决方案3】:

    我认为在您的情况下,如果您想要一些 BLL 类库在 DTO 列表中为您提供编译的报告,您应该为报告创建专门的 DTO。您所能做的就是使用类继承来避免冗余代码。这就是你所能拥有的一切。

    public class AggregatedItem:Item
    {
    public int QtyMonth {get;set;}
    public int QtyYear {get;set;}
    }
    

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多