3 votes

Injecter l'objet avec la portée "request" dans l'objet prototype

J'utilise Spring.Net dans mon application Asp.Net MVC où les contrôleurs doivent être définis comme des prototypes (non singleton). J'ai des objets qui doivent avoir une portée de requête (nouvel objet pour chaque requête). Existe-t-il un moyen de les injecter dans mon contrôleur ?

  <object type="xx.CompanyController, xx" singleton="false">
    <property name="Service" ref="ServiceA" />
  </object>

  <object id="ServiceA" type="xx.ServiceA, xx" scope="request"/>    
    <property name="ObjectB" ref="ObjectB" />
  </object>

  <object id="ObjectB" type="xx.ObjectB, xx" scope="request"/>

Ainsi, tous les objets, à l'exception des contrôleurs, sont traités comme des singleton. ObjectB ne doit pas être un prototype car il est référencé par d'autres objets qui doivent partager la même instance. Supprimer singleton="false" du contrôleur et ajouter scope="request" ne fonctionne pas non plus (le contrôleur est traité comme un singleton).

J'utilise Spring.Net 1.3.1 avec MvcApplicationContext.

0voto

Nuri YILMAZ Points 1567

Vous devez définir ControllerFactory avec le vôtre.

protected void Application_Start()
{
//...
    ControllerBuilder.Current.SetControllerFactory(new IoCControllerFactory());
//...
}

IoCControllerFactory doit hériter de DefaultControllerFactory

public class IoCControllerFactory : DefaultControllerFactory

Et surchargez GetControllerInstance

protected override IController GetControllerInstance (RequestContext requestContext, Type controllerType)
    {
        ObjectTypeUtility.ArgumentIsNull(controllerType, "controllerType", true);
         if (!typeof(IController).IsAssignableFrom(controllerType))
             throw new ArgumentException(string.Format(
                       "Type requested is not a controller: {0}",
                       controllerType.Name), 
                        "controllerType");    

            IController controller = IoCWorker.Resolve(controllerType) 
                                      as IController;                
            return controller;

    }

IoCWorker est une classe qui possède la méthode Resolve pour l'injection, J'utilise Unity et je n'ai pas pu donner l'implémentation de IoCWorker - si vous en avez besoin, je peux la partager -.

Il fonctionnera en injectant un ctor pour votre contrôleur.

Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X