这个问题不让我睡觉,因为一年以来,我试图找到一个解决方案,但是...在我的脑海中仍然没有发生任何事情。可能你可以帮助我,因为我认为这是一个非常普遍的问题。n层应用程序中的实体框架 - 懒惰加载与急切加载模式
我有一个n层应用程序:表示层,业务逻辑层,模型层。假设为了简单起见,我的应用程序在表示层中包含允许用户搜索客户的表单。现在用户通过用户界面填充过滤器并点击一个按钮。发生某些事情并且请求到达表示层,如CustomerSearch(CustomerFilter myFilter)
。这个业务逻辑层现在保持简单:在模型上创建一个查询并获取结果。
现在的问题是:您如何面对加载数据的问题?我的意思是业务逻辑层不知道那个特定的方法会被这个表单调用。所以我认为它不知道请求表单是否只需要客户对象或客户对象与链接的订单实体。
我试图更好地解释: 我们的表单只是想列出按姓氏搜索的客户。它与订单无关。因此,业务逻辑查询将如下所示:
(from c in ctx.CustomerSet
where c.Name.Contains(strQry) select c).ToList();
现在这个工作正常。两天后,您的老板会要求您添加一张表单,让您可以像查找其他客户一样搜索客户,并且需要显示每位客户创建的订单总数。现在我想重复使用该查询并添加附加的逻辑(包括)订单并返回。
你会如何面对这一要求?
这是我从现在开始的最好的(我认为)的想法。我想听听您的意见: 在BLL我CustomerSearch方法不直接创建查询,但通过该构成的ObjectQuery像私有扩展方法:
private ObjectQuery<Customer> SearchCustomers(this ObjectQuery<Customer> qry, CustomerFilter myFilter)
和
private ObjectQuery<Customer> IncludeOrders(this ObjectQuery<Customer> qry)
但这并不能说服我,因为它看起来太复杂了。
感谢, 马尔科
感谢您的非常非常快速的答案。所以你认为这是一个在演示层而不是业务实体中使用DTO的情况? 谢谢 Marco – Marconline 2010-04-10 00:02:28
听起来好像您的应用程序正在接近它值得的大小/复杂性点。在转向DTO时总是有一个权衡,因为它们总体上增加了复杂性,但像Automapper这样的工具可以减少它变得有价值的点。 – 2010-04-10 00:36:49
感谢您的建议。我会绝对检查DTO和Automapper。再次感谢你。 – Marconline 2010-04-10 09:07:51