5

के रूप में एमवीसी 3 गुजरने वाली इकाई मैं वर्तमान में निनजेक्ट का उपयोग करके एक एमवीसी 3 प्रोजेक्ट पर काम कर रहा हूं, मेरी डायल के रूप में, व्यवसाय वस्तुओं को एक अलग असेंबली में संग्रहीत किया जाता है। मैं नियंत्रक पैरामीटर के साथ किसी समस्या में भाग रहा हूं, जब सीआरयूडी ऑपरेशंस के लिए वापस पोस्ट करते समय मुझे त्रुटि मिल रही है "इंटरफ़ेस का उदाहरण नहीं बना सकता"। मुझे पता है कि आप एक इंटरफ़ेस का उदाहरण नहीं बना सकते हैं, लेकिन ऐसा लगता है कि मैं एकमात्र तरीका यह प्राप्त कर सकता हूं कि एक कस्टम मॉडल बाइंडर का उपयोग करना और फ़ॉर्मकोलेक्शन को पास करना है। यह वास्तव में गन्दा लगता है और मैं प्रोजेक्ट से जितना अधिक विशिष्ट कोड रखना चाहता हूं उतना ही रखना चाहता हूं - इसलिए हर जगह इंटरफेस करता है और डीएन को कंक्रीट के लिए निदान करता है। न केवल कस्टम मॉडल बाइंडिंग गन्दा लगती है - क्या मैं अपना डेटा एनाटेशन भी नहीं खोऊंगा?इंटरफ़ेस

वर्णन करने के लिए मैं क्या है कुछ कोड:

public ActionResult Create() 
{ 
    // I'm thinking of using a factory pattern for this part 
    var objectToCreate = new ConcereteType(); 
    return (objectToEdit); 
} 

[HttpPost] 
public ActionResult Create(IRecord record) 
{ 
    // check model and pass to repository 
    if (ModelState.IsValue) 
    { 
     _repository.Create(record); 
     return View(); 
    } 

    return View(record); 
} 

किसी को भी करने से पहले इस में चलाने की है? आप इसे कैसे प्राप्त किया?

धन्यवाद!

उत्तर

3

नियंत्रकों के लिए पारित डेटा कार्रवाई मूल्यों के लिए धारक हैं। उनमें कोई तर्क नहीं होना चाहिए, इसलिए इसे रद्द करने के लिए कुछ भी नहीं है। आप इंटरफेस के बजाय ठोस प्रकार (उदाहरण के लिए रिकॉर्ड) का उपयोग कर सकते (IRecord)

+1

क्या मैं ढीले युग्मन के नियम को तोड़ नहीं सकता? क्या होगा यदि मैं किसी कारण से अपनी कंक्रीट विधि का नाम बदलना चाहता/चाहती हूं यानी रिकॉर्ड रिकॉर्ड अलग हो जाता है। मैं रिकार्ड अलग-अलग आईरकॉर्ड को कार्यान्वित कर सकता हूं और आईआरकॉर्ड के सभी मामलों में रिकार्ड डिफरेंजर को इंजेक्ट करने के लिए अपने डीआई को बदल सकता हूं। –

+1

मैं इंटरफेस के बजाय मॉडल कंटेनर और विरासत के लिए कक्षाओं का उपयोग करने के लिए prefere। डिफ़ॉल्ट रूप से DI को क्रियाओं को पारित वस्तुओं को बनाने के लिए उपयोग नहीं किया जाता है। मैं केवल वास्तविक तर्क के लिए डीआई का उपयोग करता हूं, डेटा कंटेनर के लिए नहीं – Novakov

+0

वास्तव में समझ में नहीं आया कि आपने शुरुआत में क्या मतलब था, लेकिन इस परियोजना के साथ थोड़ा सा प्रगति हुई है, अब मुझे एहसास हुआ कि मैं सरल डेटा कंटेनरों को "डीक्यूपल" करने की कोशिश कर रहा हूं जैसा आपने कहा था। किसी भी POCO ऑब्जेक्ट्स में कोई व्यवहार (अभी तक) नहीं है जो डेटाबेस तालिका को मैप करता है और इसलिए इनके लिए इंटरफ़ेस करने का कोई कारण नहीं है - न ही उन्हें तुरंत चालू करने के लिए फ़ैक्टरी का उपयोग करें। मुझे लगता है कि मुझे समझ में समस्या क्या थी कि डीकॉप्लिंग वास्तव में केवल डेटा गुणों के बजाय व्यवहार के साथ वस्तुओं के लिए उपयोग किया जाना चाहिए। –

6

लेकिन यह एक ही तरीका है चारों ओर इस कस्टम मॉडल बांधने की मशीन

एक कस्टम मॉडल बांधने की मशीन का उपयोग करने के लिए है मैं प्राप्त कर सकते हैं की तरह लगता है जाने का सही तरीका है। और जिस तरह से आपको दृश्य मॉडल के रूप में कार्य मॉडल का उपयोग करना चाहिए, डोमेन मॉडल या इंटरफेस नहीं।

इतना ही कस्टम मॉडल बंधन है गंदा लगता है - नहीं मैं अपने DataAnnotations खो देंगे?

मुझे नहीं पता कि आपको क्यों लगता है कि कस्टम मॉडल बाइंडर चीजों को गन्दा बना देगा। मेरे लिए यह एक पुन: प्रयोज्य वर्ग में मैपिंग तर्क को अलग करने का एक शानदार तरीका है। और, नहीं, आप डेटा एनाटेशन खो देंगे नहीं। वे कंक्रीट उदाहरण पर पूरी तरह से ठीक काम करेंगे कि कस्टम मॉडल बाइंडर वापस आ जाएगा।

+1

+1 यहां कुछ बिंदुओं का विस्तार है: http://stackoverflow.com/questions/2899680/how-to-use-ninject-or-other-di-ioc-container-with-the-model-binder- in-asp-ne/2902871 # 2902871 –

+0

इसके लिए धन्यवाद, क्या आप इस तरह के समाधान का उपयोग कर मौजूद किसी भी व्यावहारिक उदाहरण के बारे में जानते हैं? –

+0

@ पॉलएल्ड्रेड-बान http://msdn.microsoft.com/en-us/magazine/hh781022.aspx – fordareh

2

मैंने एक ही साधारण गलती की। Ninject आपके कन्स्ट्रक्टर में पैरामीटर इंजेक्ट करता है, लेकिन आपने इंडेक्स कंट्रोलर एक्शन में पैरामीटर जोड़े।

यह इस तरह दिखना चाहिए:

public class HomeController : Controller 
{ 
    private IRecord _record; 

    public HomeController(IRecord record) 
    { 
     _record = record; 
    } 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application. " + 
          _record .HelloWorld(); 

     return View(); 
    } 
} 

मेक भावना?

+2

धन्यवाद, मैंने वही गलती की :( –

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