Wie kann ich Zugriff auf die Request Außerhalb des Controllers?
-
03-10-2019 - |
Frage
Hintergrund
Ich versuche, Business-Logik aus den Controllern in ihre eigenen Dienste zu bewegen.
Controller
public class AccountController : Controller
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
....
}
Ich bin mit Unity Abhängigkeiten zu injizieren. Ich mag die Url.GenerateUrl()
Hilfsmethode im Rahmen der Umsetzung von IAccountService
verwenden, aber Url
ist eine Eigenschaft, gegen den Controller.
schaute ich auf der MVC Quelle zu sehen, wie dies geschehen ist, aber es erfordert mich die RequestContext
von außerhalb des Controllers zugreifen zu können, und ich weiß nicht, wie das zu tun.
Frage
Wie kann ich den Request von außerhalb der Steuerung? Wenn das nicht mein Problem lösen, wie löse ich das Problem, mein Setup gegeben?
Lösung
Allerdings möchte ich die Url.GenerateUrl Helfermethoden in meiner Implementierung von IAccountService verwenden
Sie einfach diese Informationen als Parameter übergeben. Beispiel:
public ActionResult Index()
{
var someUrl = Url.Action("about");
_accountService.Foo(someUrl);
}
Jetzt nicht mehr benötigte UrlHelper in Ihrer Serviceklasse. Alles, was Bedürfnisse mit MVC-Infrastruktur interagieren sollten nicht in Ihrer Serviceklasse platziert werden. Sie sollen nicht auf einer Anfrage abhängen, Antwort, Sitzung, ... Es ist die Verantwortung der Controller an der Arbeit mit diesen Objekten und klebt sie zusammen mit Ihrer Serviceklasse.
Andere Tipps
Dies könnte nicht ganz richtig sein, weil ich nicht in der Lage bin es zur Zeit zu testen, aber ich denke, dass Sie so etwas wie dies in .NET 4 + tun können:
using System.Web;
using System.Web.Mvc;
// ...
var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
Es Macht mehr Sinn machen, den Kontext von der Steuerung an Ihrer IAccountService
Implementierung zu passieren, anstatt es direkt von HttpContext.Current
.