Как заставить ninject 2.0 работать с asp.net mvc 2?

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

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

я продолжаю получать сообщение «Для этого объекта не определен конструктор без параметров». для моего AccountController. В AccountController внедряются Services. Привязки для этих служб определяются в 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(),
        });
    }
}

person Jitesh Patil    schedule 11.02.2010    source источник
comment
Другие контроллеры работают? Вы построили проект Ninject.Web.Mvc для ASP.NET MVC 2 RC 2?   -  person Charlino    schedule 11.02.2010
comment
@Чарлино. Спасибо, это сработало.   -  person Jitesh Patil    schedule 12.02.2010


Ответы (4)


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

IController GetControllerInstance(Type controllerType)

To

IController GetControllerInstance(
        RequestContext requestContext, Type controllerType)

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

person Jitesh Patil    schedule 12.02.2010
comment
Рад слышать. Выпотрошенный, я не ответил и не получил очки! ;-) - person Charlino; 12.02.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(),
        });
    }
}
person Nathan Lee    schedule 16.02.2010

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

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

    // Kick some butt here
}
person Tomas Aschan    schedule 11.02.2010
comment
Из того, что я вижу в файле «NinjectHttpApplication.cs», функция пуста. я согласен, что я должен сделать это так, как вы сказали (потому что это виртуально), но это не решает мою проблему. - person Jitesh Patil; 11.02.2010

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

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

person ScottS    schedule 11.02.2010
comment
Отредактировал имя файла в вопросе. Это была опечатка. Запятая не имеет значения. это ввод синтаксиса. - person Jitesh Patil; 12.02.2010