- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!