延迟加载的 DAL 和 BLL

Posted

技术标签:

【中文标题】延迟加载的 DAL 和 BLL【英文标题】:DAL and BLL with Lazy Loading 【发布时间】:2011-04-03 13:18:07 【问题描述】:

如何在三层的上下文中实现延迟加载?我了解表示层、业务层和数据层的基本架构:

您的基本“哑”类几乎是数据库中表的镜像,但有一个例外。您可以引用所引用内容的实际实例,而不是外键 ID。例如:具有 Name/DOB/Title 属性的员工。

然后,对于这些类中的每一个,您都有一个提供 CRUD 操作的类以及您可能需要的任何自定义数据存储例程(调用与该对象一起使用的存储过程等)。如果您更改数据库,此类将被换出。例如:EmployeeDAL.Save(myEmployee)、EmployeeDAL.Get(myEmployee)(其中 myEmployee 填充了他们的 ID,但没有其他内容)

您有执行验证和不执行验证的业务层类。这些类中的方法通常通过调用 DAL 来保存信息或检索它来结束。当客户改变了他们对有效/无效数据构成的想法或想要改变某些计算的方式时,这种情况就会改变。

表示层与业务层交互以显示事物并将在 UI 中进行的插入/更新传送到较低层。例如:它遍历一个雇员列表并将它们显示在一个 html 表格中。

但是延迟加载引用的代码究竟会去哪里呢?如果表示层有一个刚刚显示的 Company 对象,并且正在开始显示 myCompany.Employees 的过程,那是如何实现的? myCompany 是镜像数据库表的哑类之一的实例,不应该知道如何检索任何内容。

您是否按照this 问题的答案建议并为每个对象创建一个虚拟版本?然后 DAL 级别对象可以具有指示是否已加载员工的变量并调用 DALEmployee.GetEmployees(this)?我觉得我好像遗漏了一些关于模式的重要内容......

【问题讨论】:

【参考方案1】:

如果您使用诸如 nHibernate 之类的预构建框架,这将使这一切变得更加容易,您可以在类/表映射以及运行查询时定义延迟加载。尽管 .NET 4 中的 System.Lazy 类可能会有所帮助,但要以一种简洁的方式自己完成它需要相当多的代码。

【讨论】:

我正在学习一门新语言,我真的宁愿第一次手工做所有事情,只是为了真正“得到它”。我专门使用 phpmysql,但我的大部分经验确实是在 .NET 世界中。

以上是关于延迟加载的 DAL 和 BLL的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 延迟加载和立即加载

延迟加载

mybatis探究之延迟加载和缓存

MyBatis延迟加载和缓存

MyBatis延迟加载和缓存

Hibernate检索策略之延迟加载和立即加载