2011-09-21 59 views
2

讓我們假設我們有一些動作控制器,它可能看起來像:ASP.NET MVC:我們應該/不應該將哪些控制器操作邏輯移動到屬性?

[HttpPost, Authorize] 
    public ActionResult Update(Guid itemId) 
    { 
     var item = repository.GetById(itemId); 
     if (item == null) 
      return NotFoundResult(); 

     //Do something with item 

     return View(); 
    } 

我們已經申請了授權屬性,以確保只有某些特定的用戶可以執行我們的行動。

我們還可以將以下塊

 var item = repository.GetById(itemId); 
     if (item == null) 
      return NotFoundResult(); 

到另一個屬性,並把它應用到我們的行動。

還有另外一種行爲,我們可以提取一些特定的邏輯屬性,並將它們反覆應用到我們的行爲中。

我的問題是:我們什麼時候該做,什麼時候不應該? 將這樣的邏輯移動到操作方法屬性實際上是一件好事嗎?

我在回顧某個項目的單元測試時遇到了這個問題。我實際上是在尋找代碼文檔,如果沒有找到項目,我就不會看到控制器操作應該做什麼。我在屬性單元測試中發現了這個部分,但是這實際上是屬性的責任嗎?

我可以理解Authorize屬性,它實際上是另一個層,但是我上面描述的邏輯又如何呢?控制者的行動責任是使用它還是......?

預先感謝任何意見:)

回答

1

如果您想針對一組操作運行此類邏輯,則可以覆蓋OnActionExecuting方法來執行檢查。

創建一個屬性會很困難,因爲您還需要創建一個基礎控制器並編寫一些反射代碼來檢查該操作方法以查看該屬性是否存在,然後對其執行操作。

protected override void OnActionExecuting(ActionExecutingContext ctx) 
{ 
    if(!ctx.ActionDescriptor.ActionName.StartsWith("Create")) 
    { 
     var item = repository.GetById(itemId); 
     if (item == null) 
      ctx.Result = NotFoundResult(); 
    } 
} 
+0

在這種情況下,OnActionExecuting將應用於所有控制器操作,但我們的控制器通常是類似CRUD的。在'C'的情況下,我們會遇到一些麻煩:) – Andrey

+0

在這種情況下,您可以檢查[ActionDescriptor](http://msdn.microsoft.com/zh-cn/library/system.web。 mvc.actionexecutingcontext.actiondescriptor.aspx)來檢查正在調用哪個動作。看我的編輯。 –

+0

謝謝!此外,如果我從我的單元測試中調用controller.Update(..),會調用此方法嗎?或者我應該使用ActionInvoker?或者也許別的.. :) – Andrey

0

屬性用於在ASP.net MVC各種事情(例如過濾或異常處理)。但是,我不會將這樣的邏輯移動到屬性上,因爲這是您正在執行的操作的基本邏輯。將這些代碼移到屬性上只會讓它更難找到該操作實際上在做什麼。

相關問題