在我看来,您应该始终在 Web 层和 DAL(数据访问层)之间使用 BLL(业务逻辑层)。
我很欣赏对于一些更“简单”的查询,BLL 将密切模仿 DAL(例如获取所有国家/地区,获取所有产品类型等),但老实说,即使在您的示例中:
(获取所有姓氏为“Atwood”的客户)
这里表达了“业务逻辑” - 如果没有别的,希望按姓氏过滤数据记录!
通过从项目一开始就实施 BLL,在需要时插入验证或附加“逻辑”变得非常容易(如果您的项目是商业应用程序,那么几乎肯定会最终出现这种需求,如果它不是'在项目开始时不在那里)。添加其他逻辑,例如:
获取所有今年花费超过 10000 美元的客户
或者
不允许姓“阿特伍德”的顾客购买超过 1000 美元的商品
当涉及到真正的 BLL 时,它变得非常容易,而不是试图将这个逻辑推入 Web 层。
请记住,对于上述类型的查询,我们几乎可以肯定地谈论多个实体和数据库表,它们必须通过特定定义的关系连接在一起才能实现此功能。试图通过直接操作 DAL 来实现这一点变得很麻烦,因为您将处理多个实体和类。此处的 BLL 将大大简化您的 Web 层代码,因为 BLL 将把这些实体关系封装在一个大大简化的接口后面。
当需要更改用户界面时,这种“关注点分离”变得越来越重要。
现在至少有两个不同的场合,我曾在具有网站用户界面的商业 Web 应用程序上工作,并且最终被要求(由于客户寻求在其软件产品中进行更大程度的集成而产生的业务需求)生成Web 服务界面提供与网站完全相同的功能。
如果我在我的 Web 层中嵌入了任何业务逻辑,我将不得不在实现我的 Web 服务时复制并重新编写该逻辑。事实上,我确保所有业务逻辑都封装在 BLL 类中,这意味着我只需要设计一系列 Web 服务接口方法调用,并将它们插入到 BLL 类上的方法调用中(我实际上使用了外观设计模式用于简化 Web 服务 API)。
总之,我想不出任何理由不在我的 DAL 和我的 Web 层之间包含 BLL 层。
最简单的情况是,当 BLL 密切“模仿” DAL 时,是的,确实存在代码和功能的重复,但是,虽然需要更多的输入,但这也使得它相对容易实现。
当涉及更多时(例如从一开始就存在重要的业务逻辑时),关注点分离有助于减少重复(DRY原则),同时显着简化未来和持续的维护。
当然,这假设您正在“手动”完成所有这些工作。如果您愿意,您可以通过使用有很多ORM来显着简化 DAL/BLL/UI 层!(即LINQ-to-SQL/Entities、SubSonic、NHibernate等)