Как мне получить ninject 2.0, работающий с asp.net mvc 2? - PullRequest
6 голосов
/ 11 февраля 2010

Я использую: -

  1. asp.net mvc rc 2
  2. Расширение Ninject и Njectject asp.net mvc (http://github.com/enkari/ninject.web.mvc)

я продолжаю получать 'конструктор без параметров, определенный для этого объекта.' для моего AccountController. AccountController внедряется с сервисами. Привязки для этих сервисов определены в ServiceModule.

Найдите ниже код моего MvcApplication в 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(),
        });
    }
}

Ответы [ 4 ]

7 голосов
/ 12 февраля 2010

Перестройка Ninject.Web.Mvc против dll ASP.Net MVC 2 исправила проблему Проблема заключается в классе NinjectControllerFactory. Подпись метода для получения экземпляра контроллера изменилась в MVC 2.

IController GetControllerInstance(Type controllerType)

Для

IController GetControllerInstance(
        RequestContext requestContext, Type controllerType)

Внесите необходимые изменения и пересоберите расширение Ninject MVC, и все работает нормально. Спасибо @Charlino за предложение.

1 голос
/ 16 февраля 2010

По какой-либо причине я обнаружил, что если ваш global.asax.cs наследуется от NinjectHttpApplication, OnApplicationStarted () не вызывается. Измените OnApplicationStarted (), чтобы переопределить Init (), и он должен работать.

См. Ниже:

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(),
        });
    }
}
0 голосов
/ 11 февраля 2010

Код выглядит правильно, за исключением запятой после 'new ServiceModule ()'.

Должно быть в Global.asax.cs, а не в Global.aspx.cs.

0 голосов
/ 11 февраля 2010

В Ninject вы не должны переопределять метод Application_Start. Если вам нужны вещи, которые не выполняются автоматически (например, регистрация областей - я не знаю, в первую очередь, если Ninject делает это и для вас), обязательно вызовите base.OnApplicationStarted(), чтобы сделать все для Ninject все работает правильно.

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

    // Kick some butt here
}
...