2010-12-05 10 views
16

मैंने अभी आईओसी कंटेनरों के साथ खेलना शुरू कर दिया है और इसलिए निनजेक का पीछा किया है।एमवीसी 3 + निनजेक्ट - कैसे करें?

पसीने और आंसुओं के कई घंटों के बाद भी मैं यह नहीं समझ सकता कि निनजेक्ट के साथ मेरे एमवीसी 3 एप्लिकेशन को कैसे सेट अप करें।

अब तक मेरे पास है:

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

आप एमवीसी एक्सटेंशन के साथ एक निर्भरता संकल्प मिश्रण कर रहे हैं। मैं या तो अपने स्वयं के निर्भरता रिज़ॉल्वर या एमवीसी एक्सटेंशन का उपयोग करने के साथ सुझाव देना चाहता हूं लेकिन दोनों नहीं। एमवीसी एक्सटेंशन का उपयोग करते समय आपको एप्लिकेशन_स्टार्ट के बजाय ऑनएप्लिकेशंस स्टार्ट का उपयोग करना होगा।

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


अद्यतन: Ninject.MVC3 पैकेज अद्यतन किया जा रहा है और MVC4 आरटीएम (और आर सी) के खिलाफ OOTB काम करता है। विवरण के लिए this page in the wiki देखें।

+0

बिल्कुल सही! - निर्भरता संकल्प के बारे में पता चला। – ebb

+0

-1। मैं आपके नमूना ऐप को डाउनलोड करने के लिए आपके लिंक पर गया था। इसमें फाइलें गायब हैं और संकलित नहीं होंगे –

+2

@ क्रिस्टियन पायने सब वहाँ है। बस कैसे पढ़ो! सीआई सर्वर यह सुनिश्चित करता है कि यह –

संबंधित मुद्दे