2009-05-11 6 views
4

私のASP.net MVCアプリケーションでは、複数のドメイン/インスタンスを区別する必要があるため、アプリケーションのホストを取得する必要があります。私はこのようにそれを取得する必要はありません良いデザインとテスト容易性を考慮して"Inject" Request.Url.Hosts - ASP.net MVC

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

はコンストラクタを通してそれを「注入」する可能性があります。

この問題の最もクリーンな解決策は何ですか?

答えて

4

別のホストゲッター(モック)を供給してコントローラをテストすることができます。

+0

テスト容易性のための大きな課題! +1! –

3

この場合、「注入」は必要ないかもしれません。私は良いテスト容易性のために、最もクリーンなソリューションはあなたのリクエストを嘲笑するだろうと思います。 (Moqライブラリを使用)例:

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(); 
    .... 
} 

あなたは次のようになります。また、そのようなあなたのコントローラのためのいくつかのコンストラクタを使用することができ

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);