2010-12-05 3 views
16

Я только начал играть с контейнерами IoC и, следовательно, был в курсе Ninject.MVC3 + 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()); 
    } 

} 

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

ответ

15

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

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

Кроме того, исправление больше не используется, когда вы используете текущую версию для сервера сборки: http://teamcity.codebetter.com


UPDATE: Пакет Ninject.MVC3 продолжает обновляться и работает OOTB против MVC4 RTM (и RC). См. this page in the wiki.

+0

Отлично! - Да, узнал о резольвере зависимости. – ebb 2010-12-05 20:49:22

Смежные вопросы