使用 DTO 和 BO

2024-04-22

我对 DTO/BO 的疑问之一是何时传递/返回 DTO 以及何时传递/返回 BO。

我的直觉告诉我始终将 NHibernate 映射到 DTO,而不是 BO,并且始终传递/返回 DTO。然后,每当我需要执行业务逻辑时,我都会将 DTO 转换为 BO。

我这样做的方法是,我的 BO 将有一个构造函数,该构造函数接受一个参数,该参数是我的接口类型(定义所需的字段/属性),我的 DTO 和 BO 都将其作为唯一参数实现。

然后我就能够通过在构造函数中传递 DTO 来创建我的 BO(因为两者都实现相同的接口,它们都具有相同的属性),然后能够使用该 BO 执行我的业务逻辑。然后我还有一种方法将 BO 转换为 DTO。

然而,我也看到人们似乎只在后台使用 BO,并且只在后台使用 DTO,而对于用户来说,看起来好像没有 DTO。

与始终使用 BO 相比,此架构有哪些优点/缺点?

我应该总是传递/返回 DTO 或 BO 还是混合匹配(看起来混合和匹配可能会让人困惑)?


这取决于您希望实现什么目标。我可以告诉你我自己做了什么 - 我在 NHibernate 中映射了 DTO 和 BO,但是 DTO 被映射为不可变的,因此我不会在不使用 BO 的情况下无意中更新数据库。

Web 服务中可访问的所有查询都会返回/接受 DTO。

每当从 DTO 更新时,我都会执行一个 UnitOfWork,在其中加载 BO,更新 DTO 的属性,如果它仍然有效,则再次保存它。

在客户端,每当客户端需要修改 BO 时,我都会从 DTO 创建 BO(AutoMapper 在这里绝对是一个有效的选择)。 BO 有一个构造函数,它接受所有参数来创建它,类似于 NHibernate 的做法。

好处是: * 完全控制通过线路传输的数据量(DTO 通常是扁平化的,因此在第一次调用中仅发送关联类的 ID)。 * 我不必在两者中具有相同的属性 * 我可以根据需要混合搭配延迟加载 * 我可以在 DTO 中利用标量查询和其他计算属性,而无需在 BO 中创建它们。 * 对于不同的场景,每个 BO 可以有多个不同的 DTO。

所以,我想这符合混合和匹配的条件,但有明确的指导方针,我应该做什么:-)

希望这可以帮助。

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

使用 DTO 和 BO 的相关文章

