n层不使用ORM,如何界面中指定它所需要的数据,以显示数据库应用程序?(N-layered data

2019-08-17 08:04发布

我在寻找指针和信息在这里,因为我怀疑它有没有单一的一个正确的答案,我会做这个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 *”是不是一个真正的选择。 我们有我们想避免穿过层的整个列表拉了一些大表。

Answer 1:

使用一个视图模型(或数据传输对象),这些UI消费箱子的概念。 这将是BLL的工作,把这些对象,如果该数据不完整,要求额外的数据(我们称之为模型)。 然后BLL可以做出什么视图模型返回正确的决策。 不要让你的模型(数据)细节渗透到用户界面。

UI <-- (viewmodel) ---> BLL <-- (model) --> Peristence/Data layers

这种分离允许按比例你的程序更好。 持久性独立性,我认为很自然地落在了这种方法,因为视图模型的构造和规格可以灵活地在BLL使用linq2ql或其他ORM技术来完成。



Answer 2:

这是不是在所有容易解决的问题。 我见过很多尝试(包括你所描述的IQueryable的做法)是完美的,但没有。 不幸的是,我们仍在等待完美的解决方案。 在此之前,我们将不得不凑合着缺陷。

我完全同意,DAL关切不应该被允许通过泄漏到上层,所以绝缘BLL是必要的。

即使你没有在当前项目中重新定义了数据访问技术的奢侈品,它仍然可以帮助思考的领域模型持久性无知的条款。 持久性无知的corrolary是,每个域对象是具有如数据库列中没有的东西,概念一个独立的单元。 最好是执行数据integretiy作为这样的对象不变量,但是这也意味着,被实例化的域对象将具有加载的所有它的组成数据。 这是一个非此即彼的命题,所以关键变得找到保证了良好的域模型,每个域对象保持(和必须装载)数据的“适当”量。

太颗粒状物体可能导致健谈DAL接口,但过于粗粒度的对象可能会导致被装入了太多不相关的数据。

一个非常重要的工作是分析和正确的,使他们掌握平衡的域模型的建模聚集。 这本书领域驱动设计包含建模聚集的一些很有启发的分析。

它可以在这方面帮助的另一个策略是瞄准应用好莱坞原则尽可能地。 主要的问题你描述的担忧查询,但如果你能转移你的注意力更面向命令,你可以定义不要求你永远载入了过多的数据多一些粗粒度接口。

我不知道任何简单的解决这个挑战的。 还有像我上面所描述的,可以帮助您解决一些技术问题,但最终它仍然是一门艺术,需要经验,技巧和纪律。



文章来源: N-layered database application without using an ORM, how does the UI specify what it needs of data to display?