我在寻找指针和信息在这里,因为我怀疑它有没有单一的一个正确的答案,我会做这个CW。 这是C#,所以我对下面的LINQ提供一些参考。 我也道歉了长期职位。 让我在这里总结一下问题,然后充分的问题如下。
小结:在UI / BLL / DAL / DB 4层应用,如何才能改变到用户界面,以显示更多的列(比如在一个网格),避免通过业务逻辑层并进入数据访问层泄漏,以得到的数据保持显示(假设它已经在数据库中)。
假设3(4)层的多层应用程序:
- 用户界面(UI)
- 业务逻辑层(BLL)
- 数据访问层(DAL)
- 数据库(DB;所述第四层)
在这种情况下,DAL是负责构建SQL语句并执行这些针对数据库,返回数据。
是“正确”构建这样一个层,只是始终做到“SELECT *”的唯一途径? 对我来说,这是一个很大的禁忌,但让我解释一下为什么我想知道。
比方说,我想,我的UI,显示有积极的就业记录所有员工。 “活性”我的意思是就业记录从到日期中含有今日(或者甚至一个日期,我可以在用户界面中设置)。
在这种情况下,比方说我要发一封电子邮件给所有的人,所以我在确保我尚未送出电子邮件给同样的人已经是BLL等一些代码
对于BLL,它需要最少量的数据。 也许它调用了数据访问层获得在职职工该名单,然后打电话把它发出了电子邮件的列表。 然后,它加入这些,构建一个新的列表。 也许,这可能是与数据访问层的帮助下完成,这并不重要。
最重要的是,对于业务层,那里真的没有它需要大量的数据。 也许它只是需要为每个员工的唯一标识,为两个列表,以配合在,然后说:“这些是积极的,你还没有发出一封电子邮件给这些的唯一标识符”。 我然后构造构造SQL语句只检索什么业务层的需求DAL代码? IE浏览器。 只是 “SELECT ID FROM雇员WHERE ...”?
我怎么为用户界面怎么办呢? 对于用户来说,这或许会是最好的,包括了很多信息,这取决于我为什么要发送电子邮件。 举例来说,我可能要包括一些基本的联系信息,或他们工作的部门,或者他们的经理的名字,等等,不是说我至少姓名和电子邮件地址信息显示。
如何在UI获得这些数据? 难道我改变DAL,以确保我返回足够的数据返回给用户界面? 难道我改变BLL,以确保它的UI返回足够的数据? 如果从DAL返回BLL返回的对象或数据结构可以被发送到用户界面,以及,也许BLL不需要改变太多,但随后的UI影响的要求超出了它应该与通信的层。 如果这两个世界上不同的数据结构进行操作,变化可能会不得不做两个。
什么那么当UI改变,以帮助用户更进一步,通过添加更多的列,有多深会/我应该在为了改变UI去? (假设数据存在于已经因此需要有没有变化的数据库)。
已经拿出一个建议是使用LINQ到SQL和IQueryable的,所以,如果DAL,与涉及的内容(如在什么类型的数据),为什么(如在WHERE子句)返回IQueryables,业务逻辑层能潜在回报那些一直到UI,然后可以构建一个LINQ查询,将检索所需要的数据。 然后,用户界面代码可以拉它需要的列。 这工作,因为与IQuerables,用户界面最终将实际执行查询,然后它可以使用“选择新{X,Y,Z}”来指定它需要什么,而在其他表,如果需要的话甚至加入。
这看起来凌乱我。 该UI执行SQL代码本身,尽管它一直隐藏一个LINQ前端的后面。
但是,要做到这一点,在BLL或DAL不应该被允许关闭数据库连接,并在一个IoC类型的世界中,DAL-服务可能会被设置在略高于UI代码更快的希望,使LINQ查询可能只是结束与异常“无法访问已释放的对象”。
所以我在寻找指针。 我们如何为期不远是? 你是如何处理的呢? 我认为,要改变用户界面将通过BLL进入DAL一个非常糟糕的解决方案泄漏的事实,但现在它看起来并不像我们可以做的更好。
请告诉我,我们是多么的愚蠢和证明我错了吗?
并指出,这是一个遗留系统。 更改数据库模式是不是在范围几年还,所以一个解决方案中使用ORM对象将基本上做相当于“SELECT *”是不是一个真正的选择。 我们有我们想避免穿过层的整个列表拉了一些大表。