n 层架构 - BLL、DAL 和接口。什么是最佳实践?

2024-04-15

我有一个关于 n 层架构的问题。在问这个问题之前,我想了很久,因为这里已经有很多类似的问题了……但是,在看了一天半并阅读了其他答案之后,我仍然不确定。各种看似相似的术语和不同的方法让我感到困惑。

如果我在不同的类库中有一个 BLL 和一个 DAL,则 BLL 和 DAL 之间通信的一种方法是利用一个接口,有点像在另一个单独的 DLL 中定义的 DTO,该 DLL 被 BLL 和 DAL 引用。 BLL 中的域模型实体将实现此接口,DAL 中的任何 ORM 生成的对象也将实现此接口。为了保存我的业务实体,我可以将它们传递给 DAL,DAL 会很好地接受它们,因为它们实现了共享接口。我还可以将对象传递回实现此接口的 BLL。这似乎是合理的,因为 BLL 和 DAL 都只需要了解基本接口,而不需要了解彼此的具体实现。

我的问题是在另一侧创建对象的最佳方法是什么?例如,如果我在 BLL 中有一个实现 IPerson 的 Person 对象,并且在 DLL 中有一个 PersonDataObject 或其他也实现 IPerson 的对象,那么我将 Person 传递给 DAL 中的一个方法,该方法采用 IPerson 参数,然后在 DAL 中我' d 必须重建 PersonDataObject 才能持久保存。这是最好的方法吗?

抱歉,我可能没有很好地解释这一点,因为我很困惑。对于傻瓜答案的最佳实践将不胜感激。


一般来说,BLL 中的对象将使用接口 - 而不是实现它们:

例如,如果我有一个 Person 对象 在实现 IPerson 的 BLL 中, 和一个 PersonDataObject 或任何东西 也实现 IPerson 的 DLL

