2011-09-29 8 views
9

के साथ काम कर रहे निंजा क्या कोई मुझे डब्ल्यूसीएफ वेब एपीआई पूर्वावलोकन 5 के साथ काम करने के लिए निनजेक्ट प्राप्त करने के लिए सही दिशा में इंगित कर सकता है? मैंने इसे अपने एएसपी.नेट एमवीसी 3 प्रोजेक्ट में सफलतापूर्वक स्थापित किया है और निनजेक्ट.एक्सटेंशन.क्यूएफ लाइब्रेरी का उपयोग करके एक और आंतरिक डब्ल्यूसीएफ सेवा में भी चलाया है। हालांकि, मैं एक नया एमवीसी 3 प्रोजेक्ट बनाने और वेबएपी प्राप्त करने के दौरान इसे काम नहीं कर सकता। NuGet से सभी लाइब्रेरी।डब्ल्यूसीएफ वेब एपीआई पूर्वावलोकन 5

मैंने इस स्टैक ओवरफ्लो पोस्ट Setting up Ninject with the new WCF Web API पर देखा है लेकिन यह काम नहीं कर सकता है जो मुझे लगता है कि नवीनतम रिलीज में कुछ बदलावों के साथ मुझे क्या करना है।

मुझे यह भी अनिश्चितता है कि निनजेक पुस्तकालय मुख्य से परे संदर्भ में हैं। क्या मैं Ninject.MVC3, Ninject.Extensions.Wcf का उपयोग करता हूं।

इस पर किसी भी मदद की सराहना की जाएगी।

**** अद्यतन **

कोड मैं उपयोग कर रहा हूँ जो सवाल ऊपर उल्लेख में जवाब से है। मेरे पास यह अपनी खुद की कक्षा फाइल में है।

public class NinjectResourceFactory : IResourceFactory 
    { 
     private readonly IKernel _kernel; 

     public NinjectResourceFactory(IKernel kernel) 
     { 
      _kernel = kernel; 
     } 

     public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request) 
     { 
      return _kernel.Get(serviceType); 
     } 

     public void ReleaseInstance(InstanceContext instanceContext, object service) 
     { 
      // no op 
     } 
    } 

यह मैं अपने Global.asax में है:

var configuration = HttpConfiguration.Create().SetResourceFactory(new NinjectResourceFactory()); 
RouteTable.Routes.MapServiceRoute<myResource>("resource", configuration); 

मुद्दा मैं कर रहा हूँ कि IResourceFactory इंटरफ़ेस मान्यता प्राप्त नहीं है और HttpConfiguration.Create() नहीं रह गया है तो मैं जरूरत से मौजूद है कि है SetResourceFactory को किसी अन्य तरीके से सेट करने के लिए जिसे मैंने HttpConfiguration() का उपयोग करने का प्रयास किया है। CreateInstance विधि लेकिन कोई खुशी नहीं।

+0

अपने कोड –

+0

के रूप में अनुरोध @Alexander कोड के साथ एक अद्यतन पोस्ट किया है पोस्ट करें। – Cragly

उत्तर

9

के बाद Ninject और WebAPI के साथ मेरे कोड है, यह काम करता है। WebApiConfiguration

से
public class NinjectWebApiConfiguration : WebApiConfiguration { 
    private IKernel kernel = new StandardKernel(); 

    public NinjectWebApiConfiguration() { 
     AddBindings(); 
     CreateInstance = (serviceType, context, request) => kernel.Get(serviceType); 
    } 

    private void AddBindings() { 
     kernel.Bind<IProductRepository>().To<MockProductRepository>(); 
    } 

} 

एक वर्ग inherites बनाएँ और RegisterRoutes में NinjectWebApiConfiguration का उपयोग

public static void RegisterRoutes(RouteCollection routes) { 

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    var config = new NinjectWebApiConfiguration() { 
     EnableTestClient = true 
    }; 

    routes.MapServiceRoute<ContactsApi>("api/contacts", config); 
} 
+0

मैंने वेबएपी रिलीज संस्करण का उपयोग करके 'HttpSelfHostServer' के साथ काम करने के लिए निनजाइंड बाध्यकारी पाने के लिए इस दृष्टिकोण का उपयोग किया।'CreateInstance' विधि को 'निर्भरताResolver = new NinjectDependencyResolver (कर्नेल) द्वारा प्रतिस्थापित किया गया है;' – neontapir

4

पी 5 में आप WebApiConfiguration से निकाले जाते हैं और अपने व्युत्पन्न विन्यास का उपयोग करना होगा:

