gpt4 book ai didi

c# - 数据访问层中的计算

转载 作者:行者123 更新时间:2023-11-30 22:10:08 24 4
gpt4 key购买 nike

我正在使用 n 层方法将大型经典 ASP Web 应用程序转换为 ASP.Net MVC。在我的 DAL 中,我使用 ADO.Net 查询数据库并将查询转换为对象。我还有一个用于计算和验证之类的 BLL。

我的问题涉及在需要计算以将查询转换为对象时在 DAL 中执行计算。举个例子,考虑一个包含摘要信息和行项目的发票系统:

public class Invoice
{
public int InvoiceID { get; set; }
public DateTime InvoiceDate { get; set; }
public decimal InvoiceTotal { get; set; }
public List<InvoiceLineItem> LineItemList { get; set; }
}

所以我在数据库查询中转换行项目的代码如下所示:

decimal InvoiceTotal = 0;
var LineItem = new InvoiceLineItem();
while (Reader.Read())
{
LineItem.ItemID = Extensions.SafeGetInt(Reader, "ItemID");
LineItem.Price = Extensions.SafeGetDecimal(Reader, "Price");
LineItem.Quantity = Extensions.SafeGetInt(Reader, "Quantity");
LineItemList.Add(LineItem);

InvoiceTotal = InvoiceTotal + (LineItem.Price * LineItem.Quantity);
}

Invoice.InvoiceTotal = InvoiceTotal;
etc ...

所以这是我的问题:考虑到我的 n 层架构,我的 DAL 是否适合执行 InvoiceTotal 计算?考虑到 BBL 的部分工作是执行计算,这是否违反了 DAL 和 BLL 之间的关注点分离?或者我是否过于字面地理解了 BBL 执行计算的功能,如果需要这些计算来填充模型,则可以在 DAL 中进行计算?我发现在 DAL 中进行 InvoiceTotal 计算很有吸引力的一个原因是因为我只需要在发票项目记录上迭代一次。如果我在别处创建了一个单独的 InvoiceTotal 函数来获取 InvoiceTotal,那么我将不得不再次遍历记录。

编辑:原来真正的问题不是 DAL 中是否应该允许计算,而是 InvoiceTotal 是否应该在我的模型中。从数据库规范化的角度来看,这不是必需的,因为总计可以从行项目中计算出来。在那种情况下,InvoiceTotal 不应在我的模型中,而应在我的 ViewModel 中,在这种情况下,无需在我的 DAL 中进行计算。出于性能原因,我可以忽略数据库规范化问题,并将 InvoiceTotal 包含在我的模型中,但如果是这种情况,我会将 InvoiceTotal 持久保存到数据库中,在这种情况下,当填充我的模型时,不需要计算,因为我只是从中提取值数据库。

经验教训:如果我想在我的 DAL 中进行计算,我的模型可能有缺陷。

最佳答案

我会将计算添加到业务逻辑层

发票总额的初始计算应该在您将其写入数据库之前在应用程序中可用,因此您不希望在检索记录时唯一计算总额的地方。

将其添加到业务逻辑层的另一个很好的理由是,它可以从 DAL 返回的行数据中派生出来,这将使 DAL 层专注于写入和读取数据。这也使您的计算集中在一个地方。

然而,由于发票总额在发送后是固定的,您可能希望在第一次保存时写入初始值,然后允许手动修改。在这种情况下,发票总额计算将在业务层完成,但该值也将写入数据库并从数据库中检索,无需重新计算。

关于c# - 数据访问层中的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21064074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com