2010-07-09 9 views
1

J'ai un contrôleur de base qui est défini comme suit, mais le constructeur qui prend la ISiteService n'est exécuté:Pourquoi le constructeur surchargé de BaseController n'est-il pas exécuté?

public class BaseController : Controller 
{ 
    private ISiteService _siteService; 

    public BaseController() {} 

    public BaseController(ISiteService siteService) 
    { 
     _siteService = siteService; // this never gets hit.. 
    } 

    protected override void Initialize(RequestContext rc) 
    { 
     string host = ((rc.HttpContext).Request).Url.Host; 
     Site site = _siteService.GetSiteByHost(host); // so _siteService is null... 

     base.Initialize(rc); 
    } 
} 

quelqu'un peut me dire pourquoi ce serait le cas? Que dois-je faire pour que ce constructeur s'exécute?

Tous les contrôleurs qui implémentent BaseController ont des constructeurs qui prennent différents paramètres fournis par StructureMap, et tous ces constructeurs sont exécutés.

Je ne sais pas si c'est pertinent mais c'est ainsi que je configure StructureMap pour mon injection de dépendance.

private void ConfigureNonOptionalDependencies() 
{ 
    // all other dependencies are registered same as this, 
    // and the constructors all get hit 
    ForRequestedType<ISiteService>() 
     .TheDefaultIsConcreteType<SiteService>(); 
} 

Je suis pas familier avec StructureMap, donc je ne sais pas si elle n'a rien à voir avec cette question, ou si elle est plus d'un problème MVC. Ou est-ce même possible pour cela? Merci

modifier:

aussi, je l'ai essayé ceci:

public class GroupController : BaseController 
{ 

    private readonly IGroupService _groupService; 

    private readonly ISiteService _siteService; 

    public GroupController() {} 

    public GroupController(
     ISiteService siteService 
     ): base(siteService) 
    { 
     _siteService = siteService; 
    } 
} 
+0

Montrez-nous le code appelant de ce BaseController. –

+0

Comment savez-vous que le constructeur de la classe de base n'est jamais touché? Quel est l'effet d'entraînement? – Paolo

+0

Ce n'est pas vraiment une réponse, mais avez-vous besoin du constructeur par défaut? Si vous n'aviez pas cela, on peut supposer que StructureMap appelait le restant. –

Répondre

6

-ce que vos constructeurs de sous-classe comprennent un appel à base?

par exemple.

public MyController(ISiteService siteService) : base(siteService) 
{ 
    //do some MyController specific stuff 
} 
0

Si vous chargez déjà les contrôleurs via structuremap, pourquoi ne pas éliminer le constructeur sans paramètre? Vous n'en avez plus besoin et c'est probablement déroutant quelque chose. . .

0

Structure Map NuGet est différent pour les projets MVC et API. On dirait que vous avez installé NuGet uniquement pour le projet MVC.

Essayez d'installer StructureMap.WebApi2