2011-11-03 70 views
1

OK,這可能只是我的無知,但我在我MVC3應用以下路線:ASP.NET MVC3應用創造壞路線值

routes.MapRoute("Directory","{aid}/{controller}/{action}/{year}/{quarter}", 
    new { aid = "sf", controller = "Lobbyist", action = "Index", 
    year = CurrentYear(), quarter = CurrentQuarter() }); 

在我的Global.asax.cs,我有這些兩種方法:

public static int CurrentQuarter() 
    { 
     int quarter = 0; 
     //...use some internal business logic to determine the value of 
     //'quarter' based on the current date... 
     return quarter; 
    } 

    public static int CurrentYear() 
    { 
     return DateTime.Now.Year; 
    } 

此代碼的偉大工程幾乎所有的時間。在某個時間點,在我們的生產環境(運行IIS7)中,CurrentQuarter()的路徑值變爲零值,當它應該是1,2,3或4時。它在生產中工作得很好,除了那一個時間點。 IISRESET「固定」了這個問題。

我所知道的:

  1. 當時CurrentQuarter()的失敗,CurrentYear()仍然 恢復正常
  2. 的CurrentQuarter()方法不扔這將避免設定一個 例外所述「季度」可變
  3. 其驅動CurrentQuarter()方法中的業務邏輯的工作原理爲 和DateTime.MinValue DateTime.MaxValue
之間的每個日期

我的問題真正得到起來就是:

  • 做不好調用靜態方法來生成路由值?
  • 應用程序是否有可能「忘記」靜態方法的結果,並導致它返回垃圾值?應用程序池回收可以導致此問題嗎?

我有點抓住吸管在這裏!

感謝您的任何建議。

+0

答案是「否」和「否」。在一個新的MVC項目RegisterRoutes(你的routes.MapRoute在那裏調用?)的默認Global.asax.cs是一個靜態方法,它在Application_Start上被調用。在此註冊期間,CurrentQuarter僅被調用一次。只有在請求url中不存在提供的quarter url元素值時才使用它。 – Igor

回答

1

我不會在這裏調用靜態值。我完全不同意上面的伊戈爾。它不是標準的,很難追蹤這些值來自不知道該應用的人。從您的控制器調用它,或者更好 - 您的控制器調用的服務層(即業務邏輯)即可獲得此值。

路線的目的不是調用業務方法。

第二個問題,如果有一個應用程序池回收,該值將被簡單地重置。但是,如果多個線程正在調用此方法,並可能在相同的方法中更改值,我會在那裏實施一些鎖定以防止更新重疊。

+0

我看到你的觀點,即對於不懂代碼的開發人員來說,更難以進行調試。我確實有一個關於你的最後評論「實施一些鎖定」的問題。你的意思是像上面的CurrentYear()方法這樣的靜態方法不是線程安全的嗎?我會發現這真的令人震驚。我可以看到我是否設置了一些在方法外部聲明的變量值,否則...... –

0

您應該使路由值年和季度可選,並在Action方法中爲它們提供默認值。我認爲這使得一切都更清潔,並且更容易維護。

public class LobbyistController 
{ 
    public ActionResult Index(int? year, int? quarter) 
    { 
    if (!currentYear.HasValue) 
    { 
     currentYear = GetCurrentYear(); 
    } 

    if (!currentQuarter.HasValue) 
    { 
     currentQuarter = GetCurrentQuarter(); 
    } 

    // the rest 
    } 
}