业务层 (BLL) 数据访问层 (DAL) 和 UI 之间的通用结构?
Posted
技术标签:
【中文标题】业务层 (BLL) 数据访问层 (DAL) 和 UI 之间的通用结构?【英文标题】:Common structures between business layer (BLL) data access layer (DAL) and UI? 【发布时间】:2012-11-27 03:01:44 【问题描述】:我希望我的所有层 BLL、DAL 和 UI 共享类(具体或接口)。
这真的是个坏习惯吗?
我不希望从我的 DAL 方法返回数据表,而是返回 BLL 可以直接使用的对象。
我想要一个单独的 VS 项目,其中包含所有层都应该知道的类。
示例:我想定义一个所有层都应该知道的很多类。 UI 应该能够接收批次类,以便显示或使用户能够提交要处理的批次。此外,DAL 应该能够使用批次类查询数据库并返回它们。另一方面,BLL 应该获得这些批次并将业务规则应用于它们。
如果这是完全错误的,还有哪些替代方案?
【问题讨论】:
【参考方案1】:我希望我的所有层 BLL、DAL 和 UI 共享类(具体或 接口)。
这取决于什么类型的课程。如果您需要它们来访问公共域实体,那么当然可以。
重要的部分是您允许这些层对这些类做什么。您的客户端/UI 层不应该通过一些集中的业务逻辑来修改域实体(并保留它们)。这意味着您的 DAL 不应被您的 UI 访问,尽管它们都可以共享公共实体、接口等...
一种常见的方法是这样的:
UI -> BLL -> DAL -> 持久性存储(数据库、文件等...)
这些层中的每一层都可以访问公共类。只要 UI 不能直接访问 DAL,就应该没问题。为此,您有两种选择:
使 BLL 可通过服务(WCF 等...)访问 将 DAL 和 BLL 放在同一个项目中,并将 DAL 设为内部,以便只有 BLL 可以访问它你最终会得到类似的东西:
UI -> 服务 -> BLL -> DAL -> 持久性存储(数据库、文件等)
我强烈推荐 Martin Fowler 的 Patterns of Enterprise Application Architecture。它将为您分层应用程序提供良好的基础。
我不想从我的 DAL 方法返回数据表,而是 返回 BLL 可以直接使用的对象。
这是个好主意。这就是ORM 的想法发挥作用的地方。 DAL 通常知道如何与 DB 对话,并且 DAL 还将知道如何将特定于 DB 的结构转换为您的域模型。域实体进出 DAL。在 DAL 中,域实体在持久化数据时被转换为特定于 DB 的结构。反之亦然:当 BLL 请求数据时,DAL 检索数据并将其转换为域实体,然后再将其传回。
【讨论】:
【参考方案2】:为了快速回答您的问题,人们通常会创建 POCO 类和/或 DTO 在 DAL BLL
之间进行通信的对象【讨论】:
以上是关于业务层 (BLL) 数据访问层 (DAL) 和 UI 之间的通用结构?的主要内容,如果未能解决你的问题,请参考以下文章