2009-05-11 6 views
4

내 ASP.net MVC 응용 프로그램에서 여러 도메인/인스턴스를 구별해야하기 때문에 응용 프로그램의 호스트를 가져와야합니다. 나는 이런 식을받지 않으 좋은 디자인과 테스트 용이성을 고려하여"주입"Request.Url.Hosts - ASP.net MVC

:

public ViewResult Show(int id) 
{ 
    string host = Request.Url.Host; 
    .... 
} 

생성자를 통해 "주입"할 수있는 가능성이있다.

이 문제에 가장 적합한 해결책은 무엇입니까?

답변

4

당신은 또한과 같이 컨트롤러에 대한 몇 가지 생성자를 사용할 수 있습니다

public MyController() : this(DefaultHostGetter) { } 
public MyController(Func<string> hostGetter) 
{ 
    this.hostGetter = hostGetter; 
} 

private string DefaultHostGetter() { return this.Request.Url.Host; } 

뷰 액션은 다음과 같습니다

public ViewResult Show(int id) 
{ 
    string host = this.hostGetter(); 
    .... 
} 

당신이 다음이 될 것입니다 다른 호스트 게터 (mock)를 제공하여 컨트롤러를 테스트 할 수 있습니다.

+0

테스트 가능성에 대한 큰 도전! +1! –

3

이 경우 "주사"가 필요하지 않을 수 있습니다. 최상의 테스트 가능성을 위해 가장 깨끗한 솔루션이 요청을 조롱하게 될 것이라고 생각합니다. (Moq 라이브러리를 사용) 예 :

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/any")); 

var context = new Mock<HttpContextBase>(); 
context.SetupGet(x => x.Request).Returns(request.Object); 

var controller = new YourController(); 
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);