BL服务:例外或方法结果?

And*_*ndy 3 .net architecture domain-driven-design business-logic n-tier-architecture

什么是最好的方式和原因?

V1:

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

V2:

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

Dmi*_*try 5

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

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

  • 在我看来,投掷和处理代码更具可读性,自然性和简洁性.没有'ifs',没有多重退货声明.无需将您的域服务弯曲为"操作".

  • 我认为DDD就是使用简单的OO语言来表达特定的业务问题并尽可能地保持基础设施.创建'OperationResult'类似乎太基础设施和通用,特别是当语言已经支持异常时.

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

也许值得看一下设计本身,也许有一种方法可以不首先进入错误状态?例如,可以通过使用值对象而不是原始字符串和整数来消除整个"验证"错误条件.

DDD是一种方法,一套指导方针,因此没有"正确"的方法.该从来没有提到这个问题,但直接在片段和示例项目使用异常代码.