flozano.com: Haz commit, maldito!
Desarrollo de software y otras pérdidas de tiempo
Desarrollo de software y otras pérdidas de tiempo
La inyección de dependencias es uno de esos patrones que realmente hay que usar en cualquier proyecto no trivial. En .NET está muy de moda Castle Windsor y algún otro contenedor ligero… pero yo estoy bastante cómodo (de momento, no descarto nada) con Spring.NET. A la hora de integrar Spring.NET con ASP.NET MVC, eché un vistazo a google y nada de lo que ví me convenció realmente (igual no busqué demasiado), así que decidí hacermelo yo.
Aprovechando la facilidad para extender el framework, en el global.asax.cs metemos una línea como esta:
1 2 | // ControllerBuilder, para que se inyecten los controladores. ControllerBuilder.Current.SetControllerFactory(new Arc.Web.Mvc.SpringControllerFactory()); |
y creamos la clase (Arc.Web.Mvc.SpringControllerFactory) tal que así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | namespace Arc.Web.Mvc { public class SpringControllerFactory : DefaultControllerFactory, IControllerFactory { #region IControllerFactory Members public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) { // Probado y funciona! IController ctrl = base.CreateController(requestContext, controllerName); if(ctrl!=null) { IApplicationContext ctx = ContextRegistry.GetContext(); string objectName = controllerName + "Controller"; if (ctx.ContainsObjectDefinition(objectName)) { ctrl = (IController)ctx.ConfigureObject(ctrl, objectName); } } return ctrl; } #endregion } } |
Luego solo necesitamos definir los controllers en el application-context de spring como cualquier otro objeto:
<object name="AccountController" type="W.Web.Public.Controllers.AccountController, W.Web.Public" autowire="byName" singleton="false"/>
Y ya está
28 de Octubre de 2009 - 23:45
Hola Fran!
pese a que me he perdido bastante en el artículo (ya sabes q mi base de spring es flojita, jeje), es todo un gustazo volverte a leer y que compartas parte de lo mucho que sabes.
saludos.
2 de Noviembre de 2009 - 14:44
Bueno, en realidad no es un post generalista, es contar una solución a un problema concreto para integrar ASP.NET MVC con Spring.NET.
El objetivo era tener “rellenos” y configurados los objetos *Controller de ASP.NET MVC, aunque permitiéndole al framework gestionar el ciclo de vida como él considere. No quería meterme en el berenjenal de saber si MVC reutiliza o no controladores, o bajo qué condiciones, o si los comparte por threads, o si hay un pool… tu sabes que no hay que subestimar nunca la capacidad cosas raras de Microsoft para hacer cosas raras e inventarse historias extrañas en cuanto a arquitectura
.
Por eso, lo que hago es heredar del factory de controllers por defecto, para que sea él quien decida si devuelve el mismo controller o instancia otro…
… y utilizo la magia de spring para, con el ApplicationContext (el “centro neurálgico” de Spring), configurar ese objeto, según la definición que haya en el applicationContext para un objeto con ID NombreControladorController (de ahí la concatenación de +”Controller” para obtener el ID).
Lo dicho, un problema muy específico que sólo tendrá sentido para quien lo haya necesitado
)
3 de Noviembre de 2009 - 17:54
Madre mia fran, que bonito esta ahora el blog jejej nuevo look
…