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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top