Как я могу получить доступ к RequestContext за пределами контроллера? - PullRequest
19 голосов
/ 16 сентября 2010

Фон

Я пытаюсь вывести бизнес-логику из контроллеров в свои собственные сервисы.

Контроллер

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

    public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }

    ....
}

Я использую Unity для внедрения зависимостей. Я хотел бы использовать вспомогательный метод Url.GenerateUrl() в реализации IAccountService, но Url является свойством для контроллера.

Я посмотрел на источник MVC, чтобы увидеть, как это делается, но он требует от меня доступа к RequestContext извне контроллера, и я не знаю, как это сделать.

Вопрос

Как получить доступ к RequestContext извне контроллера? Если это не решит мою проблему, как мне решить проблему, учитывая мои настройки?

Ответы [ 2 ]

44 голосов
/ 16 сентября 2010

Это может быть не совсем правильно, потому что в данный момент я не могу проверить это, но я думаю, что вы можете сделать что-то подобное в .NET 4 +:

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

// ...

var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);

Это может более целесообразно передавать контекст из контроллера в реализацию IAccountService, а не захватывать его непосредственно из HttpContext.Current.

15 голосов
/ 16 сентября 2010

Однако я бы хотел использовать вспомогательные методы Url.GenerateUrl в моей реализации IAccountService

Просто передайте эту информацию в качестве параметра.Пример:

public ActionResult Index()
{
    var someUrl = Url.Action("about");
    _accountService.Foo(someUrl);
}

Теперь вам больше не нужен UrlHelper внутри ваших классов обслуживания.Все, что требует взаимодействия с инфраструктурой MVC, не должно быть размещено в ваших классах обслуживания.Они не должны зависеть ни от какого Запроса, Ответа, Сеанса ... Контроллер должен работать с этими объектами и склеивать их вместе с вашими классами обслуживания.

...