Exception handling 业务逻辑异常.example

Exception handling 业务逻辑异常.example,exception-handling,n-tier-architecture,Exception Handling,N Tier Architecture,在我的三层应用程序中,我有一个服务层,服务于MVC表示层: 我有一个操作,例如,创建一个员工,其电子邮件在员工集中必须是唯一的。此操作通过服务在MVC表示层中执行 如何管理创建其电子邮件已在数据库中为其他员工注册的员工的意图 我有两种选择: 1) 使用另一个操作,查询是否有员工使用与新员工相同的电子邮件 2) 在服务CreateEmployee中引发重复电子邮件的异常 我认为这是一个我认为最适合或最适合这个问题的问题。 我提出这个选择是因为我认为这是一个验证的问题。 但是2)选项只需要对服务进行

在我的三层应用程序中,我有一个服务层,服务于MVC表示层:

我有一个操作,例如,创建一个员工,其电子邮件在员工集中必须是唯一的。此操作通过服务在MVC表示层中执行

如何管理创建其电子邮件已在数据库中为其他员工注册的员工的意图

我有两种选择:

1) 使用另一个操作,查询是否有员工使用与新员工相同的电子邮件

2) 在服务CreateEmployee中引发重复电子邮件的异常

我认为这是一个我认为最适合或最适合这个问题的问题。 我提出这个选择是因为我认为这是一个验证的问题。 但是2)选项只需要对服务进行一次调用,因此它的(?)效率更高

你觉得怎么样


谢谢

如果“演示”层实际上是指演示,则不应在该层中创建新员工。您应该只准备在HTTP响应对象中清晰显示的任何数据

一般来说,思考这种问题的一个好方法是考虑命令行程序调用的服务对象应该做什么:

> createEmployee allison.brie@awesome.com
  Error! 'allison.brie@awesome.com' is already registered.
其中有一些终端管理层调用该服务。该服务会意识到有另一个用户使用相同的电子邮件,并抛出相应的异常(即
DuplicateUserException
)。然后终端管理层解释该异常并打印出
“Error!”+exception.getMessage()


也就是说,请注意,您的两个选项实际上是相同的选项。您的服务仍必须在数据库中查询副本。虽然这是“验证”,但不是输入验证。输入验证意味着检查它是否是有效的电子邮件地址。(是否有“@”符号和有效的TLD?

如果“演示”层指的是演示,则不应在该层中创建新员工。您应该只准备在HTTP响应对象中清晰显示的任何数据

一般来说,思考这种问题的一个好方法是考虑命令行程序调用的服务对象应该做什么:

> createEmployee allison.brie@awesome.com
  Error! 'allison.brie@awesome.com' is already registered.
其中有一些终端管理层调用该服务。该服务会意识到有另一个用户使用相同的电子邮件,并抛出相应的异常(即
DuplicateUserException
)。然后终端管理层解释该异常并打印出
“Error!”+exception.getMessage()


也就是说,请注意,您的两个选项实际上是相同的选项。您的服务仍必须在数据库中查询副本。虽然这是“验证”,但不是输入验证。输入验证意味着检查它是否是有效的电子邮件地址。(是否有“@”符号和有效的TLD?

我肯定会选择第二个选项:

  • 正如您所提到的,它避免了对服务的一次调用
  • 它通过一种创建员工的方法保持服务界面的整洁
  • 从事务的角度来看,它是一致的(异常意味着“事务失败”)。请记住,验证并不是导致事务失败的众多原因之一
  • 假设您的验证约束不断演变(例如:其他员工属性…),您不希望让您的所有实现都只为此而演变

要记住的一点是:确保异常足够详细,以清楚地确定故障原因。

我肯定会选择第二个选项:

  • 正如您所提到的,它避免了对服务的一次调用
  • 它通过一种创建员工的方法保持服务界面的整洁
  • 从事务的角度来看,它是一致的(异常意味着“事务失败”)。请记住,验证并不是导致事务失败的众多原因之一
  • 假设您的验证约束不断演变(例如:其他员工属性…),您不希望让您的所有实现都只为此而演变

需要记住的一点是:确保异常足够详细,以清楚地确定失败的原因。

我的意思是从演示层创建一名员工。我很喜欢解决问题的观点。我不认为CreateEmployee也必须查询副本,这真的是一个问题。因为如果我认为在2个事务中,SeaSuffee和CeaTebe执行的是第一个,第一个可以是成功的,但第二个不是,因为中间的另一个雇员可能是由另一个用户创建的。谢谢您的服务层应该提供幂等函数来执行指定的数据操作。一旦验证输入为sensical,表示层就应该简单地调用服务层。如果存在输入错误的业务规则,则服务层应报告该规则-例如重复的电子邮件地址。然后,表示层应该知道如何处理指定的故障情况(即每个异常类型)。我将讨论服务层幂等元的功能性,正如您所说的,我已经忘记了或者没有真正理解这一点。非常感谢!我的意思是从表示层创建一个员工。我很喜欢解决问题的观点。我不认为CreateEmployee也必须查询副本,这真的是一个问题。因为如果我认为在2个事务中,SeaSuffee和CeaTebe执行的是第一个,第一个可以是成功的,但第二个不是,因为中间的另一个雇员可能是由另一个用户创建的。