随机推荐

  • 从 ggraph 网络图表中检索节点坐标

    假设我制作了这个图表 library ggraph library igraph my chart lt graph from data frame highschool set seed 2017 ggraph my chart layo
  • React - 组件内动态创建列表项

    有什么办法可以添加动态li元素融入我的ul列表 我想添加我的li单击按钮 这是示例代码 class Component1 extends React Component constructor super add let ul docume
  • 如何在一个解决方案中为两个单独的项目在 asp.net core 中设置路由?

    我创建了两个 asp net core mvc 项目 它们分别工作正常 每一个在其 startup cs 文件中都有自己的路由 当我启动它们时 它们运行良好 我的问题是 如何从第一个项目设置第二个项目路线 我应该在第一个项目中更改哪里 我应
  • 如何使用 Microsoft.Office.Interop.Excel 从 Excel 导入数据集?

    我想做的事 我正在尝试使用Microsoft Office Interop Excel名称空间 http msdn microsoft com en us library microsoft office interop excel 28v
  • 在 iPhone 中点击按钮时打开文件对话框

    我做了一个可可应用程序 其中在可可应用程序中使用 NSOpenPanel 控制器点击按钮时打开文件对话框 对于 ipad 应用程序 我们使用 UISplitViewController 我想知道 在 iPhone 中开发应用程序时 点击按钮
  • 如何将引导日期选择器放入我的表单中并在日期参数中包含值?

    我正在使用 bootstrap datepicker js 并且它工作正常 div class well div class input append date div div
  • 问答:我如何知道该月的最后一天是哪一天?

    我试图编写一个自己的时区转换器 我需要一种方法来确定该月的最后一天是哪一天 经过一番研究 我发现了查找闰年的公式 这是一个小小的贡献 但也许我可以为其他人节省 20 分钟的时间来弄清楚并应用它 此代码接受带符号的短月份 索引为 0 0 是一
  • ORACLE Select Distinct 返回许多列,其中

    我有一个看起来像这样的表 NAME Col1 Col2 Col3 Tim 1 2 3 Tim 1 1 2 Tim 2 1 2 Dan 1 2 3 Dan 2 2 1 Dan 2 1 3 我试图创建一个 SELECT 命令 结果如下 NAME
  • R 中的线性插值

    我有一个真实数据的数据集 例如如下所示 Dataset 1 with known data known lt data frame x c 0 6 y c 0 10 20 23 41 39 61 plot known x known y t
  • UIImage 内存未释放 VM:ImageIO_JPEG_DATA?

    我在屏幕上同时有多个水平滚动的集合视图 它们都充满了图像 所有这些图像都通过 Parse api 在后台加载 我正在运行 Instrument 的分配 并且匿名 VM ImageIO JPEG DATA 类别占用了大部分正在使用的内存 应用
  • linux终端动画-延迟打印“帧”的最佳方法(C语言)

    我正在为终端开发一个简单的 pong 克隆 并且需要一种方法来延迟 帧 的打印 我有一个二维数组 screen ROWS COLUMNS 以及打印屏幕的函数 void printScreen int i 0 int j while i lt
  • 与 Matlab 相比,Numpy 加载 csv 太慢

    我发布这个问题是因为我想知道我是否做了一些非常错误的事情才能得到这个结果 我有一个中等大小的 csv 文件 我尝试使用 numpy 来加载它 为了便于说明 我使用 python 创建了该文件 import timeit import num
  • 使用 Angular 5 和 RxJS 观察带有过滤器的数组

    我正在创建一个简单的论坛 我正在寻找过滤帖子 我在 RxJS 中使用 pipe 和 filter 时遇到一些问题 我试图 从内存中检索 api 帖子列表api posts 当与 http get 一起使用时 它返回一个Observable
  • Android appbarlayout 海拔出现在状态栏中

    如何消除状态栏中的高度 如果我在 AppbarLayout 中将 app elevation 设置为 0dp 则标高不再出现在状态栏中 但也不会出现在 AppbarLayout 下方 如何获取 AppbarLayout 下的高度 这是我的意
  • Rails/Devise - 我应该使用 devise 和 rspec 测试什么?

    许多程序员使用 devise 作为他们的身份验证解决方案 我想得到他们的建议 设计已经经过测试 但我想知道是否需要自己测试一些东西 集成 单元 功能测试 以便与我的知识进行标准设计集成 我不熟悉shoulda和cucumber 但我了解一些
  • 在 HTML 中正确对齐图像和文本

    This is the example 我想对齐image与名称并排 但不知何故 图像只是浮得更高一点 有什么帮助吗 UPDATE profile name header background color 006400 font famil
  • NPM5,package-lock.json 与 package.json 有什么区别?

    将NPM更新到版本5后 我发现package lock json包含 package json 的文件 这两个文件有什么区别 有什么优点package lock json package json 文件 列出您的项目所依赖的包 允许您使用语
  • 如何检查 iPhone 上的自定义 url 方案?

    我想在我的应用程序中使用自定义 url 方案 例如调用 navigons mobile navigator 首先 我想检查是否安装了 navigon 或者至少检查自定义 url 方案 navigon 是否已注册 有任何想法吗 多谢 看看 U
  • C 函数堆栈布局

    我有一个看起来像这样的函数 int bof char str char buffer 12 strcpy buffer str return 1 我正在尝试覆盖其返回地址 我发现我可以通过使用来做到这一点 例如 memcpy buffer
  • 使用 DTO 和 BO

    我对 DTO BO 的疑问之一是何时传递 返回 DTO 以及何时传递 返回 BO 我的直觉告诉我始终将 NHibernate 映射到 DTO 而不是 BO 并且始终传递 返回 DTO 然后 每当我需要执行业务逻辑时 我都会将 DTO 转换为