3

我正在使用依賴注入來實現MVC站點。我查看可能遇到錯誤的模型。我們認爲將這些錯誤傳達給相關控制器的最好方法是拋出一些自定義異常。異常類的注入

我的問題:我想從一個公共基類派生這些例外,它會寫入關於日誌發生錯誤的信息。但是由於我們使用的是DI,我們的日誌記錄對象是由我們的Io​​C容器構建和控制的。迄今爲止,我們所有需要日誌的對象都是由IoC容器構建和初始化的。但是這些例外情況將在飛行中創建。

最常見的處理方法是什麼?我可以看到如何創建一個ExceptionFactory類,將注入器注入它,然後將其注入到視圖模型中。但這看起來不太合適。

處理這種情況是否有一個常見的習慣用法?

+0

等等。你的視圖模型有邏輯?我會說這是你問題的核心。 MVC視圖模型應該沒有問題。控制器應該包含邏輯,視圖和視圖模型都應該是啞的。 – Steven

回答

0

我會避免讓你的異常對象與記錄器耦合。我可以看到一個知道如何格式化異常消息的異常對象,但不會記錄它。

在上游捕獲與其相關的異常並將其記錄在那裏。如果您的IoC容器支持它,您可以使用攔截來捕獲並記錄那裏的異常。我會提供一些鏈接,但根據您選擇的框架,您可能更適合使用Google IoC和攔截功能,並根據需要確定您需要的內容。

只要我的0.02美分,希望這有助於。

+0

谷歌的國際奧委會容器是在java afaik,它很爛。 – DarthVader

+0

在異常情況下進行日誌記錄的重點是記錄每個拋出的異常。我同意我們不希望將異常類綁定到記錄器的任何特定實現,但是在注入記錄器接口的實例時看不到問題。 –

+0

我的意見來自於我使用例外的方式。我通常在被捕獲之前不會記錄異常,如果它未被捕獲,則全局異常處理程序將捕獲並記錄它。因此,採伐行爲是一個單獨的問題。如果異常被捕獲並引發正確,它們應該包含整個調用堆棧和.ToString(),異常應該會顯示所有的異常。由於控制器已經捕捉到這些異常,爲什麼不記錄它們呢?另外,我嘗試在我的例外中保持自定義非常輕 - 在拋出異常時不希望發生異常。 –

0

您可以使用裝飾器或攔截器來達到此目的。

日誌記錄或錯誤過濾器是橫切問題,並且不會在處理器中寫入任何錯誤或錯誤。

此外,你仍然可以將它們注入任何你想要的東西。

一切都不一定是IOC'ish。只要它有效,它應該沒問題。

+0

如果我正在注入一個對象,我可以創建一個裝飾器並注入它的一個實例。但在這種情況下,我根本沒有注入任何對象,所以我看不出創建裝飾器會有什麼幫助。 –

+0

你看過elmah嗎? – DarthVader