2010-01-11 5 views
0

J'essaie de créer une application ASP.NET MVC en utilisant Spring.NET pour injecter des dépendances. L'application comporte trois niveaux: Contrôleur, Service et Données.Dépendances de Spring.NET non injectées

J'ai défini les objets dans le fichier "~ \ Resources \ objects.xml".

Mon premier objet, UserAccountController, requiert l'injecion de deux classes de niveau Service: UserAccountService et DepartmentService. Ainsi, la définition objects.xml ressemble à ceci:

<object id="UserAccountController" type="App.Controllers.UserAccountController, App"> 
    <constructor-arg index="0" ref="DepartmentService" /> 
    <constructor-arg index="1" ref="UserAccountService" /> 
</object> 

<object id="UserAccountService" type="App.Service.UserAccountService, App"> 
    <property name="UserAccountDao" ref="UserAccountDao" /> 
</object> 

<object id="UserAccountDao" type="App.Data.UserAccountDao, App" /> 

<object id="DepartmentService" type="App.Service.DepartmentService, App"> 
    <property name="DepartmentDao" ref="DepartmentDao" /> 
</object> 

<object id="DepartmentDao" type="App.Data.DepartmentDao" /> 

Webconfig contient ceci:

<sectionGroup name="spring"> 
     <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/> 
    </sectionGroup> 
</configSections> 
<spring> 
    <context> 
     <resource uri="~/Resources/objects.xml" /> 
    </context> 
</spring> 

Je préférerais utiliser l'injection de la propriété plutôt que constructeur, mais actuellement aucune méthode fonctionne.

Répondre

3

Eh bien, il est avéré être que ASP.NET MVC et Spring.NET mais ne vous entendez pas ...

Cependant, le paquetage MvcContrib (en fait, le paquet Extras) semble avoir résolu le problème. Le package avait une implémentation d'usine Spring Controller qui fonctionnait, et tout était heureux.

(sorte de me rappelle d'essayer de faire Struts 1.x et travail du printemps sur le côté Java ...)

1

dans votre bootstrapclass vous devez charger le conteneur de ressort

ContextRegistry.getContext(); 

par la façon dont vous devez spécifier le nom de montage pour DepartmentDao

<object id="DepartmentDao" type="App.Data.DepartmentDao, App" /> 
+0

J'ai en fait une classe SpringApplicationController et une classe de ControllerFactory de printemps, et les référence dans Global.asax .cs: ​​ ControllerBuilder.Current.SetControllerFactory (typeof (App.Util.SpringControllerFactory)); Dois-je toujours obtenir le contexte si j'utilise cette méthode? – Jason

+0

honnêtement, je ne sais pas. Mais évidemment pas. La meilleure pratique pour Inversion of Control est de charger le conteneur au début de l'application et de ne pas avoir d'autres références au conteneur. Si la configuration est bien faite, appelez ContextRegistry.getContext(); devrait gérer tout – Fabiano

+0

D'accord, j'ai jeté les implémentations fantaisistes de ControllerFactory et ApplicationContext en faveur d'un simple appel à ContextRegistry.getContext(), et je suis revenu à l'habituel ContextHandler dans web.config. Toujours pas de chance pour l'injection. – Jason

0

Informations complémentaires: J'ai aussi des cours pour SpringApplicationController et SpringControllerFactory:

SpringApplicationController.cs:

public static class SpringApplicationContext 
{ 
    private static IApplicationContext Context { get; set; } 

    /// <summary> 
    /// Returns a boolean value if the current application context contains an named object. 
    /// </summary> 
    /// <param name="objectName">Accepts the name of the object to check.</param> 
    public static bool Contains(string objectName) 
    { 
     SpringApplicationContext.EnsureContext(); 
     return SpringApplicationContext.Context.ContainsObject(objectName); 
    } 

    /// <summary> 
    /// Return a instance of an object in the context by the specified name. 
    /// </summary> 
    /// <param name="objectName">Accepts a string object name.</param> 
    public static object Resolve(string objectName) 
    { 
     SpringApplicationContext.EnsureContext(); 
     return SpringApplicationContext.Context.GetObject(objectName); 
    } 

    /// <summary> 
    /// Return a instance of an object in the context by the specified name and type. 
    /// </summary> 
    /// <typeparam name="T">Accepts the type of the object to resolve.</typeparam> 
    /// <param name="objectName">Accepts a string object name.</param> 
    public static T Resolve<T>(string objectName) 
    { 
     return (T)SpringApplicationContext.Resolve(objectName); 
    } 

    private static void EnsureContext() 
    { 
     if (SpringApplicationContext.Context == null) 
     { 
      SpringApplicationContext.Context = ContextRegistry.GetContext(); 
     } 
    } 
} 

SpringControllerFactory.cs:

public class SpringControllerFactory : DefaultControllerFactory 
{ 
    public IController CreateController(RequestContext context, Type controllerType) 
    { 
     IResource input = new FileSystemResource(context.HttpContext.Request.MapPath("Resource\\objects.xml")); 
     IObjectFactory factory = new XmlObjectFactory(input); 

     return (IController) factory.GetObject(controllerType.Name); 
    } 

    public IController CreateController(RequestContext context, string controllerName) 
    { 
     IController controller = null; 
     string controllerClassName = string.Format("{0}Controller", controllerName); 

     if (SpringApplicationContext.Contains(controllerClassName)) 
     { 
      controller = SpringApplicationContext.Resolve<IController>(controllerClassName); 
      this.RequestContext = context; 
     } 
     else 
     { 
      controller = base.CreateController(context, controllerName); 
     } 
     return controller; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     IDisposable disposable = controller as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
    } 
} 

Je fais référence dans mon Global.asax comme suit:

protected void Application_Start() 
    { 

     ControllerBuilder.Current.SetControllerFactory(typeof(App.Util.SpringControllerFactory)); 


     RegisterRoutes(RouteTable.Routes); 
    } 
+0

où IAmplicationContext Context est-il défini dans SpringApplicationContext? – Fabiano