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