2012-05-11 73 views
0

我有这样的场景,我的3层应用程序与服务的MVC表现层服务层:业务逻辑exception.example

我有一个创建,例如操作,如雇员的电子邮件必须这套员工是独一无二的。该操作通过服务在MVC表示层中执行。

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

我想在2种选择:

1)具有查询是否有与新员工给予相同的电子邮件的员工的另一操作。

2)在服务CreateEmployee中为重复电子邮件抛出异常。

我认为这是我认为最适合或最适合该问题的问题。 我建议1)选项,因为我认为这是一个验证问题。 但是2)选项只需要调用服务,因此它的(?)效率更高。

您认为如何?

谢谢!

回答

1

如果通过'表达'层,您确实是表示,您不应该在该层创建新员工。您应该只准备要在HTTP响应对象中完整呈现的数据。

一般认为这类问题的一个好方法是考虑你的服务对象应该怎么做,如果叫一个命令行程序:

> createEmployee [email protected] 
    Error! '[email protected]' is already registered. 

在这里面是调用一些终端管理层服务。该服务做了一些事情来实现有另一个用户使用相同的电子邮件,并引发适当的例外(即DuplicateUserException)。然后终端管理层解释该异常并打印出来"Error! " + exception.getMessage();

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

+0

我的意思是从表示层创建一个员工。 我真的很喜欢解决这个问题的观点。 我还没有想过,CreateEmployee也必须查询重复,这真的是一个问题。因为如果我认为在2个事务中ExistsEmployee和CreateEmployee可以严格执行第一个可能成功,但第二个不可以,因为在中间另一个员工可能已经创建,例如由另一个用户创建。 谢谢! – gonzalomelov

+0

您的服务层应该提供幂函数来执行指定的数据操作。表示层一旦将输入验证为合理的,就应该简单地调用服务层。如果有业务规则输入是坏的,服务层应该报告 - 例如重复的电子邮件地址。表示层应该知道如何处理指定的失败情况(即每种异常类型)。 –

+0

我明白了。 我会按照你所说的去提升服务层幂等的功能性,我已经忘记了或者没有真正理解它。 非常感谢! – gonzalomelov

3

,我肯定会用第二个选项去:

  • 你提到它避免了1调用服务
  • 它让你的服务接口用员工创建的一种方法进行清理
  • 从交易的角度来看,这是一致的(异常意味着“交易失败”)。请记住,验证不仅是导致交易失败的众多原因之一。
  • 想象你的验证约束发展(例如:其他员工属性......),你不会想让所有的实现只为此而发展。

需要注意的事项:确保使您的异常冗长,足以明确失败的原因。

+0

我喜欢你的推荐中的4分。 我想在自定义异常中,最初是2组 DataAccessExceptions和BusinessLogic异常。 谢谢! – gonzalomelov

+0

干杯,投票:)确定抛出哪种异常可能会非常棘手。根据我的经验,为了保持简单性和演变性,您通常只需要服务发出两种类型的异常:说明服务遇到技术问题(可能是InternalException,因为DataAccessException常常保留给模型层),另一种说明我们没有达到业务要求(BusinessLogicException似乎很好)。在BusinessLogicException中,你可能有一个错误散列(例如:'errors.put(“email”,“ALREADY_EXISTS”)') – ccyrille

+0

哈哈,你明白了我的想法!到目前为止,我一直在尝试实现自定义错误处理的成功。 我的一个担心是我应该抛出多少类型的异常。 我真的很感谢你的回应! 我将在SO中提出更多问题,因为我实际上无法使ErrorHandler正常工作。 谢谢! – gonzalomelov