2010-02-11 14 views
6

używam: -Jak uzyskać program ninject 2.0 z programem asp.net mvc 2?

  1. asp.net mvc rc 2
  2. Ninject i ninject asp.net mvc rozszerzeń (http://github.com/enkari/ninject.web.mvc)

ciśgle na „nie konstruktora bez parametrów zdefiniowanych dla tego obiekt.' dla mojego AccountController. KontoController jest wstrzykiwany za pomocą Usług. Powiązania dla tych usług są zdefiniowane w ServiceModule.

Znajdź poniżej kod dla mojej aplikacji MvcApplication w pliku Global.asax.cs.

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
+0

Są inne kontrolery pracujące? Czy zbudowałeś projekt Ninject.Web.Mvc przeciwko ASP.NET MVC 2 RC 2? – Charlino

+0

@Charlino. Dzięki, że zadziałało. –

Odpowiedz

7

Przebudowanie programu Ninject.Web.Mvc przeciwko bibliotekom DLL ASP.Net MVC 2 rozwiązało problem. Problem dotyczy klasy NinjectControllerFactory. Podpis metody uzyskania instancji kontrolera uległa zmianie w MVC 2.

IController GetControllerInstance(Type controllerType) 

Aby

IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 

Dokonaj niezbędnych zmian i odbudować rozszerzenie Ninject MVC i wszystko działa poprawnie. Dzięki @Charlino za sugestię.

+1

Dobrze słyszeć. Patroszone Nie zrobiłem tego jako odpowiedzi i zdobądź punkty! ;-) – Charlino

-1

W programie Ninject nie należy zastępować metody Application_Start. Jeśli potrzebujesz rzeczy zrobionych, które nie są automatyczne (jak rejestracja obszarów - nie wiem z góry, czy Ninject robi to za Ciebie), zadzwoń pod numer base.OnApplicationStarted(), aby uruchomić wszystkie operacje związane z językiem Ninject prawidłowo.

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 

    // Kick some butt here 
} 
+0

Z tego, co widzę w pliku "NinjectHttpApplication.cs", funkcja jest pusta. Zgadzam się, że powinienem to zrobić tak, jak powiedziałeś (ponieważ jest wirtualny), ale to nie rozwiązuje mojego problemu. –

-1

Kod wygląda poprawnie z wyjątkiem przecinka po "nowym ServiceModule()".

Powinien być w pliku Global.asax.cs, a nie Global.aspx.cs.

+0

Edytował nazwę pliku w pytaniu. To był błąd w pisaniu. Przecinek nie ma znaczenia. to jest pisanie składni. –

1

Z jakiegoś powodu odkryłem, że jeśli twój globalny.asax.cs dziedziczy po NinjectHttpApplication OnApplicationStarted(), nie zostanie wywołany. Zmień metodę OnApplicationStarted(), aby zastąpić Init(), i powinna działać.

Patrz poniżej:

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    public override void Init() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
Powiązane problemy