2010-01-10 13 views
7

tratando de abrirme camino a través del libro MVC de Steve Sandersons, pero he chocado contra una pared de ladrillo al crear WindsorControllerFactory. Parece que el método cambió de MVC1 a MVC2. Este es el error que recibo al intentar compilar el proyecto:SportStore: WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: no se ha encontrado un método adecuado para reemplazar

'WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: no se ha encontrado ningún método adecuado para anular'. Cualquier ayuda sería apreciada - No puedo pasar esto!

Este es el código - como transcrito del libro:

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

++++ Saludos, Martin

+0

¡Estoy tan contento de que exista! Gracias por hacer esta pregunta! – Roger

Respuesta

1

En MVC2, la firma de este método es el siguiente: (. Tomado de MSDN)

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

+0

Guau, ¡eso fue rápido! Gracias. Pero ... Ahora recibo el siguiente error: 'WebUI.WindsorControllrtFactory.GetControllerInstance (System.Web.Routing.RequestContext, System.Type)' debe declarar un cuerpo porque no está marcado como abstract, extern o parcial ¿Alguna idea? – Spudhead

+0

enviar el código corregido - usted tiene un error tipográfico ... –

+0

sé, lo siento - la: anulación protegida IController GetControllerInstance ( RequestContext RequestContext, Tipo controllerType) { retorno (IController) container.Resolve (controllerType); } corrigió el problema, gracias. – Spudhead

14

El GetControllerInstance cambiado de ASP.NET MVC 1.0 a ASP.NET MVC 2 debido a un desafortunado error con respecto a las condiciones de carrera.

La firma en ASP.NET MVC 1.0 fue:

protected virtual IController GetControllerInstance(
    Type controllerType); 

Y en ASP.NET MVC 2 que es:

protected virtual IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

Para este caso particular, parece que sólo tendrá para cambiar la firma de su método a:

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

La condición de carrera subyacente era que la instancia de RequestContext cou Debería ser compartido por múltiples solicitudes simultáneas, lo que sería un gran no-no. Afortunadamente, no parecía que los usuarios se toparan con ese problema, pero se corrigió de todos modos en ASP.NET MVC 2.

+0

Eso lo hizo - ¡No puedo agradecerle lo suficiente! ¡He estado jugando por horas tratando de encontrar la manera de solucionarlo! Brillante, muchas gracias. – Spudhead

+0

+1 - gracias por la explicación de la condición de carrera –

Cuestiones relacionadas