【发布时间】:2018-02-13 20:29:47
【问题描述】:
假设我需要在我的系统中注册用户。
商业规则是:
- 电子邮件应该是唯一的(一种身份);
- 名称不能为空。
看来我需要服务。
大概是这样的:
public interface RegistrationService {
bool Register(String email, String name);
}
在我必须向用户返回失败原因之前,这很好。 如何处理?
我可以看到几个选项(但我不喜欢其中任何一个):
-
实现一种结果对象:
公共接口注册服务{ RegistrationResult Register(String email, String name); } 公共接口注册服务{ 布尔成功(); 错误[] 错误(); 用户新用户(); }
这很好,甚至可能对 REST api 有用。 但是是不是太麻烦了(特别是考虑到可能应该在工厂检查空白名称)?
-
抛出异常
公共接口注册服务{ 无效注册(字符串电子邮件,字符串名称)抛出注册错误; }
它看起来更准确一些。但例外是昂贵的。像这样使用它们看起来是个坏主意。
- 使用数据库约束。但它看起来比(2)更混乱。
【问题讨论】:
-
错误描述是一个应用程序/用户界面问题,不应该对您的域做任何事情。在您的域中抛出异常,在应用程序层中捕获它们并将其转换为可供用户使用的东西
-
@Tseng,你是说第二个变种吗?
-
是的。并且异常并不昂贵,只有当您必须捕获它们时。如果它是一个 webservice/restapi,你已经应该做一些输入验证(当然不涉及业务逻辑),并且当输入验证错误时甚至不要调用域。当某些内容通过输入验证或无法在其中完成时(因为需要业务逻辑或数据库输入),就会出现异常
标签: validation domain-driven-design ddd-service