1

我开始了我的网站,比如 stackoverflow,我想要偿还一点技术债务。作为一名合同开发人员,我去过很多地方,看到了很多不同的方法来实现这个结果,但我要走的路是……

演示文稿(网络)

业务层(老式实体类和 BL 层)

数据层(通过存储过程到 SQL Server 的 DA 类)

我的问题主要涉及业务层。现在我有一个实体命名空间和一个业务逻辑命名空间。

提单提到了 DA 和实体。实体有对 DA 的引用(DA“不知道”提单或实体)

我真的希望将数据转换为实体的所有工作都发生在 BL 中——也就是业务逻辑中。但是,如果需要,我希望实体能够访问 BL,从而删除实体对 DL 的引用。

所以...

将 BL 和 Entity 对象放在同一个命名空间中以便它们可以一起工作是“错误的”吗?

本质上,我正在尝试拥有一个像 Employee 这样的实体对象(经典示例,嗯?)并让 Employee 有一个

public Hashtable[] SubordinateEmployees

该属性返回向该员工报告的其他员工对象的哈希表。但我不想在需要之前加载它。因此,对于大多数员工来说,该属性永远不会被访问,但当它访问时,它会通过调用 BL 来自动加载,而 BL 会调用 DA。

这个问题有意义吗?

如果是这样,我的解决方案是吗?

提前非常感谢!

4

2 回答 2

2

处理您的示例所代表的那种情况的常用方法是使用外观。您无需尝试从 Employee 对象中获取下属员工,而是使用对业务逻辑的调用来获取它。

hashtable = BL.GetSubordinateEmployees(supervisor);

这样,您就可以通过单点访问下属,并且只有一件事(BL)访问数据层并创建实体。

于 2009-03-03T19:12:50.583 回答
2

让我看看我能不能告诉你一个更好的方法来思考这个问题

你有你的数据访问权限(sql server、mysql、flat xml 文件等)所有这些都应该被抽象掉,你的应用程序中没有其他东西应该关心或知道你是如何获取数据的,只要它剂量,如果有其他知道的话你如何获得你的数据你有一个图层违规。如果 DAL 执行任何其他操作,则获取数据,您有层违规。接下来,您实现业务层使用的类似 IDAL 的数据访问接口,这对于通过强制分离层来使您的代码可测试非常重要。

您的数据实体可以放置在 DAL 名称空间中,也可以将它们放在那里,给它们自己的力量分离。数据实体是愚蠢的对象,应该包含很少甚至没有逻辑,并且只知道它们自己和它们拥有的数据,它们不包含业务逻辑!、数据访问逻辑或 UI 逻辑。如果他们这样做,你有一个图层违规。数据实体的唯一功能是保存数据并从一层传递到下一层。

Biz 层实现了一个数据访问接口,就像我们讨论过的 IDAL 一样,您可以使用工厂、IOC 容器或其他所有失败的具体类型来实例化它,但添加一个 setter 属性以便可以更改它以进行测试。商务层只处理业务逻辑,它不知道也不关心数据来自哪里或去往哪里,它只关心操作数据以符合业务规则,这将包括日期验证、过滤(其中一部分是告诉 DAL 它需要什么数据,让 DAL 弄清楚如何获取它)。基本上,BIZ 处理与 UI 相关或与数据检索无关的所有逻辑。就像 DAL 一样,出于同样的原因,Biz 应该实现一个接口。

UI 层访问 Biz 层的方式与 Biz 层访问 DAL 的原因相同。UI 层关心的只是显示数据和从用户那里获取数据。IU 层不应该知道任何关于业务规则的信息,除了填充数据实体所需的数据验证。

这种架构的优点是它强制关注点分离,使其更易于测试、更灵活且更易于维护。今天你正在建立一个网站,但明天你想允许其他人集成一个 Web 服务,你所要做的就是创建一个实现 IBIZ 接口的 Web 服务,当你必须修复 BIZ 中的错误时,你就完成了层,它已经在您的网站和网络服务中修复。

将其提升到一个新的水平,假设您正在进行大量繁重的数字运算,并且您需要更强大的服务器来处理此问题,因此您所要做的就是实现一个 IDal 和 IBIZ 接口,它们实际上是处理通信的 WCF 的包装器在您的服务器之间,现在您的应用程序分布在多个服务器之间,您无需更改代码即可。

于 2009-03-03T20:31:07.290 回答