2010-01-10 3 views
7

versucht, sich durch Steve Sandersons MVC Buch arbeiten - aber eine Mauer bei der Erstellung der WindsorControllerFactory getroffen haben. Es sieht so aus, als ob die Methode hat geändert von MVC1 zu MVC2 Dies ist der Fehler, den ich erhalte, wenn ich versuche, das Projekt zu kompilieren:SportStore: WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: keine geeignete Methode zum Überschreiben gefunden

'WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: keine geeignete Methode zum Überschreiben'. Jede Hilfe wäre willkommen - Ich komme nicht darüber hinaus!

Dies ist der Code - wie aus dem Buch:

transkribiert
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); 
     } 
    } 
} 

++++ Regards, Martin

+0

Ich bin so froh, dass SO existiert! Danke, dass du diese Frage gestellt hast! – Roger

Antwort

1

In MVC2, ist die Signatur dieser Methode wie folgt: (. Von MSDN Genommen)

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

+0

Wow - das war schnell! Vielen Dank. Aber ... Jetzt bekomme ich den folgenden Fehler: 'WebUI.WindsorControllrtFactory.GetControllerInstance (System.Web.Routing.RequestContext, System.Type)' muss einen Körper deklarieren, weil es nicht abstrakt, extern oder markiert ist teilweise Irgendwelche Ideen? – Spudhead

+0

Beitrag der korrigierte Code - Sie haben einen Tippfehler ... –

+0

Ich weiß, sorry - das: protected override IRegler GetControllerInstance ( Requestrequest, Typ controller) { return (IRegler) container.Resolve (controller); } das Problem behoben - danke. – Spudhead

14

Die GetControllerInstance geändert von ASP.NET MVC 1.0 zu ASP.NET MVC 2 aufgrund eines unglücklichen Bugs bezüglich der Rennbedingungen.

Die Signatur in ASP.NET MVC 1.0 war:

protected virtual IController GetControllerInstance(
    Type controllerType); 

Und in ASP.NET MVC 2 ist:

protected virtual IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

Für diesen speziellen Fall sieht es aus wie Sie werde haben zu ändern, um die Signatur Ihrer Methode zu: war

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

die zugrunde liegende race-Bedingung, dass die Request Instanz cou ld werden von mehreren gleichzeitigen Anfragen geteilt, was ein großes Nein wäre. Zum Glück schien es nicht, dass irgendwelche Benutzer in dieses Problem lief, aber es wurde trotzdem in ASP.NET MVC 2 behoben.

+0

Das hat es getan - ich kann dir nicht genug danken! Ich bin stundenlang verrückt geworden und habe versucht, einen Weg zu finden, es zu reparieren! Brilliant, vielen Dank. – Spudhead

+0

+1 - danke für die Erklärung der Race Condition –