服务操作被调用,但未找到实体。

3

我正在使用领域驱动设计(DDD)

我的应用服务IUserService有以下操作:

public void EnableUser(int userId)
{
    var user = userRepository.SelectById(userId);
    if (user == null)
    {
        //??
    }

    user.Enabled= true;
    userRepository.Save(usuario);
}

我应该抛出自定义异常吗?如果是,自定义异常应该放在我的应用程序结构的哪里?


2
一个不相关的评论,user.Enabled= true; 是CRUD操作,应该改为 user.enable()。应用程序服务不应该知道启用用户的含义。这样更能适应业务逻辑的变化。 - plalx
是的 @plalx。我同意你的观点。上面的代码只是一个比我能写的更短的例子。 - Vinicius Gonçalves
你没有在这里将启用、加载和保存用户结合起来吗? - Ewan
我会传递用户对象,这样你就可以将存储库与启用概念分离开来。 - Ewan
请参见http://stackoverflow.com/questions/28704015/entity-vs-id-as-parameter。 - Vinicius Gonçalves
1个回答

1
如果你的UserService无法处理用户不存在的情况,那么一定要抛出异常。我认为创建自定义异常有助于区分其他潜在的异常,这种情况下如何处理它们应该在该异常类型的处理程序中指定。
如何处理异常取决于系统的设计方式。你不希望处理异常时上下文丢失。对于这个例子而言,如果启用用户是由按钮点击或其他用户操作引起的,则发起该调用的事件或方法最可能处理任何出现的异常,适当地通知用户并记录发生了什么。

我应该把自定义异常类放在我的领域层吗?比如:Application.Core\EntityNotFoundException.cs - Vinicius Gonçalves
1
如果异常情况可能会跨越到其他项目(例如UI层),那么您很可能希望将它们放置在最常见的共享项目中。如果Application.Core包含大量共享代码,那么那里就是放置它们的地方。 - Kevin Nacios
UI层不应该看到领域异常。如果你想使用API和React而不是MVC Core呢? - zolty13
是的,我明白了。我会根据UI类型和距离领域逻辑的层数来决定如何处理任何异常情况。对于您的API / React UI示例,显然暴露领域异常是没有意义的,在这种情况下,当用户操作失败时,可以返回一个相对通用的500响应,然后React UI将处理如何显示/管理该操作的错误。 API层可能足以捕获领域异常并将其转换为500响应。 - Kevin Nacios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接