gpt4 book ai didi

.net - 如何使用DDD模式在.NET企业应用程序中正确定义异常策略?

转载 作者:行者123 更新时间:2023-12-04 18:12:16 25 4
gpt4 key购买 nike

我正在使用DDD模式开发类似企业的项目。我的C#解决方案中有以下项目:

  • 域模型-DLL项目
  • WebUI-ASP.NET MVC3项目
  • DesktopUI-WPF项目
  • DAL- Entity Framework 代码第一个
  • 持久性-SQL Server数据库

  • 该项目规模不大,但是我正在尝试使用企业应用程序的所有良好实践。

    我现在想定义的是异常策略,但是我不确定该如何处理。我可能应该使用Enterprise Library Exception Handling and Logging Blocks,但是我不确定如何使它适合图片。我想在脑海中解决的一些具体情况如下:
  • 如果用户在WPF应用程序中创建了新实体,则单击“保存”按钮,以防在不同级别发生异常(例如,根据域规则未正确创建实体)下如何报告和记录错误。尝试将新对象持久保存到数据库时出错)
  • 用户尝试从数据库中检索未知实体(例如,通过在URL中指定未知实体ID从WebUI中检索)

  • 我知道我可以定义自定义异常,但是我不确定在哪里以及如何定义。是否应该为每个层定义它们?我知道有包装异常的做法,但还是不太清楚如何最好地使用该模式。

    我还应该为某个层中的每个错误创建一个自定义异常(例如,UserAlreadyExistInDatabaseException用于尝试使用同一封电子邮件保存两个用户,如果试图从数据库中获取未知用户,则要创建UnknownUserDatabaseException),或者我应该具有一种可以处理多层错误的异常类型(例如,DatabaseException,然后使用自定义属性或Exception.Message属性区分错误)。

    最佳答案

    我将远离EntLib异常处理和日志记录块,因为它们太复杂,以致于通常无法对其进行配置和处理。您当然可以探索它们,以了解如何解决这些类型的问题,但是推出自己的解决方案或使用log4net或NLog之类的日志记录通常会更容易。

    至于处理异常,表示层(WPF或ASP.NET)应捕获并解释由应用程序服务层引发的异常。应用程序服务封装了您的域,包括域模型和数据访问层(DDD中的存储库)。应用程序服务可以返回可能包含错误信息的结果对象,也可以传播来自域或DAL的异常。

    如果要捕获自定义异常类型,则应创建自定义异常类型,以便对给定的异常类型执行特定的操作。诸如UserAlreadyExistInDatabaseException之类的异常可能会有所帮助,因为应用程序服务可以捕获它并返回某种形式的结果对象,以供表示层解释,或者可以在表示层中捕获该异常,从而将通知用户。

    可以在应用程序服务层或表示层或两者上进行日志记录。例如,应用程序服务可以从DAL捕获异常,将其记录下来,并将其包装在表示层可以解释的另一个异常中。

    User tries to retrieve unknown entity from database



    这可以通过几种方式来处理。一种方法是应用程序服务返回空引用,而表示层则向用户返回适当的消息。另外,DAL可以引发诸如EntityNotFoundException之类的东西,该异常可以在表示层捕获,也可以向用户返回适当的消息。使用ASP.NET MVC之类的东西引发此类异常可能是有益的,因为您可以创建一个 Action 过滤器,该 Action 过滤器在收到所述类型的异常后返回通用响应。

    关于.net - 如何使用DDD模式在.NET企业应用程序中正确定义异常策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11198196/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com