2010-12-05 69 views
16

我剛開始玩IoC容器,因此選擇了Ninject。MVC3 + Ninject - 如何?

經過幾個小時的汗水和眼淚,我仍然無法弄清楚如何使用Ninject安裝我的MVC3應用程序。

到目前爲止,我有:

的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/並查看隨MVC擴展的源代碼https://github.com/ninject/ninject.web.mvc附帶的SampleApplication。

而且修復不再使用,當您使用的構建服務器的當前版本:http://teamcity.codebetter.com


進展:Ninject.MVC3包繼續更新和工作開箱即用的對MVC4 RTM(和RC)。詳細信息請參見this page in the wiki

+0

完美! - 是發現有關依賴解析器。 – ebb 2010-12-05 20:49:22