2010-01-10 3 views
7

en essayant de me frayer un chemin dans le livre Steve Sandersons MVC - mais j'ai rencontré un mur de briques lors de la création de WindsorControllerFactory. est passé de MVC1 à MVC2, c'est l'erreur que j'obtiens en essayant de compiler le projet:SportStore: WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: aucune méthode appropriée n'a été trouvée pour remplacer

'WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: aucune méthode appropriée pour remplacer le projet.) Toute aide serait appréciée - Je ne peux pas dépasser cela!

Ceci est le code - comme transcrit du livre:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Castle.Windsor; 
using Castle.Windsor.Configuration.Interpreters; 
using Castle.Core.Resource; 
using System.Reflection; 
using Castle.Core; 
using Castle.MicroKernel; 
namespace WebUI 
{ 
    public class WindsorControllerFactory : DefaultControllerFactory 
    { 
     WindsorContainer container; 
     // The constructor: 
     // 1. Sets up a new IoC container 
     // 2. Registers all components specified in web.config 
     // 3. Registers all controller types as components 
     public WindsorControllerFactory() 
     { 
      // Instantiate a container, taking configuration from web.config 
      container = new WindsorContainer(
       new XmlInterpreter(new ConfigResource("castle")) 
       ); 
      // Also register all the controller types as transient 
      var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
            where typeof(IController).IsAssignableFrom(t) 
            select t; 
      foreach (Type t in controllerTypes) 
       container.AddComponentWithLifestyle(t.FullName, t, LifestyleType.Transient); 
     } 
     // Constructs the controller instance needed to service each request 
     protected override IController GetControllerInstance(Type controllerType) 
     { 
      return (IController)container.Resolve(controllerType); 
     } 
    } 
} 

++++ Cordialement, Martin

+0

Je suis tellement content que SO existe! Merci d'avoir posé cette question! – Roger

Répondre

1

En MVC2, la signature de cette méthode est la suivante: (. REPRISES DE MSDN)

protected internal virtual IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType 
) 

+0

Wow - c'était rapide! Merci. Mais ... Maintenant j'obtiens l'erreur suivante: 'WebUI.WindsorControllrtFactory.GetControllerInstance (System.Web.Routing.RequestContext, System.Type)' doit déclarer un corps car il n'est pas marqué abstract, extern, ou partielle Des idées? – Spudhead

+0

Postez le code corrigé - vous avez une faute de frappe ... –

+0

Je sais, désolé - le: protected override iController GetControllerInstance ( RequestContext RequestContext, type controllerType) { retour (iController) container.Resolve (controllerType); } résolu le problème - merci. – Spudhead

14

Le GetControllerInstance changé de ASP.NET MVC 1.0 à ASP.NET MVC 2 en raison d'un bug malheureux concernant les conditions de course.

La signature dans ASP.NET MVC 1.0 est:

protected virtual IController GetControllerInstance(
    Type controllerType); 

Et dans ASP.NET MVC 2 est:

protected virtual IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

Pour ce cas particulier, il semble que vous aurez seulement de changer la signature de votre méthode pour:

protected override IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 
    { 
     return (IController)container.Resolve(controllerType); 
    } 

la condition de la course sous-jacente est que l'instance RequestContext COU ld peut être partagé par plusieurs requêtes simultanées, ce qui serait un non-non majeur. Heureusement, il ne semble pas que les utilisateurs aient rencontré ce problème, mais il a été corrigé de toute façon dans ASP.NET MVC 2.

+0

Cela l'a fait - je ne peux pas vous remercier assez! Je suis allé bonker pendant des heures en essayant de trouver un moyen de le réparer! Brillant, merci beaucoup. – Spudhead

+0

+1 - merci pour l'explication de l'état de la course –

Questions connexes