2010-01-10 15 views
7

próbuje przejść przez książkę Steve Sandersons MVC - ale uderzył w mur podczas tworzenia WindsorControllerFactory. Wygląda na to, że metoda zmieniono z MVC1 na MVC2 Jest to błąd, który dostaję podczas próby kompilacji projektu:SportStore: WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: nie znaleziono odpowiedniej metody, aby przesłonić

'WebUI.WindsorControllerFactory.GetControllerInstance (Typ systemu: brak odpowiedniej metody, którą można zastąpić). Każda pomoc byłaby doceniona - Nie mogę się przedostać!

To jest kod - zgodnie z zapisami w książce:

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

++++ Pozdrawiam, Martin

+0

Cieszę się, że istnieje! Dziękuję za pytanie! – Roger

Odpowiedz

1

W MVC2, podpis tej metody jest następujący: (. Zrobione z MSDN)

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

+0

Wow - to było szybkie! Dzięki. Ale ... Teraz otrzymuję następujący błąd: "WebUI.WindsorControllrtFactory.GetControllerInstance (System.Web.Routing.RequestContext, System.Type)" musi zadeklarować treść, ponieważ nie jest oznaczona jako abstract, extern lub częściowe Wszelkie pomysły? – Spudhead

+0

post poprawiony kod - masz literówkę ... –

+0

wiem, przepraszam - w: protected override IController GetControllerInstance ( RequestContext RequestContext, Typ controllerType) { powrotu (IController) container.Resolve (controllerType); } Naprawiono problem - dziękuję. – Spudhead

14

GetControllerInstance zmieniło od ASP.NET MVC 1.0 do ASP.NET MVC 2 z powodu niefortunnego błędu dotyczącego warunków wyścigu.

Podpis w ASP.NET MVC 1.0 to:

protected virtual IController GetControllerInstance(
    Type controllerType); 

I w ASP.NET MVC 2 to:

protected virtual IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

W tym konkretnym przypadku wygląda na to, musisz tylko zmienić podpis swojej metody na:

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

Podstawowym warunkiem wyścigu było to, że instancja RequestContext cou Mogę być współdzielony przez wiele równoczesnych żądań, co byłoby głównym nie-nie. Na szczęście nie wydawało się, aby jakikolwiek użytkownik wpadł na ten problem, ale został naprawiony w ASP.NET MVC 2.

+0

To się udało - nie mogę ci wystarczająco podziękować! Robiłem bonker przez wiele godzin próbując znaleźć sposób, żeby to naprawić! Świetnie, wielkie dzięki. – Spudhead

+0

+1 - dziękuję za wyjaśnienie stanu wyścigu –

Powiązane problemy