Comment accéder à la RequestContext En dehors du contrôleur?
-
03-10-2019 - |
Question
Arrière-plan
Je suis en train de déplacer la logique métier à partir des contrôleurs dans leurs propres services.
Contrôleur
public class AccountController : Controller
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
....
}
J'utilise l'unité pour injecter des dépendances. Je voudrais utiliser la méthode d'aide de Url.GenerateUrl()
au sein de la mise en œuvre de IAccountService
mais Url
est une propriété contre le contrôleur.
Je regarde la source MVC pour voir comment cela se fait, mais il me faut pour accéder au RequestContext
à l'extérieur du contrôleur, et je ne sais pas comment faire.
Question
Comment puis-je accéder RequestContext à l'extérieur du contrôleur? Si cela ne résoudra pas mon problème, comment puis-je résoudre le problème étant donné ma configuration?
La solution
Cependant, je voudrais utiliser les méthodes d'aide de Url.GenerateUrl dans mon application de IAccountService
Il suffit de passer ces informations en tant que paramètre. Exemple:
public ActionResult Index()
{
var someUrl = Url.Action("about");
_accountService.Foo(someUrl);
}
Maintenant, vous ne UrlHelper besoin dans vos classes de service. Tout ce que les besoins en interaction avec l'infrastructure MVC ne doivent pas être placés dans vos classes de service. Ils ne devraient pas dépendre d'une demande, réponse, session, ... Il est de la responsabilité du contrôleur de travailler avec les objets et les coller ensemble avec vos classes de service.
Autres conseils
Cela pourrait ne pas être tout à fait raison parce que je suis incapable de le tester pour le moment, mais je pense que vous pouvez faire quelque chose comme ça dans .NET 4 +:
using System.Web;
using System.Web.Mvc;
// ...
var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
peut plus logique de passer le contexte du contrôleur à votre mise en œuvre de IAccountService
plutôt que de saisir directement HttpContext.Current
.