以“人”为例:考虑与一个人相关的不同数据操作(获取单个人的所有数据、许多人的浅层数据集合、CRUD操作、搜索等) - 然后设计接口逻辑分组(参见接口隔离原则 http://en.wikipedia.org/wiki/Interface_segregation_principle).

这些接口可能代表以 BL 为中心的视角的操作,或者基于“服务”的视角。

无论如何,回答你的具体问题......

我在通用程序集中定义了 DTO 的等价物,并在单独的程序集中定义了数据接口 - 所以我有 4 个程序集:BL、数据访问接口定义、接口实现和通用;所有程序集都引用公共程序集。

我在 C#.Net 中工作,我将 DTO 定义为结构(但您可以使用类);并且它们的所有属性都是只读的 - 您可以在构造函数中将数据输入到它们中 - 这样 DTO 实际上是信息的“哑”信封。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

n 层架构 - BLL、DAL 和接口。什么是最佳实践? 的相关文章

随机推荐

  • 重置引导模式

    所以 我正在使用 bootstrap 的模态 我想制作一个向导风格的模态并提出以下解决方案 div 片段 div class modal instance hide fade div div div div style display no
  • android:theme="@style/AppTheme"中textAppearance的默认值是textAppearanceSmall吗?

    当我创建一个新的android项目时 默认主题是android Theme Light 我发现TextView控件的字体很小 这是否意味着 android theme style AppTheme 中 textAppearance 的默认值
  • UIMenuController 在 iOS 13.2 中不可见

    我有长按处理程序显示UIMenuController 它在 private func longPressHandler sender UILongPressGestureRecognizer guard sender state began
  • HMM 如何用于手写识别?

    这个问题与传统的手写识别有点不同 我有一个包含数千个以下内容的数据集 对于一个绘制的角色 我有几个连续的 x y 按下笔的坐标 所以 这是一个顺序 时间 问题 我希望能够根据这些数据对手写字符进行分类 并且希望实现 HMM 来实现学习目的
  • Dapper 是否支持在单个查询中插入多行?

    Does StackExchange Dapper https github com StackExchange Dapper支持以下SQL语法吗 INSERT INTO MyTable a b c VALUES 1 2 3 4 5 6 7
  • 在 Visual Studio 2013 中禁用 git

    我有一个由 tfs 管理的存储库 然而在本地 我想通过 git 管理它 并将更改推送到 tfs 一旦我在团队资源管理器中创建 git 存储库 VS2013 就会显示该解决方案仅由 git 管理 如果我尝试编辑任何文件 它会抱怨该文件是只读的
  • 如何通过php按修改日期对文件进行排序

    背景 我有一个匿名登录 ftp 服务器 ftp nlist 仅按字母顺序列出文件 我想根据上次修改日期获取文件列表 最近的在前 我尝试了 ftp exec conn ls t 但出现了 权限被拒绝 错误 不知道为什么它不起作用 好吧 我正在
  • 使用 Plot 的线图重叠

    我有以下用于图表的选项 div div
  • 通过浏览器使用 PDO 将 MySQL 表中的数据存储为 CSV

    我有一个将数据写入 MySQL 数据库的表单 我希望用户能够下载他们的数据CSV最终提交后的格式 我的代码当前正在将数据库的内容转储到浏览器中 即它被写入页面 而不是写入 csv 文件 我想将他们发送到一个链接并提供下载文件的选项 这是我当
  • 从互联网读取数据

    我在网络服务器上有一个包含数据的远程文件夹 我使用以下方式访问数据 myData lt read table http myData csv sep header T 有没有办法对远程文件夹进行密码保护并在上述命令中输入授权 Thx 你可以
  • 使用不受支持的 WebKit 属性会产生什么影响?

    我有兴趣使用 webkit line clamp在混合 iOS 应用程序中 我已阅读苹果文档 https developer apple com library safari documentation AppleApplications
  • 合并时忽略文件/文件夹

    我目前正在使用 SVN 对我的软件项目进行版本控制 在一个正在进行的项目中 我有用于客户通用功能和规范的主干 以及用于客户特定功能和规范的分支 有什么方法可以标记一些文件 文件夹 这些文件 文件夹不应在每次执行此类操作时合并到分支中 我没有
  • Python 在调用之前修饰函数

    我有一个由其他人编写的相当复杂的装饰器 我想做的是根据决定一次调用该函数的修饰版本 或者另一次调用原始函数 未修饰 这可能吗 With decorator original function Without original functio
  • 如果输入等于字符串,则执行某些操作... python 2.7 [重复]

    这个问题在这里已经有答案了 使用以下代码时遇到问题 start over 1 question input Do you wish to try again y n if question y start over 1 else raise
  • 如何使用 xsmtp-api 和 php 库向 SendGrid 中的电子邮件主题添加替换标签

    我正在尝试在电子邮件的主题中设置我的客户的姓名 这对我的申请非常重要 从我在SendGrid API 文档 http sendgrid com docs API Reference SMTP API substitution tags ht
  • 将 JComboBox 放入 JTable 中

    我想将单独的 JComboBox 放入 JTable 的每个单元格中 IE 每个单元格的 JComboBox 内容都不相同 我基本上希望能够调用以下代码来将一行 JComboBox 添加到 JTable 中 有人有什么想法吗 谢谢 JCom
  • 如何在移动滑块时锁定页面滚动

    在 Flutter 中 我有一个应用程序 在自定义 ListView 小部件内有一个自定义滑块 唯一的问题是 当您移动滑块手柄 从左到右 时 由于 ListView 页面仍然会滚动 向上和向下 而我需要页面锁定到位 直到用户停止移动滑块 我
  • 读取 NTFS 格式的 MFT

    在网上寻找如何读 写 MFT 的解释时 我发现了以下部分 http www installsetupconfig com win32programming 1996 20AppE apnilife pdf http www installs
  • 将 nl2br 与 html 标签一起使用

    I use nl2br当显示保存在某处的一些信息时 但是当使用 HTML 标签时我不想添加 br 他们的标签 例如 如果我使用 table th th table 它将被转换为 table br th th br table br 这为这张
  • n 层架构 - BLL、DAL 和接口。什么是最佳实践?

    我有一个关于 n 层架构的问题 在问这个问题之前 我想了很久 因为这里已经有很多类似的问题了 但是 在看了一天半并阅读了其他答案之后 我仍然不确定 各种看似相似的术语和不同的方法让我感到困惑 如果我在不同的类库中有一个 BLL 和一个 DA