2010-12-05 12 views
16

Artık IoC konteynerleriyle oynamaya başladım ve bu nedenle Ninject'i seçtim.MVC3 + Ninject - Nasıl Yapılır?

Birkaç saat ter ve gözyaşından sonra hala MVC3 uygulamamı Ninject ile nasıl kuracağımı anlayamıyorum.

Şimdiye kadar var:

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

Ben Index yüklemeyi deneyin her görüntülemek ya sadece taşma istisna veya HTTP 404 hata atar
public class TestController : Controller 
{ 

    private readonly IGreetingService service; 

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

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

} 

- Bütün Ninject kodu kaldırırsanız o sorun ne, mükemmel çalışıyor?

cevap

15

Kendi bağımlılık çözümleyicisini MVC uzantısıyla karıştırıyorsunuz. Kendi bağımlılık çözümleyicinize veya MVC uzantısını kullanmaya devam etmenizi öneririm, ancak ikisini de değil. MVC uzantısını kullanırken Application_Start yerine OnApplicationStarted kullanmanız gerekir.

Bkz. http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ ve MVC uzantısı https://github.com/ninject/ninject.web.mvc'un kaynak koduyla birlikte gelen SampleApplication'a bakın. http://teamcity.codebetter.com


GÜNCELLEME: Eğer derleme sunucusu için geçerli sürümünü kullandığınızda

Ayrıca düzeltme artık kullanılmaz Ninject.MVC3 paket güncellenmesi devam etmekte ve MVC4 RTM (ve RC) karşı adet OTB çalışır. Ayrıntılar için bkz. this page in the wiki.

+0

Mükemmel! - Yea bağımlılık çözümleyicisiyle ilgili olarak bulundu. – ebb

+0

-1. Örnek uygulamanızı indirmek için bağlantınıza gittim. Bu dosya eksik ve –

+2

derleyecektir @Christian Payne Hepsi var. Sadece ne kadar oku! CI Server, –