2010-06-02 5 views
6

J'ai un composant qui dépend de UrlHelper que j'ai besoin d'enregistrer en utilisant Castle Windsor. UrlHelper à son tour a depdendencies sur RequestContext (et RouteCollection).Comment injecter UrlHelper dans MVC en utilisant Castle Windsor

Maintenant, mon contrôleur a une propriété Url de type UrlHelper, mais je ne peux pas vraiment y accéder pour autant que je sache.

Quel est le moyen le plus efficace d'enregistrer ma dépendance UrlHelper (en utilisant une configuration fluide)?

Répondre

7

Pas assez et n'a pas été testé, mais il devrait fonctionner:

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

Les futures versions de Windsor ne sera pas nécessaire d'utiliser le FactorySupportFacility UsingFactoryMethod.

Quoi qu'il en soit, il semble plutôt étrange d'avoir une dépendance à UrlHelper ...

+0

Merci, c'est à peu près ce que j'ai fini avec. J'utilise UrlHelper dans une classe OutputCacheHelper qui supprime des pages du cache en utilisant par exemple: _response.RemoveOutputCacheItem (_urlHelper.RouteUrl ("Home")); Ceci est utilisé par plusieurs contrôleurs, il semblait donc logique de le refactoriser en une classe distincte qui dépend de HttpRequestBase et UrlHelper. Est-ce mauvais? –

+1

@Mauricio Scheffer: Pourquoi cela semble-t-il étrange? Comment êtes-vous censé générer des URL dans les services? Dites que vous devez coller une URL dans un e-mail dans un service d'envoi de courrier électronique? Comment feriez-vous cela? – mattalxndr

1

La seule façon que j'ai trouvé pour ce faire est de déclarer une interface IUrlHelper, et d'implémenter une classe wrapper autour de UrlHelper qui l'implémente. Ensuite, nous pouvons soit injecter une instance de la classe wrapper en utilisant IOC, soit injecter un objet simulé dans les tests unitaires. C'est un peu pénible, mais ça fonctionne.

3

Je blogué à ce sujet (entre autres) il y a quelques jours here. Cela fonctionne avec (à venir) Windsor 2.5. Jusque-là, la suggestion de Mauricio devrait être votre pari le plus sûr.

Questions connexes