BL 服务:异常还是方法结果?

2024-03-27

最好的方法是什么?为什么?

V1:

try
{
    var service = IoC.Resolve<IMyBLService>();
    service.Do();
}
catch(BLException ex)
{
   //Handle Exception
}

V2:

var service = IoC.Resolve<IMyBLService>();
var result = service.Do();
if (!result.Success)
{
   //Handle exception
}

我认为例外更好。我认为 DDD 代码首先是优秀的面向对象代码。关于在 OO 语言中使用异常与返回代码的争论已经基本结束。在 DDD 上下文中,我看到使用异常的以下好处:

  • 他们强制调用代码来处理它们。异常不要让客户端代码忘记错误。调用代码可能只是忘记检查result.Success.

  • 在我看来,抛出和处理代码都更具可读性、自然性和简洁性。没有“ifs”,没有多个返回语句。无需将您的域服务公开为“操作”。

  • 在我看来,DDD 就是使用简单的 OO 语言来表达特定的业务问题并尽可能地将基础设施排除在外。创建“OperationResult”类对我来说似乎过于基础化和通用,尤其是当语言已经支持异常时。

  • 无论如何,域对象都会抛出异常,即使它只是为了检查参数。因此,对域服务使用相同的机制似乎很自然。

也许也值得看看设计本身,也许有一种方法可以一开始就不会进入错误状态?例如,可以通过使用消除整类“验证”错误条件值对象 http://domaindrivendesign.org/node/135而不是原始字符串和整数。

DDD 是一种方法、一套指南,因此不存在“正确”的方法。这book https://rads.stackoverflow.com/amzn/click/com/0321125215从未直接提及此问题,但代码片段和示例项目中的代码使用了异常。

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

BL 服务:异常还是方法结果? 的相关文章

  • Socket.*Async 方法是线程化的吗?

    我目前正在尝试找出最小化 TCP 主服务器中使用的线程数量的最佳方法 以便最大限度地提高性能 由于我最近阅读了大量 C 5 0 的新异步功能 异步并不一定意味着多线程 这可能意味着将有限状态对象分成较小的块 然后通过交替与其他操作一起进行处
  • 在 PCL 中使用 System.Net.Sockets(.Net 4.5 + 电话 8)

    我现有的 Net 库已经适用于 Net 4 5 和 Windows Phone 8 现在我想将其转换为可移植类库 突然我无法使用System Net Sockets不再了 我只检查了 Net 4 5和Windows Phone 8 未选择X
  • C++/CLI 在运行时显式加载托管 DLL(相当于非托管的 LoadLibrary)

    问题一 有没有办法在 C CLI 中在运行时而不是在编译时显式加载库 目前我在编译时使用 NET 添加引用 我想显式加载托管 dll NET 中是否有 LoadLibrary 的等效项 Update 感谢兰多夫 Assembly LoadF
  • 实体框架左外连接和分组抛出:ORA-00907:缺少右括号

    我在基于实体框架的数据访问中使用实体框架来定位多个数据库 我们是一个使用 Entity Framework 已有 2 年的团队 生成的代码与 sql server 2008 完美配合 现在 我们在将数据库迁移到 Oracle 11 Expr
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • Windows 服务:错误 5:访问被拒绝

    我正在尝试创建一个简单的 Windows 服务 该服务的用户帐户是NetworkService 然后我跑了installUtil从命令提示符我得到了这个 提交阶段完成 成功地 事务安装已完成 这意味着服务已成功安装 但是当我尝试从Servi
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • Phantom JS 50% 的时间失败

    我搜索一个文本框 然后尝试用字符串填充它 这是代码 var fname driver FindElement By Name iFirstName 50 if fname null do System Threading Thread Sl
  • 设置 TextBlock 以保留开头和结尾的空白?

    EDIT 下面的代码实际上按照我想要的方式工作 这个问题有点误导 请忽略它 通常当我设置Text的财产TextBlock像这样 TextBlock tb new TextBlock tb Text Hello World 文本开头和结尾的空
  • 编译时和运行时转换 C#

    我想知道为什么 C 中的某些强制转换会在编译时进行检查 而在其他情况下则将责任转嫁给 CLR 如上所述 两者都是不正确的 但处理方式不同 class Base class Derived Base class Other static vo
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • wait task.delay 有助于加快 UI 刷新速度,但是如何实现呢?

    我有一个视图模型 它正在获取一行记录并显示在 Windows Phone UI 上 这个获取数据的视图模型方法正在执行大量任务 所有任务都标记为等待操作 如下所示 async Task GetData var dataCollection
  • 如何在 C# 中捕获等待的异步方法的异常?

    我基本上想知道在 C 中我应该如何捕获通过等待的异步方法的异常await关键词 例如 考虑以下小控制台程序 其中最重要的是包含一个名为AwaitSync AwaitSync calls TestAsync 它返回一个任务 执行时会抛出异常
  • 在分布式事务中手动登记后,使用 enlist=false 的连接不会关闭

    我有一个分布式事务上下文使用ServiceDomain 在其中 我打开一个 SQL 连接 其中连接字符串指定Enlist false 这样它就不是自动地被纳入交易 然后 如果我使用手动在分布式事务中登记连接EnlistDistributed
  • 无法在 Visual Studio 2022 中启动调试适配器

    如果我创建一个启用了 Docker 支持的 ASP Core MVC 目标框架 5 0 并启动它 我会得到 发生一个或多个错误 无法启动调试适配器 附加信息可能会 在输出窗口中可用 操作被取消 这是调试输出 启用 DebugAdapterH
  • Moq - 是否可以在不使用 It.IsAny 的情况下设置模拟

    我一直使用 Moq 进行单元测试 有时我会嘲笑有很多参数的方法 想象一下这样的方法 public class WorkClient public void DoSomething string itemName int itemCount

