2010-06-02 28 views
6

Ho un componente che ha una dipendenza da UrlHelper che devo registrare usando Castle Windsor. UrlHelper ha a sua volta dipendenze su RequestContext (e RouteCollection).Come iniettare UrlHelper in MVC usando Castle Windsor

Ora il mio controller ha una proprietà Url di tipo UrlHelper ma non posso realmente accedervi per quanto posso dire.

Qual è il modo più efficiente per registrare la mia dipendenza da UrlHelper (utilizzando una configurazione fluente)?

risposta

7

Non abbastanza e non testato, ma dovrebbe funzionare:

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)); 
    })); 

Le versioni future di Windsor non avranno bisogno del FactorySupportFacility usare UsingFactoryMethod.

In ogni caso sembra piuttosto strano avere una dipendenza da UrlHelper ...

+0

Grazie, è praticamente quello che ho finito. Sto usando UrlHelper in una classe OutputCacheHelper che rimuove le pagine dalla cache usando ad esempio: _response.RemoveOutputCacheItem (_urlHelper.RouteUrl ("Home")); Questo è utilizzato da più controller, quindi è sembrato avere senso rifattarlo in una classe separata che ha dipendenze da HttpRequestBase e UrlHelper. È cattivo? –

+1

@Mauricio Scheffer: Perché sembra strano? Come si suppone di generare URL nei servizi? Di 'che devi inserire un URL in una e-mail all'interno di un servizio di invio di e-mail? Come lo faresti? – mattalxndr

1

L'unico modo che ho trovato di fare questo è dichiarare un'interfaccia IUrlHelper e implementare una classe wrapper attorno a UrlHelper che la implementa. Quindi possiamo iniettare un'istanza della classe wrapper usando IOC, oppure nei test unitari iniettare un oggetto mock. È un po 'un dolore, ma funziona.

3

ho bloggato su di esso (tra le altre cose) pochi giorni fa here. Funziona con (imminente) Windsor 2.5. Fino a questo, il suggerimento di Mauricio dovrebbe essere la tua scommessa più sicura.

Problemi correlati