2009-07-04 6 views
3

그래서 ... 이메일을 생성 할 비즈니스 개체/관리자가 있습니다.관리 레이어의 MVC 경로에서 URL 생성 ...

이 이메일은

그러나 내 비즈니스 오브젝트는 것입니다 ... 웹 사이트에 다양한 콘텐츠에 대한 링크를 포함 ... 따라서 MVC 라우팅에 대해 이해할 필요가 ... 또는 적어도 웹 사이트의 URL을 생성하는 방법을합니다 RequestContext 등에 대한 액세스 권한이 없으며 전자 메일 생성이 웹 사이트에 대한 웹 요청의 결과 일 필요는 없습니다. (전자 메일을 생성하는 백그라운드 스레드에서 실행되는 디스패처가 있습니다.)

요청에 대한 액세스 권한없이 내 URL을 생성하므로 URLHelper를 사용할 수 없습니다.

생각하나요?

답변

1

저는 스키마를 정의하고 라우팅 및 비즈니스 로직에서이를 인식하는 것을 선호합니다. 동일한 URL 스키마의 다른 구현을 의미합니다.

  1. 라우팅 메커니즘을 변경할 수 있습니다 : 왜

    몇 가지 이유. 예를 들어 기능에서 url_rewrite 모듈로 전환 할 수 있습니다.

  2. 로드 균형 조정 설치시 발생할 수있는 문제.
  3. URLHelper를 문서화되지 않은 방식으로 사용하려고하지 않아도됩니다.

현재, URLHelper의 HttpRequest를 쉽게 바꿀 수 있습니다. 우리는 이것을 단위 테스트에 사용했습니다. 자세한 내용은 HttpContextBase의 단위 테스트를 검색하거나 MvcContrib의 소스 코드 예제를 살펴보십시오. 이렇게하면 호스팅되지 않은 환경에서 URL 도우미와 관련된 모든 항목을 인스턴스화하는 데 도움이 될 수 있습니다. 그러나 나는 여전히 이것이 좋은 생각이라고 생각하지 않는다.

+0

글쎄 .. 인터페이스 내에서 내 구현을 래핑하는 동안이 문제가 없어야합니다. 예를 들어 IRouteHelper? 어쨌든 ... "스키마를 정의하고 라우팅 및 비즈니스 로직을 인식하는 것을 선호합니다"라는 의미가 확실하지 않습니다 - 스키마 기반 개발을 사용하여 라우팅을 정의하는 방법은 무엇입니까? – iasksillyquestions

+0

내가 HttpRequest를 조롱하는 것이 좋습니다? – iasksillyquestions

+0

이 방법을 사용하면 IRouteHelper에 어떤 문제도 나타나지 않습니다. 다른 구현 방법을 제안했다는 점을 생각하면 같은 질문 (내가 선호하는 것)에 직면하면 선택하게 될 것입니다. 스키마 란 URL 스키마 (예 : 제품이 Invetory/Product/11654에 있어야 함을 사양으로 지정 함)를 의미합니다. 조롱은 실행 여부를 확인하는 테스트 복식의 일종입니다. 물론 나는 이것을 제안하지 않는다. 내가 제안하는 것은 UrlHelper의 의존성을 구현하는 것이다. 사실 RouteCollection의 래퍼 인 UrlHelper는 필요하지 않습니다. –

3

컨트롤러 외부의 UrlHelper를 가져 오려면 라우팅 데이터와 HttpContext를 전달해야합니다. 다음은 예입니다 : ASP.NET MVC5에서

using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing;  

HttpContextBase context = new HttpContextWrapper(HttpContext.Current); 
UrlHelper helper = = new UrlHelper(new RequestContext(context, RouteTable.Routes.GetRouteData(context))); 
0

(그리고 아마도 MVC4 -이 도입되었을 때 잘 모르겠어요)이 더 직접적으로 HttpRequest.RequestContext를 사용하여 수행 할 수 있습니다. 예 :

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
관련 문제