随机推荐

  • Android Studio 无法解析 Espresso 3.0.0

    根据Android Espresso 文档 https developer android com training testing espresso setup html迄今为止 添加 Espresso 依赖项 要将 Espresso 依
  • 声纳扫描仪引擎未启动

    我按照以下说明进行操作使用 SonarQube Scanner for Ant 进行分析 https docs sonarqube org display SCAN Analyzing with SonarQube Scanner for
  • Zend_Forms、控制器放在哪里?模型?别的地方?

    构建 Zend Forms 的代码最好放在哪里 我曾经把这个逻辑放在我的控制器中 但在我需要在不同的地方使用相同的表单后 我就放弃了这个逻辑 这意味着我必须在不同的控制器中重复创建表单 因此 我将表单创建代码移至我的模型中 这看起来正确吗
  • Swift:来自浮点的字符串而不舍入值

    建议对小数进行四舍五入 但我面临着一种情况 我只需要降低精度 输出 15 96 至 16 0 所需输出 15 96 至 15 9 Codes var value AnyObject dict valueForKey XXX var stri
  • GCC 使用 __stdcall 编译 dll

    当我们在 Visual Studio 2008 中使用 stdcall 编译 DLL 时 DLL 中的编译函数名称为 函数名 尽管当我们使用 wx dev cpp 使用 GCC 编译相同的 dll 时 GCC 会附加该函数具有的参数数量 因
  • 即时刷新 Google 可视化

    我目前正在通过谷歌可视化创建谷歌图表 我希望能够通过单击按钮刷新 更新此图表 我尝试了很多不同的方法来做到这一点 但没有一个有效 所以我正在寻找任何人都可以提出的建议 我当前的平台是 ASP net 使用 C 而 google 的东西是用
  • 为什么在 JS 类中声明的变量是“undefined”[重复]

    这个问题在这里已经有答案了 尝试在 JS 中创建一个具有权重属性的类 代码如下 function Foo var weight 10 console log weight 当我实例化它时var bar new Foo 10已记录到控制台 当
  • Django DateTimeField 从表单到 UTC

    我有一个带有表单的小型 Django 应用程序 它将一些数据保存到数据库中 表格如下 class SomeForm forms Form time forms DateTimeField 还有我保存它的视图 class AccountAdd
  • 无法写入 HKEY_LOCAL_MACHINE\Software 下的注册表

    我正在编写一个应用程序 需要创建一个隐藏在登录屏幕和控制面板用户小程序中的特殊用户帐户 通过写一个DWORD将用户名值设置为 0 并添加到下面的注册表项中 我就能够实现此目标 HKEY LOCAL MACHINE SOFTWARE Micr
  • Angular5 valuechanges() 函数发生了什么? (角火2)

    我尝试理解 valueChanges 和 subscribe 我用AngularFire2 and Angular5 我的代码可以工作 但我不明白它是如何工作的 我的组件 ngOnInit this itemService getLastU
  • 蝙蝠。使用 Firefox 打开多个 url 窗口的文件

    如何编写在Firefox的新窗口中打开多个URL的bat文件 在 chrome new window 命令中有效 但在 Firefox 中该命令是什么 尝试一下这个示例 echo off Set URL www google com www
  • 从另一个进程的输出流读取

    我想在我的 Java 程序中读取 c 应用程序的输出流 iremoted 可在此处获取 Link https web archive org web 20200505051207 http www osxbook com software
  • 正则表达式,单引号或双引号

    我有这个正则表达式 preg replace key is key newValue contents 它将数组值写入配置文件中 我需要在数组键周围允许使用单引号或双引号 但我不知道该怎么做 我没有写这个正则表达式 处理多种引用样式的常用方
  • 如何只关注 Github 上的特定问题,而不是观看整个项目? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否可以只关注 Github 上的特定问题 而不是观看整个项目 当一个特定问题发生更改 拉取 状态更改 新评论 时 我希望通过电子邮件收到通知 这有可
  • 使用 rvm 更新 ruby​​ 版本后收到警告消息“Path set to RVM”

    最近 由于出现警告消息 我尝试更新我的 ruby 版本 见下文 现在 当我启动 iterm2 时 我收到以下警告消息 Warning PATH set to RVM ruby but GEM HOME and or GEM PATH not
  • 如何在新算法中添加weka特征?

    我想在 weka 中添加一种新算法 在一个算法中具有分类 聚类 关联等功能 我应该如何编写代码来包含所有 weka 功能 并为这个新算法向 weka 添加一个选项卡 我已经向 weka 添加了一个虚拟算法 现在它可以工作了我想添加一个结合了
  • 如何获取按输入顺序排序的 python Counter 输出?

    我一直在努力获取计数 频率 然后制作它的图形表示 我在用Counter班级来自collections使用Python 我想要的输出Counter按照先到对象的顺序 例如 offset a b c a b b b c c c c c coun
  • WCF - 回调客户端(双工?)

    我有一个问题 不知道该选择什么解决方案 我有一台正在运行的服务器 正在运行可以从网站接收订单的服务 多个客户端 远程计算机 以某种方式连接到该服务器 我真的很想使用 WCF 进行所有通信 但不确定是否可行 我不想在路由器中配置所有客户端防火
  • 握手期间连接终止

    这真的很令人沮丧 浪费了 3 天的时间来解决 但在 Macos Catalina 版本 10 15 1 和 Windows 7 上仍然出现卡住问题 我的两台电脑显示相同的错误 第一次当我尝试 获取包裹 时 它显示了 Users mamun
  • BL 服务:异常还是方法结果?

    最好的方法是什么 为什么 V1 try var service IoC Resolve