2010-06-02 11 views
6

Tengo un componente que tiene una dependencia en UrlHelper que necesito registrar usando Castle Windsor. UrlHelper tiene a su vez depredencias en RequestContext (y RouteCollection).Cómo inyectar UrlHelper en MVC usando Castle Windsor

Ahora mi controlador tiene una propiedad Url de tipo UrlHelper, pero realmente no puedo acceder a esto hasta donde yo sé.

¿Cuál es la forma más eficiente de registrar mi dependencia de UrlHelper (usando una configuración fluida)?

Respuesta

7

No es bonita y no probado pero debería funcionar:

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

versiones futuras de Windsor no necesitarán la FactorySupportFacility utilizar UsingFactoryMethod.

De todos modos parece bastante extraño tener una dependencia a UrlHelper ...

+0

Gracias, eso es más o menos con lo que terminé. Estoy usando UrlHelper en una clase OutputCacheHelper que elimina páginas del caché utilizando, por ejemplo: _response.RemoveOutputCacheItem (_urlHelper.RouteUrl ("Home")); Esto es utilizado por varios controladores, por lo que parecía tener sentido refactorizarlo en una clase separada que tiene dependencias en HttpRequestBase y UrlHelper. ¿Es esto malo? –

+1

@Mauricio Scheffer: ¿Por qué parece extraño? ¿Cómo se supone que debes generar URLs en los servicios? Supongamos que necesita insertar una URL en un correo electrónico dentro de un servicio de envío de correo electrónico. ¿Cómo lo harías tú? – mattalxndr

1

La única manera que he encontrado para hacer esto es declarar una interfaz IUrlHelper, y para implementar una clase contenedora alrededor de UrlHelper que lo implementa. Entonces podemos inyectar una instancia de la clase contenedora usando IOC, o en pruebas unitarias inyectar un objeto simulado. Es un poco molesto, pero funciona.

3

blogged sobre él (entre otras cosas) Hace unos días here. Funciona con (próxima) Windsor 2.5. Hasta que eso suceda, la sugerencia de Mauricio debería ser su apuesta más segura.

Cuestiones relacionadas