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á :)