1

我會非常感興趣的是,是否有更好的方法來實現以下內容。我不想創建複雜或不可維護的代碼。如何爲類庫中的過濾器/屬性指定MVC控制器/操作?

我正在創建一個將在未來的項目中實現的類庫。該庫包含一些繼承自ActionFilterAttribute的過濾器/屬性,實現應用程序可以使用它來裝飾控制器或操作。

一個例子是MustBeLoggedInAttribute。這將檢查cookie以查看當前用戶是否已登錄。如果存在有效的cookie,則不採取任何操作。如果沒有有效的cookie,則該屬性重定向到控制器和動作,例如, AuthController> Login()。

因爲有一個應用程序實現類庫,我不知道應用程序想要重定向到什麼控制器或動作。我想到了獲取這些信息的兩種方法。

  1. 獲取執行應用程序以在其web.config中指定控制器和操作名稱。

    我通過檢查它們是否存在於實現應用程序的程序集中來驗證字符串名稱,否則請嘗試使用默認值。主頁>索引()。這種方法似乎有許多缺點,包括

    • 使得實現應用較少的維護(更換控制器或者動作名稱意味着要更新web配置太)

    • 我要驗證字符串名稱

    • 的實現應用程序的開發人員需要閱讀的文件就知道來指定這個

    • 有可能加載更多

  2. 具有過濾器/屬性需要兩個參數來指定控制器和動作

    這也似乎有一些第一個想法,例如的陷阱的更新名稱(如果它們被更改的話),還有名稱將在整個實施應用程序中重複的事實。

我覺得必須有更好的方式來做到這一點,這將使實現應用程序可維護,不重複的代碼,而不是太複雜。 那是一廂情願嗎?

過濾器需要知道在哪裏重定向,但是最好的方法是什麼? 或者我應該以完全不同的方式來做到這一點?實現應用程序是否應該實現自己的過濾器/屬性,然後在我的類庫中使用公共方法來執行Cookie檢查?有更好的方法嗎?

我真的很感激人們對此的看法,因爲我真的不想創建錯誤的代碼。 非常感謝!

回答

2

你可以讓你的動作過濾抽象,並有一些HandleUnauthorizedRequests抽象方法,將採取過濾器上下文。現在,實現應用程序將採用您的基本操作過濾器,並編寫實現抽象方法的派生實例並使用此類。在這種方法中,它可以做任何想做的事情 - >重定向,渲染視圖,...

你當然可以提供一些默認實現與常規的東西,如重定向到帳戶/登錄行動。那些想要重寫這些傳統內容的人可以隨時做到這一點。這樣,作爲一個類庫作者,您不必擔心控制器是否存在 - 這是消費者的責任。

+0

嗨@Darin,謝謝你的回覆。我會看看這個,讓你知道它是怎麼回事。這不是我以前做過的事情,所以有一個去做會很有趣。 – tekiegirl

1

老問題,但在這裏的一對夫婦的新選擇:

使用您的選項2,但不是分別適用於每一個動作,創建一個基本的控制器和過濾器適用於控制器。然後,該控制器和派生產品中的所有操作都需要通過您的過濾器。將不需要傳入不同控制器的操作放入非過濾基本控制器中。取決於你如何組織你的動作/路線等,可能不是一個選擇,但可能是最簡單的。

或者,您可以讓您的篩選器引發自定義異常,例如MustBeLoggedInException,然後讓您的全局asax以特定於每個應用程序/實現所需的方式處理該錯誤。更好地遵守單一責任原則:您的屬性只是通知您的應用程序它沒有通過過濾器。然後,您使用其他一些機制來處理這些信息(例如全局錯誤處理程序中的重定向)。

相關問題