2011-11-03 3 views
1

OK,이 날 무지있는,하지만 난 다음 내 MVC3 응용 프로그램에서 경로있을 수 있습니다 내 Global.asax.cs에서ASP.NET MVC3 응용 프로그램 만드는 잘못된 경로 값

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

을, 내가 가진이 두 가지 방법 :이 코드는 큰 거의 모든 시간을 작동

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()의 경로 값은 0, 1, 2, 3 또는 4 여야합니다. 그 한 시점. IISRESET은 문제를 '고쳤습니다'.

내가 알고있는 무엇 : 시간 CurrentQuarter에서

  1. () 여전히 , CurrentYear()를 한 실패한 CurrentQuarter() 메소드는 설정을 막았을 것 인 예외가 발생하지 않은
  2. 제대로 반환 된 'quarter'변수
  3. CurrentQuarter() 메서드를 구동하는 비즈니스 로직은 DateTime.MinValue와 DateTime.MaxValue 사이의 모든 날짜에 대해 을 사용합니다.
정말 아래로 도착

내 질문은 :

  • 이 경로 값을 생성하는 정적 메소드를 호출하는 나쁜가요?
  • 응용 프로그램에서 정적 메서드의 결과를 '잊어 버려서'가비지 값을 반환 할 수 있습니까? 응용 프로그램 풀 재활용이 원인 일 수 있습니까?

나는 일종의 빨대를 짚고 있습니다!

어떤 조언을 주셔서 감사합니다.

+0

대답은 "아니요"및 "아니요"입니다. 새로운 MVC 프로젝트 인 RegisterRoutes에 대한 디폴트 Global.asax.cs (여기서 routes.MapRoute가 호출됩니까?)는 Application_Start에서 호출되는 정적 메소드입니다. CurrentQuarter는이 등록 중에 한 번만 호출됩니다. quarter url 요소에 대해 제공된 값은 요청 URL에없는 경우에만 사용됩니다. – Igor

답변

1

여기서 정적 값을 호출하지 않습니다. 위의 Igor에 완전히 동의하지 않습니다. 표준이 아니며이 값이 앱을 모르는 사람에게 전달되는 위치를 추적하기 어렵습니다. 컨트롤러에서 호출하거나 컨트롤러에서 호출하는 서비스 계층 (예 : 비즈니스 논리)은이 값을 가져옵니다.

경로 목적은 비즈니스 메소드를 호출하는 것이 아닙니다.

두 번째 질문에서 앱 풀 재활용이있는 경우 값이 재설정됩니다. 그러나 여러 스레드가이 메서드를 호출하고 잠재적으로 동일한 메서드에서 값을 변경하면 중복을 방지하기 위해 일부 잠금을 구현합니다.

+0

코드를 알지 못하는 개발자가 디버깅하기가 더 어렵다는 점을 알고 있습니다. 나는 당신의 마지막 코멘트에 대해 '잠그는 것을 구현하십시오'라는 질문을 가지고 있습니다. 위의 My 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 
    } 
} 
관련 문제