ASP.NET MVC 2, Ninject 2.2 и для этого объекта не определен конструктор без параметров - PullRequest
5 голосов
/ 23 апреля 2011

Итак, я провел некоторое время с ASP.NET MVC 2 (в настоящее время застрял с использованием Visual Studio 2008) и теперь перешел на использование Ninject 2.2 и его интеграцию с MVC. Я скачал Ninject 2.2 и Ninject.Web.Mvc из следующих мест:

https://github.com/downloads/ninject/ninject/Ninject-2.2.0.0-release-net-3.5.zip
https://github.com/downloads/ninject/ninject.web.mvc/Ninject.Web.Mvc2-2.2.0.0-release-net-3.5.zip

И ссылался на них в моем проекте MVC 2. Мой файл Global.asax.cs выглядит следующим образом (в значительной степени то, что говорит Ninject.Web.Mvc README):

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Ninject.Web.Mvc;
using Ninject;

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

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

        protected override void OnApplicationStarted() {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
        }

        protected override IKernel CreateKernel() {
            var kernel = new StandardKernel();

            kernel.Bind<IFoo>().To<Foo>();

            return kernel;
        }
    }
}

И домашний контроллер, который выглядит так:

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

namespace Mvc2.Controllers {
    public class HomeController : Controller {
        private readonly IFoo foo;

        public HomeController(IFoo foo) {
            this.foo = foo;
        }

        public ActionResult Index() {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }
    }
}

Теперь каждый раз, когда я запускаю свой проект и захожу '/', я получаю желтый экран смерти с сообщением, которое гласит: «Для этого объекта не определен конструктор без параметров». Кажется, Ninject не разрешает мой сервис Foo и не внедряет его в HomeController. Я предполагаю, что упускаю что-то действительно очевидное, но я просто не вижу этого.

Как заставить Ninject вводить Foo в HomeController и без использования атрибутов Ninject?

1 Ответ

4 голосов
/ 24 апреля 2011

Me : Не могли бы вы предоставить немного больше информации о реализации сервиса IFoo? Удовлетворены ли все его собственные зависимости?

Сам : Хм, нет, это не так. Оказывается, я не связывал его зависимости. Мальчик, это сообщение об ошибке и трассировка стека вводят в заблуждение!


Так что моя ошибка заключалась в том, что я не связывал одну из зависимостей реализации IFoo, и поэтому Ninject молча потерпел неудачу и попытался продолжить свой веселый путь. Что действительно прискорбно, потому что это может привести к какому-то странному поведению, если я отклонюсь от тривиальной схемы. Я предполагаю, что мой следующий вопрос должен состоять в том, как я могу заставить Ninject терпеть неудачу как можно раньше и обеспечивать хорошее сообщение о том, что не так? Но сейчас я могу, по крайней мере, продолжать это.

...