MVC3 + Ninject - Как? - PullRequest
       7

MVC3 + Ninject - Как?

16 голосов
/ 05 декабря 2010

Я только начал играть с контейнерами IoC и поэтому выбрал Ninject.

После нескольких часов пота и слез я все еще не могу понять, как настроить приложение MVC3 с помощью Ninject.

Пока у меня есть:

Global.asax.cs

public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    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 void Application_Start() 
    {
        DependencyResolver.SetResolver(new MyDependencyResolver(CreateKernel()));
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        var modules = new [] { new ServiceModule() };
        return new StandardKernel(modules);
    }

}

ServiceModule.cs

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IGreetingService>().To<GreetingService>();
    }
}

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver
{
    private IKernel kernel;

    public MyDependencyResolver(IKernel kernel)
    { 
        this.kernel = kernel; 
    }

    public object GetService(System.Type serviceType)
    {
        return kernel.TryGet(serviceType);

    }

    public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType)
    {
        return kernel.GetAll(serviceType);

    }
}

GreetingService.cs

public interface IGreetingService
{
    string Hello();
}

public class GreetingService : IGreetingService
{
    public string Hello()
    {
        return "Hello from GreetingService";
    }
}

TestController.cs

public class TestController : Controller
{

    private readonly IGreetingService service;

    public TestController(IGreetingService service)
    {
        this.service = service;
    }

    public ActionResult Index()
    {
        return View("Index", service.Hello());
    }

}

Каждый раз, когда я пытаюсь загрузить представление Index, оно либо просто генерирует исключение переполнения, либо ошибку HTTP 404 - если я удаляю весь код Ninject, он работает отлично, что не так?

1 Ответ

15 голосов
/ 05 декабря 2010

Вы смешиваете собственный преобразователь зависимостей с расширением MVC.Я бы посоветовал использовать свой собственный преобразователь зависимостей или использовать расширение MVC, но не то и другое вместе. При использовании расширения MVC вы должны использовать OnApplicationStarted вместо Application_Start.

См. http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ и взглянуть на SampleApplication, который поставляется с исходным кодом расширения MVChttps://github.com/ninject/ninject.web.mvc.

Также исправление больше не используется при использовании текущей версии для сервера сборки: http://teamcity.codebetter.com


ОБНОВЛЕНИЕ: Пакет Ninject.MVC3 продолжает обновлятьсяи работает OOTB против MVC4 RTM (и RC).Подробнее смотрите на этой странице в вики .

...