2009-01-15 71 views
3

好吧,所以我想获得有关此主题的意见。数据建模问题 - 数据和计算和访问逻辑的分离

我有一个愚蠢的数据对象 - CustomerOrder。

CustomerOrder有一个价格和数量,但也有一个TotalCash属性(价格*数量)。所以我有一个totalCash属性,但我不想直接将计算放入对象中,因为这会打破哑数据对象规则。我确实需要在整个应用程序中一遍又一遍地获得现金流量,所以我需要集中计算。我可以创建一个cashFlowCalculator类并传入一个customerOrder,但我不希望每个简单计算都有另一个类。

任何想法或最佳实践?

+0

您正在使用数据集和数据表? – 2009-01-15 04:31:35

回答

1

在同样的情况下,我会打破“哑数据对象规则”,因为我不希望经常改变特定的计算。我可能会把它作为一个getter来实现。

对于更复杂的场景,创建一个OrderCalculator类来接收与订单相关的类并且可以执行各种计算(例如包含的税,测量边际等)是有意义的。通过这种方式,您可以委托在CustomerOrder之外执行计算。例如,CustomerOrder不需要知道德克萨斯州的州税来确定是否需要销售税。

0

我理解保持数据对象与业务逻辑分离的基本原理。对设计器生成的类使用LINQ,我感到很自在用包含业务逻辑的分部类实现来扩展生成的类。我觉得这足以满足我的需求。如果这不起作用,那么我会同时拥有数据对象和业务对象 - 可能与1-1对应,也许不对。工厂类或方法可用于在您的业务对象和数据对象之间进行翻译。然后,只需在业务对象中实现业务逻辑,而不需要用于计算的辅助对象。

0

为什么不采用扩展方法?

public sealed class CustomerOrder 
{ 
    public decimal Price; 
    public decimal Quantity; 
} 

public static class CustomerOrderExtensions 
{ 
    public static decimal GetTotalCash(this CustomerOrder data) 
    { 
     return data.Price*data.Quantity; 
    } 
} 

你甚至可以将你的扩展静态类移动到不同的命名空间。

0

如果这是从数据表更新的数据传输对象(DTO),我会建议在该表中添加一个TotalCash Datacolumn,并将datacolumn Expression属性设置为“price * quantity”。在从数据表中更新的哑(DTO)类中创建一个TotalCash只读属性。从OO角度来说,它应该做的方式。

0

另一个选择[对于这里的复杂事物可能太简单了;-)]是让哑数据对象具有计算字段的属性,但让检索数据的SQL查询执行计算(一次) ;使这些领域的只读当然

0

我想你应该考虑,如果你真的想TotalCash是一个计算/导出的财产......

考虑 - 如果计算中的业务逻辑的变化,具有TotalCash 现有记录的属性改变追溯可能是不希望

我会考虑做财产DTO的非计算成员,或许还可以使用用于确定设定值的TotalCostCalculation服务类。

只是我的2美分。

0

我会在你的DTO中计算TotalCash(这将是YAGNI)。如果将来您需要更改TotalCash的行为,那么可以考虑使用TotalCashCalculator并通过DI将其传递到订单中。