public class NinjectConfiguration : WebApiConfiguration 
    { 
     public NinjectConfiguration(IKernel kernel) 
     { 
      CreateInstance((t, i, m) => 
      { 
       return kernel.Get(t); 
      }); 
     } 
    } 
+0

धन्यवाद अलेक्जेंडर लेकिन SetServiceInstanceProvider कहां फॉर्म के रूप में आता है वीएस कहते हैं कि यह इसे हल नहीं कर सकता है? क्या मुझे नामस्थान खो रहा है? क्या मेरे प्रोजेक्ट को एमवीसी/डब्ल्यूसीएफ निंजा एक्सटेंशन की आवश्यकता है। मैंने NinjectConfiguration नामक एक नई श्रेणी फ़ाइल बनाई और आपके द्वारा प्रदान किया गया कोड जोड़ा। इसके अलावा मैं अपने निनजेक्ट सर्विसेज मॉड्यूल में किस बिंदु पर लोड करूंगा। मेरी मानक डब्ल्यूसीएफ सेवाओं में से एक में मैं इसे ऐसा कहता हूं: I कर्नेल कर्नेल = नया मानक कर्नेल (नया निनजेस सर्विस मॉड्यूल()); बहुत बहुत धन्यवाद। – Cragly

+0

क्षमा करें, मेरी गलती। मैं कोडप्लेक्स से वेब एपीआई के गलत संस्करण का जिक्र कर रहा था। इसे अब CreateInstance कहा जाता है - उपरोक्त कोड को अपडेट किया गया। –

3

महान जवाब यहां सवाल का कर रहे हैं, लेकिन मैं आप डिफ़ॉल्ट WebAPI विन्यास के साथ रास्ता दिखाने के लिए करना चाहते हैं:

protected void Application_Start(object sender, EventArgs e) { 

     RouteTable.Routes.SetDefaultHttpConfiguration(new Microsoft.ApplicationServer.Http.WebApiConfiguration() { 
      CreateInstance = (serviceType, context, request) => GetKernel().Get(serviceType) 
     }); 

     RouteTable.Routes.MapServiceRoute<People.PeopleApi>("Api/People"); 
    } 

    private IKernel GetKernel() { 

     IKernel kernel = new StandardKernel(); 

     kernel.Bind<People.Infrastructure.IPeopleRepository>(). 
      To<People.Models.PeopleRepository>(); 

     return kernel; 
    } 

नीचे ब्लॉग पोस्ट डब्ल्यूसीएफ वेब एपीआई पर निनजेक्ट एकीकरण के बारे में थोड़ा सा बात करता है:

http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet

+0

यह समाधान अच्छा दिखता है; कुंजी HttpConfiguration (या व्युत्पन्न WebApi कॉन्फ़िगरेशन, जैसा कि आप उपयोग कर रहे हैं) की CreateInstance प्रतिनिधि संपत्ति का उपयोग कर रहे हैं। हालांकि, मुझे लगता है कि आपका समाधान एक निंजा कर्नेल को नया करेगा और उस सेवा प्रकार के प्रत्येक अनुरोध पर बाध्यकारी सेट करेगा! हो सकता है कि नए-अप निनजेक्ट और एप्लिकेशन_स्टार्ट में बाध्यकारी सेट करें, संदर्भ को एक निजी स्थैतिक क्षेत्र में संग्रहीत करें, सेवा प्रकार बनाने के लिए इसका उपयोग करें और इसे एप्लिकेशन_इंड में निपटाना। सुझाव के लिए –

+0

@AndrewWebb धन्यवाद। क्या आप इसका समझा सकते हैं कि आप क्या समझाने की कोशिश कर रहे हैं? आप मेरी पोस्ट पर टिप्पणी कर सकते हैं: http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet या यहाँ। – tugberk

+0

मैंने एक नए उत्तर में एक पूर्ण नमूना जोड़ने की कोशिश की, लेकिन स्वरूपण बकवास था। वैसे भी, Global.asax.cs में कक्षा में, इस फ़ील्ड को जोड़ें: निजी स्थिर IKernel _nin कर्नेल; एप्लिकेशन_स्टार्ट में मानक कर्नेल को नया-अप करें और इस फ़ील्ड में रेफरी स्टोर करें, और अपनी बाइंडिंग सेट करें। Application_End में इस कर्नेल ऑब्जेक्ट का निपटान करें: - _ninKernel.Dispose(); जब आप अपना एचटीपी कॉन्फ़िगरेशन सेट करते हैं तो नए-अप सेवा उदाहरणों के लिए इस फ़ील्ड का उपयोग करें: - CreateInstance = (serviceType, संदर्भ, अनुरोध) => _ninKernel.Get (serviceType), –

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