簡體   English   中英

干凈的架構:我應該把我的例外放在哪里?

[英]Clean architecture : where should I put my exceptions?

首先,我向您介紹背景。 我在 C# 和 ASP.NET Core 中寫了一個 api,我正在嘗試遵循干凈的架構。

總之:我不知道把我的例外放在哪里。 我寫了一個小場景來解釋我的邏輯。

  1. 假設我在具體網關中拋出 DuplicatePersonException
  2. 這個異常將被我的用例(交互器)作為一個簡單的異常捕獲。 我不認為用例必須知道真正的異常。
  3. 當我發現錯誤時,我將在我的 OutputBoundary(演示者)中調用一個方法
  4. 最后,該演示者將格式化答案並根據 DuplicatePersonException 准備一個足夠的 ActionResult。

如果我尊重“內部依賴”,我必須將我的 DuplicatePersonException 放在我的用例層中。 為什么不在領域層? 因為它不必知道這種異常。 更重要的是,我不知道我是否必須創建一個抽象的自定義異常並在網關層和表示層中擴展它:這讓我有點困惑。

好吧,這個解決方案對我來說聽起來不太好,但我無法解釋原因。 把我的例外放在這一層感覺不對。

總之,如果您有任何建議或解決方案,我將非常樂意接受!

非常感謝你試圖幫助我!

(我認為這篇經典文章中的圖像說明了問題中的層次,如果“實體”和“域”是同一事物: https://blog.cleancoder.com/uncle-bob/2012/08/13/the -清潔架構.html

首先,拋出調用代碼無法捕獲的異常是沒有意義的。 那么您不妨拋出Exception

這與返回實體的想法相同。 如果您的實體是在您的網關中定義的,您的用例將無法接收它們。

假設您的網關從數據庫或外部 API 獲取一個PersonEntity 。在干凈的體系結構中, PersonEntity應該在您的網關中定義,並映射到域中的另一個PersonEntity ,然后映射到表示中的另一個PersonDto

這些實體是完全獨立的; 它們都沒有擴展另一個。 我認為那會破壞目的。


這是我的建議:

在用例層定義並捕獲DuplicatePersonException

在您的域層中定義另一個更一般的異常(可能是InvalidDataException ),並從您的用例中拋出它(或在方法調用中轉發)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM