Как я могу получить доступ к RequestContext за пределами контроллера?
Фон
Я пытаюсь перенести бизнес-логику из контроллеров в свои сервисы.
контроллер
public class AccountController : Controller
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
....
}
Я использую Unity для внедрения зависимостей. Я хотел бы использовать Url.GenerateUrl()
вспомогательный метод в рамках реализации IAccountService
но Url
это свойство против контроллера.
Я посмотрел на источник MVC, чтобы увидеть, как это делается, но он требует от меня доступа к RequestContext
снаружи контроллера, и я не знаю, как это сделать.
Вопрос
Как мне получить доступ к RequestContext извне контроллера? Если это не решит мою проблему, как мне решить проблему, учитывая мои настройки?
2 ответа
Однако я хотел бы использовать вспомогательные методы Url.GenerateUrl в моей реализации IAccountService
Просто передайте эту информацию в качестве параметра. Пример:
public ActionResult Index()
{
var someUrl = Url.Action("about");
_accountService.Foo(someUrl);
}
Теперь вам больше не нужен UrlHelper внутри ваших классов обслуживания. Все, что требует взаимодействия с инфраструктурой MVC, не должно быть размещено в ваших классах обслуживания. Они не должны зависеть ни от какого Запроса, Ответа, Сеанса... Контроллер должен работать с этими объектами и склеивать их вместе с вашими классами обслуживания.
Это может быть не совсем правильно, потому что я не могу проверить это в данный момент, но я думаю, что вы можете сделать что-то подобное в.NET 4+:
using System.Web;
using System.Web.Mvc;
// ...
var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
Возможно, имеет смысл передать контекст от контроллера к вашему IAccountService
реализация, а не захватывая его непосредственно из HttpContext.Current
,