«Внедрить» Request.Url.Hosts - ASP.net MVC - PullRequest
4 голосов
/ 11 мая 2009

В моем приложении ASP.net MVC мне нужно получить хост приложения, потому что я должен различать несколько доменов / экземпляров.

Учитывая хороший дизайн и тестируемость, я не хочу получать это так:

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

Есть ли возможность "внедрить" его через конструктор.

Что было бы самым чистым решением для этой проблемы?

Ответы [ 2 ]

4 голосов
/ 12 мая 2009

Вы также можете использовать некоторые конструкторы для вашего контроллера, например:

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

тогда вы сможете протестировать свой контроллер, предоставив другой хост-геттер (макет).

3 голосов
/ 11 мая 2009

Может быть, вам не нужно «впрыскивать» в этом случае. Я думаю, что для хорошей тестируемости самым чистым решением будет насмешка над вашим запросом. Пример (с использованием библиотеки 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...