2010-01-10 3 views
7

, пытающегося проделать мой путь через книгу Стив Сандерсонс MVC, но при создании WindsorControllerFactory ударил кирпичную стену. изменен с MVC1 на MVC2. Это ошибка, которую я получаю при попытке скомпилировать проект:SportStore: WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: не найдено подходящего метода для переопределения

«WebUI.WindsorControllerFactory.GetControllerInstance (System.Type: не найдено подходящего метода для переопределения). Любая помощь будет оценена - Я не могу пройти мимо этого!

Этот код - расшифровано из книги:

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

++++ С уважением, Martin

+0

Я так рад, что существует! Спасибо, что задали этот вопрос! – Roger

ответ

1

В MVC2, подпись этого метода заключается в следующем: (. Взято из MSDN)

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

+0

Ничего себе - это было быстро! Благодарю. Но ... Теперь я получаю следующую ошибку: 'WebUI.WindsorControllrtFactory.GetControllerInstance (System.Web.Routing.RequestContext, System.Type)' должен объявить тело, потому что он не помечен как abstract, extern или частично Любые идеи? – Spudhead

+0

Сообщение исправленный код - у вас есть опечатка ... –

+0

Я знаю, извините -: защищен переопределение IController GetControllerInstance ( RequestContext RequestContext, тип controllerType) { возвращение (IController) container.Resolve (controllerType); } исправил проблему - спасибо. – Spudhead

14

GetControllerInstance изменилось от ASP.NET MVC 1.0 до ASP.NET MVC 2 из-за неудачной ошибки относительно условий гонки.

Подпись в ASP.NET MVC 1.0 был:

protected virtual IController GetControllerInstance(
    Type controllerType); 

И в ASP.NET MVC 2 это:

protected virtual IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

В данном конкретном случае это выглядит, как вы будете иметь только изменить подпись вашего метода на:

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

Основным условием гонки было то, что экземпляр RequestContext cou ld будет разделяться несколькими одновременными запросами, что было бы серьезным no-no. К счастью, это не похоже на то, что все пользователи столкнулись с этой проблемой, но все равно были исправлены в ASP.NET MVC 2.

+0

Это сделало - я не могу вас поблагодарить! Я часами пытаюсь найти способ исправить это! Блестяще, большое спасибо. – Spudhead

+0

+1 - спасибо за объяснение состояния гонки –

Смежные вопросы