2010-06-02 5 views
6

Ich habe eine Komponente, die eine Abhängigkeit von UrlHelper hat, die ich mit Castle Windsor registrieren muss. UrlHelper hat wiederum Dependencies auf RequestContext (und RouteCollection).Wie injiziere ich UrlHelper in MVC mit Castle Windsor

Jetzt hat mein Controller eine Url-Eigenschaft des Typs UrlHelper, kann aber nicht wirklich darauf zugreifen, soweit ich das beurteilen kann.

Was ist der effizienteste Weg, um meine UrlHelper-Abhängigkeit zu registrieren (mit fließender Konfiguration)?

Antwort

7

Nicht schön und nicht getestet, aber es sollte funktionieren:

container.AddFacility<FactorySupportFacility>(); 
container.Register(Component.For<UrlHelper>() 
    .LifeStyle.PerWebRequest 
    .UsingFactoryMethod(() => { 
     var context = new HttpContextWrapper(HttpContext.Current); 
     var routeData = RouteTable.Routes.GetRouteData(context); 
     return new UrlHelper(new RequestContext(context, routeData)); 
    })); 

Zukünftige Versionen von Windsor wird nicht die FactorySupportFacility brauchen UsingFactoryMethod zu verwenden.

Auf jeden Fall scheint es ziemlich seltsam, eine Abhängigkeit zu UrlHelper haben ...

+0

Danke, das ist ziemlich genau das, was ich gefunden habe. Ich verwende UrlHelper in einer OutputCacheHelper-Klasse, die Seiten aus dem Cache entfernt, zum Beispiel mit: _response.RemoveOutputCacheItem (_urlHelper.RouteUrl ("Home")); Dies wird von mehreren Controllern verwendet, daher schien es sinnvoll, es in eine separate Klasse umzuwandeln, die Abhängigkeiten von HttpRequestBase und UrlHelper aufweist. Ist das schlecht? –

+1

@Mauricio Scheffer: Warum scheint es seltsam? Wie sollen URLs in Diensten generiert werden? Angenommen, Sie müssen eine URL in eine E-Mail innerhalb eines E-Mail-Versanddienstes einfügen. Wie würdest du das machen? – mattalxndr

1

Die einzige Möglichkeit, die ich gefunden habe, ist eine IUrlHelper Schnittstelle zu deklarieren und eine Wrapper-Klasse um UrlHelper zu implementieren, die es implementiert. Dann können wir entweder eine Instanz der Wrapper-Klasse mit IOC injizieren oder in Unit-Tests ein Mock-Objekt injizieren. Es ist ein bisschen Schmerz, aber es funktioniert.

3

ich darüber gebloggt (unter anderem) vor wenigen Tagen here. Es funktioniert mit (kommendem) Windsor 2.5. Bis dahin sollte der Vorschlag von Mauricio Ihre sicherste Wette sein.

Verwandte Themen