2012-11-16 2 views
0

MVC3 라우팅 엔진에는 평가할 데이터베이스 조회와 관련된 제한 사항이있는 몇 개의 항목이 있습니다. 예를 들어 : ManufacturererConstraint() 데이터베이스 조회를 포함하고 StoreConstraint()제약 조건에서 데이터베이스 조회를 사용하는 MVC RouteUrl 성능

 routes.MapRoute(
      "Product", 
      "{manufacturer}/{partNumber}", 
      new { controller = "Product", action = "Details", manufacturer = "" }, 
      new { manufacturer = new ManufacturerConstraint() } 
     ); 
     routes.MapRoute(
      "Store", 
      "{store}/{action}", 
      new { controller = "Store", action = "Index" }, 
      new { store = new StoreConstraint() } 
     ); 

하지 않습니다. 이에서

RouteUrl("Product", new { manufacturer = product.Brand, partNumber = product.PartNumber }); 

세 가지 질문 :

  1. 우리의 사용량이 데이터베이스 조회를 야기 하는가

    우리는 유사한 링크를 생성하는 RouteUrl를 사용?

  2. "저장소"경로의 경로를 생성 한 경우 모든 경로에 대해 테스트 할 때 조회가 생성됩니까? 아니면 지정된 경로에 대해 하나의 테스트 만 수행합니까?
  3. 이 용도로 데이터베이스에 충돌하는 경우 RouteUrl을 사용하는 방법이 있습니까?

답변

1

우리의 사용으로 데이터베이스 조회가 발생합니까?

예, 제약 조건이 UrlGeneration에서 작동하도록 설정되어 있으면 가능합니다. Url.RouteUrl은 모든 제약 조건을 실행합니다 (Url.Action처럼). 유일한 차이점은 하나가 일치 할 때까지 각 경로를 테스트하는 대신 명시 적으로 사용하려는 경로를 말하고 있다는 것입니다.

"상점"경로의 경로를 생성 한 경우 모든 경로에 대해 테스트 할 때 조회가 생성됩니까? 아니면 지정된 경로에 대해 하나의 테스트 만 수행합니까?

나는 이것이 이상하다고 생각한다.

이 용도로 데이터베이스에 충돌이 발생하면 RouteUrl을 사용하는 방법이 있습니까?

제약 조건은 UrlGeneration (routeDirection 매개 변수 사용)에서 실행되지 않도록 설정하십시오. 개인적으로, 대신 조회 데이터를 캐시합니다.

+0

제약 조건에서 'routeDirection == RouteDirection.IncomingRequest' 인 경우에만 데이터베이스를 조회하십시오. 데이터 캐싱은 생각했지만 이론적으로 언제든지 변경 될 수 있습니다. 예를 들어 새 브랜드를 현장에 추가하여 대표자에게 보여줄 수 있거나 가능한 한 빨리 내릴 수 있습니다. 필요에 따라 캐시를 무효화하고 다시로드 할 수있는 방법으로 캐시하는 방법이 있다면 분명히 살펴볼 것입니다. – Bobson

+0

URL 생성시 데이터베이스를 확인해야하는 이유는 무엇입니까? 데이터베이스에서 partNumber를 얻으면 이미 유효하다는 것을 알 수 있습니다. 들어오는 요청의 경우, 조치 메소드에서 해당 점검을 수행하고 존재하지 않는 경우 404를 리턴하는 것이 일반적입니다. –

+0

세대 별로는 그렇지 않습니다. 그러나이 대답까지 나는 그것이 불가능하다는 것을 몰랐다. 들어오는 요청에 대해 문제가 발생하는 이유는 브랜드 또는 스토어 이름 (또는 다른 여러 가지)에 따라 URL에 일치하는 여러 경로가있을 수 있기 때문입니다. 따라서 우리는 하나의 거대한 액션을 가지고 모든 파싱을 처리 한 다음 올바른 컨트롤러 액션을 반환하거나 각각을 확인합니다. – Bobson

관련 문제