Вопрос

Задний план

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

Контроллер

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

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

    ....
}

Я использую единство, чтобы ввести зависимости. Я хотел бы использовать Url.GenerateUrl() помощник метода в реализации IAccountService но Url это недвижимость против контроллера.

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

Вопрос

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

Это было полезно?

Решение

Однако я хотел бы использовать методы помощника помощников URL.Generaturl в рамках моей реализации 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top