Architecture 交流输入和输出;处理来自服务层的错误

Architecture 交流输入和输出;处理来自服务层的错误,architecture,service-layer,decoupling,onion-architecture,Architecture,Service Layer,Decoupling,Onion Architecture,在我的项目中,我有一个处理存储库的服务层。服务层由我的控制器调用 在许多情况下,我的控制器层能够在传入信息进入系统之前对其进行验证。但是,在某些情况下,由于提交的数据无效(但仅在我的服务层内的某个点上),可能会出现错误 考虑到这一点,让我们假设我正在做一个用户注册流: 不允许重复的用户名 可以提供用户名 如果未提供用户名,则会根据名字和姓氏生成用户名 这意味着生成(如果需要)和检查重复用户名的过程将在服务层中进行 在发生重复的情况下,对于我来说,向调用者(无论是控制器、后台任务还是其他服

在我的项目中,我有一个处理存储库的服务层。服务层由我的控制器调用

在许多情况下,我的控制器层能够在传入信息进入系统之前对其进行验证。但是,在某些情况下,由于提交的数据无效(但仅在我的服务层内的某个点上),可能会出现错误

考虑到这一点,让我们假设我正在做一个用户注册流:

  • 不允许重复的用户名
  • 可以提供用户名
    • 如果未提供用户名,则会根据名字和姓氏生成用户名
这意味着生成(如果需要)和检查重复用户名的过程将在服务层中进行

在发生重复的情况下,对于我来说,向调用者(无论是控制器、后台任务还是其他服务)发回信号的最解耦和理想的方式是什么

  • 用户名字段有问题
  • 在适用的情况下,生成的用户名

理想情况下,建议的方法能够应用于其他服务中发生的错误,这样我就可以想出一种一致的方法来报告并处理调用层中的错误。

我通常做的是,让业务/域/应用层都抛出常规的.NET异常(保留堆栈跟踪!),其中包含有关异常的信息

在服务层中,全局异常处理程序然后将异常转换为故障(对于WCF服务)。它还可以记录当时的内部情况

因此,内部(例外情况)保留在内部;但它的公共部分会自动向服务的消费者公开


通常我使用
FluentValidation
在应用程序层和业务层中进行验证,这允许您将验证放在特定的验证类中并重用它们。

我通常做的是,让业务/域/应用程序层都抛出常规的.NET异常(保留堆栈跟踪!),其中包含有关异常的信息

在服务层中,全局异常处理程序然后将异常转换为故障(对于WCF服务)。它还可以记录当时的内部情况

因此,内部(例外情况)保留在内部;但它的公共部分会自动向服务的消费者公开


通常我使用
FluentValidation
在应用程序层和业务层中进行验证,这允许您将验证放在特定的验证类中并重用它们。

我通常做的是,让业务/域/应用程序层都抛出常规的.NET异常(保留堆栈跟踪!),其中包含有关异常的信息

在服务层中,全局异常处理程序然后将异常转换为故障(对于WCF服务)。它还可以记录当时的内部情况

因此,内部(例外情况)保留在内部;但它的公共部分会自动向服务的消费者公开


通常我使用
FluentValidation
在应用程序层和业务层中进行验证,这允许您将验证放在特定的验证类中并重用它们。

我通常做的是,让业务/域/应用程序层都抛出常规的.NET异常(保留堆栈跟踪!),其中包含有关异常的信息

在服务层中,全局异常处理程序然后将异常转换为故障(对于WCF服务)。它还可以记录当时的内部情况

因此,内部(例外情况)保留在内部;但它的公共部分会自动向服务的消费者公开


通常,我使用
FluentValidation
在应用程序和业务层中进行验证,这允许您将验证放在特定的验证类中,并重用它们。

我喜欢@L-Three的答案,但我想提供另一个建议:将验证错误作为服务层方法返回结果的一部分


我的感觉是域/服务层应该负责所有的验证,在UI中进行的任何输入验证都很好。

我喜欢@L-Three的答案,但我想提供另一个建议:将验证错误作为服务层方法返回结果的一部分


我的感觉是域/服务层应该负责所有的验证,在UI中进行的任何输入验证都很好。

我喜欢@L-Three的答案,但我想提供另一个建议:将验证错误作为服务层方法返回结果的一部分


我的感觉是域/服务层应该负责所有的验证,在UI中进行的任何输入验证都很好。

我喜欢@L-Three的答案,但我想提供另一个建议:将验证错误作为服务层方法返回结果的一部分

我的感觉是域/服务层应该负责所有的验证,在UI中完成的任何输入验证都很好