簡體   English   中英

清潔架構例外

[英]Clean Architecture exceptions

我有一個關於我用來編寫項目的干凈架構的問題,我需要解決異常問題。 在項目中,我使用的是位於應用層的 CQRS,它協調整個操作和組件連接。 在域層中,我有具有某些邏輯的域對象,如果有錯誤,該層會拋出異常 BusinessRuleValidationException 或 NullReferenceException 在該層中我只使用這兩個異常,但現在我有一個基礎設施層,如果需要,也會拋出異常,但在這一層有更多異常,它們可能會隨着應用程序的發展而繼續增長。

現在的問題是如何解決這個問題,我不想記住關於使用異常中間件處理 api 中的每個異常的異常。 我的想法是讓域層中的異常保持原樣,因為只有 2 個並向 MediatR 編寫一個裝飾器,它將僅從域層捕獲異常並使它們在 api 中保持一致,即添加一個統一的響應,以便異常不會從其內部消息發送給用戶,僅對每個人都一致,以使用 Fluent Results 捆綁包的 Result 形式。 不要在基礎設施中拋出異常,而是使用 Fluent Results package,它將返回錯誤而不是異常,並最終從所有 MediatR 處理程序返回結果。 我不想在域層內使用 Fluent Result,因為它有點違反了域層沒有對其他事物的任何引用的規則。

下一個問題,如果我決定以一種或另一種方式解決問題,來自基礎設施的錯誤結果應該立即包含一個錯誤代碼,例如 Api 應該返回給最終用戶,例如,如果發生錯誤,因為不可能連接到數據庫,基礎設施應該返回,標題為“無法連接到數據庫”下的消息(結果),代碼為“500”,或者更確切地說,這個錯誤代碼應該從 api 本身返回,即 controller 得到一個錯誤(結果),它決定給這個錯誤什么代碼。

感謝幫助:)

異常不是您需要解決的問題。 例外是說發生了意外的事情,並且有很多事情會出錯:輸入錯誤、超時、未授權、未驗證、丟失數據等。

您可以構建您的代碼,在其中盡可能多地重用 .net 異常,如果您必須添加對您的業務領域獨特的內容,則將其放在引發這些異常的層中。 如果這種情況發生在網絡級別,您可以將異常放在那里。 如果這是域邏輯驗證 - 您可以將其保留在域核心中。

使用代碼可能會也可能不會捕獲異常。 如果捕獲到異常,代碼會從當前層或下一層導入異常。

PS:不要拋出 null 引用異常

暫無
暫無

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

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