2009-09-01 13 views
10

Mam projekt, dla którego używam StructureMap do iniekcji zależności. Projekt kompiluje grzywny jako projekt MVC, ale po przeniesieniu wszystko do projektu MVC2 Jestem teraz Otrzymuję następujący błąd:ASP.NET MVC 2 Preview 1 - Problem z kompilacją sterownika StructureMap Factory

Test.Web.Controllers.StructureMapControllerFactory.GetControllerInstance(System.Type)': no suitable method found to override C:\Test\Web\Controllers\StructureMapControllerFactory.cs 11 40 Test.Web

Oto moja StructureMapControllerFactory:

using System; 
using System.Web.Mvc; 
using StructureMap; 

namespace Test.Web.Controllers 
{ 
    public class StructureMapControllerFactory : DefaultControllerFactory 
    { 

     protected override IController GetControllerInstance(Type controllerType)** 
     { 

      IController result = null; 
      try 
      { 
       if (controllerType == null) return base.GetControllerInstance(controllerType); 
       result = ObjectFactory.GetInstance(controllerType) as Controller; 

      } 
      catch (StructureMapException) 
      { 
       System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
       throw; 
      } 

      return result; 
     } 

    } 
} 

Znalazłem jedno stanowisko semi- powiązany z tym problemem, ale nie oferował żadnych informacji na temat sposobu rozwiązania mojego problemu: MVC 2 preview 1 - methods with parameters in the controller fail to load

Oczywiście brakuje mi zmiany od progresji 1,0-2,0, ale nie jestem pewien, co się zmieniło. Każda pomoc jest zawsze doceniana.

Odpowiedz

19

Podpis tej metody został zmieniony. Istnieje obecnie pierwszy argument RequestContext:

protected override IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

Trzeba także zmienić wywołanie base.GetControllerInstance:

if (controllerType == null) 
    return base.GetControllerInstance(requestContext, controllerType); 
+0

Dziękuję bardzo Craig. Zastanawiam się, dlaczego nie jest to odzwierciedlone w przeglądarce obiektów VS podczas eksploracji przestrzeni nazw System.Web.MVC [2.0.0.0]. –

+1

Nie jestem pewien, ale możesz wpisać ov [spacja] w edytorze kodu (tzn. Zacząć pisać "przesłonić", gdzie normalnie zadeklarujesz nową metodę), aby uzyskać listę metod przeciążeniowych dla aktualnej klasy z ich podpisami. –

1

Wywiodłem go z odbłyśnikiem i rzeczywiście podpis funkcja jest zmienione. się

chroniony wewnętrzny wirtualny IController GetControllerInstance (RequestContext RequestContext, Typ controllerType)

DLL MVC 2 zamieszkuje tutaj: C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 2 \ konfekcjonowane \ System.Web.Mvc.dll

Dzięki, rozwiązałam mój problem!

8

Craig Stuntz jest tutaj bardzo poprawny.

Tylko pamiętaj, aby pamiętać o System.Web.Routing dodatkowo, jeśli twój DI jest w innym projekcie niż aplikacja MVC.

Z jakiegoś powodu w IDE nie pojawiły się żadne błędy, ale podczas kompilacji nadal otrzymywałbym "GetControllerInstance" "brak odpowiedniej metody, którą można przesłonić."

Po skorygowaniu brakującego zestawu referencyjnego System.Web.Routing, wszystko było dobrze ...

+0

Dzięki !. Nie wiem jeszcze dlaczego, ale dodanie dla mnie tego odniesienia do System.Web.Routing zostało rozwiązane! –

+0

Dzięki za komentarz System.Web.Routing - zaoszczędziłem czas na debugowanie. – Ben