2012-07-15 5 views
16

समस्या "CommentsController एक डिफ़ॉल्ट निर्माता नहीं है"।त्रुटि

त्रुटि:

System.ArgumentException: Type 'Comments2.Controllers.CommentsController' does not have a default constructor

StackTrace:

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"} 

मैं बस मुझे पता है आप देखना चाहते हैं कि क्या जाने के लिए आवश्यक किसी भी कोड देने के लिए खुश हूँ।

नियंत्रक:

namespace Comments2.Controllers 
{ 
    //[Authorize] 
    public class CommentsController : ApiController 
    { 
     ICommentRepository repository; 

    public CommentsController(ICommentRepository repository) 
    { 
     this.repository = repository; 
    } 

    [Queryable] 
    public IQueryable<Comment> GetComments() 
    { 
     return repository.Get().AsQueryable(); 
    } 

    public Comment GetComment(int id) 
    { 
     Comment comment; 
     if (!repository.TryGet(id, out comment)) 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
     return comment; 
    } 
} 

जावास्क्रिप्ट:

$(function() { 
    $("#getComments").click(function() { 
     // We're using a Knockout model. This clears out the existing comments. 
     viewModel.comments([]); 

     $.get('/api/comments', function (data) { 
      // Update the Knockout model (and thus the UI) with the comments received back 
      // from the Web API call. 
      viewModel.comments(data); 
     }); 

    }); 
}); 
+1

क्या आपने डीआई कंटेनर को सही तरीके से स्थापित किया था, और इसे एप्लिकेशन स्टार्ट से लॉन्च किया था? क्या आपने इंजेक्ट करने के लिए ICommentRepository का एक उदाहरण कॉन्फ़िगर किया था? –

+0

मैंने नहीं किया है। क्या यह उपयोगकर्ता एकता या Ninject के लिए बेहतर होगा? वे केवल दो ही हैं जिन्हें मैं उपयोग करने में रूचि रखता हूं, मैं आईओसी और डीआई की अवधारणा को समझता हूं लेकिन मैं इसे एमवीसी 4 और वेबएपीआई के साथ उपयोग करने के लिए सीखने की कोशिश कर रहा हूं ... क्या मैं इसे NuGet के माध्यम से जोड़ता हूं? –

उत्तर

6

यह तेजी की तरह आप HttpControllerActivator के डिफ़ॉल्ट कार्यान्वयन जो निर्भरता इंजेक्शन साथ काम नहीं करेंगे उपयोग कर रहे हैं। this आज़माएं निर्भरता को संभालने के लिए यह एकता कंटेनर को एकीकृत करता है लेकिन आप इसे डीआई के किसी भी कार्यान्वयन का उपयोग करने के लिए संशोधित कर सकते हैं।

+0

क्यों एक वोट वोट? DefaultHttpControllerActivator को केवल डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता होती है, इसलिए आपको अपना स्वयं का बनाना होगा और इसका सबसे साफ समाधान डी कंटेनर है। – Rafal

+0

राफल के उत्तर में दिए गए लिंक ने मुझे सही दिशा में मार्गदर्शन करने में मदद की। –

+0

चूंकि लिंक मर सकते हैं, इसलिए उत्तर में समाधान के लिए प्रासंगिक जानकारी शामिल करने के लिए उत्तर को प्रोत्साहित करें। यदि लिंक की गई सामग्री को हटा दिया गया है या बदला गया है तो उत्तर उन लोगों के लिए बेकार होगा जो इसे बाद में पाते हैं। ऐसा इसलिए हो सकता है कि किसी ने वोट दिया (मुझे नहीं), हालांकि बिना किसी टिप्पणी के वोट देने के लिए यह खराब फॉर्म है। – Zaphod

1

मुझे यकीन है कि क्या आईओसी कंटेनर का उपयोग कर रहे नहीं कर रहा हूँ, मैं व्यक्तिगत रूप Ninject का उपयोग करें और here निर्देश मैं इस ठीक से काम करने के लिए उपयोग कर रहे हैं।