2013-09-10 3 views
5

एएसपी.नेट | एमवीसी 4 | सी # | डब्ल्यूसीएफएएसपी.नेट एमवीसी - मॉडल के लिए डब्ल्यूसीएफ कक्षाएं

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

ऑटोमैपिंग एक विकल्प के रूप में दिमाग में आया, लेकिन मुझे विश्वास है कि दो समान वर्गों की आवश्यकता होगी। एमवीसी पक्ष पर एक और डब्ल्यूसीएफ पक्ष पर एक। यदि कक्षा में कोई संपत्ति बदल जाती है तो मुझे दोनों पक्षों में बदलाव करने की आवश्यकता होगी।

कोई अन्य सुझाव की सराहना की जाएगी। धन्यवाद!

संपादित :: उदाहरण

यहाँ एक पेज है कि रिकॉर्ड

public class ReconcileModel 
{ 
    #region PROPERTIES 

    public List<ReconcileItem> ReconcileItems { get; set;} 

    #endregion 

    #region CONSTRUCTORS 

    public ReconcileModel() 
    { 
     ReconcileItems = new List<ReconcileItem>(); 
    } 

    #endregion 
} 

की एक तालिका में शामिल है यहां कक्षा कि तालिका में प्रत्येक रिकॉर्ड का प्रतिनिधित्व करने के लिए है के लिए मॉडल है।

public class ReconcileItem 
{ 
    #region PROPERTIES 

    public int ID { get; set; } 
    public string Description { get; set; } 
    public string LastLocation { get; set; } 
    public string LastRead { get; set; } 
    public string IntendenLocation { get; set; } 
    public string PickId { get; set; } 
    public string OEM { get; set; } 
    public string LotNumber { get; set; } 
    public string SerialNumber { get; set; } 
    public DateTime ExpirationDate { get; set; } 
    public string ReconcileReason { get; set; } 
    public string RemoveReason { get; set; } 


    #endregion 

    #region CONSTRUCTORS 

    public ReconcileItem() 
    { 
    } 

    #endregion 
} 

वर्ग के WCF अनुबंध प्रतिनिधित्व ऊपर होगा

[DataContract] 
public class ReconcileItem 
{ 
    [DataMemeber] 
    public int ID { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
    [DataMember] 
    public string LastLocation { get; set; } 
    [DataMember] 
    public string LastRead { get; set; } 
    [DataMember] 
    public string IntendenLocation { get; set; } 
    [DataMemeber] 
    public string PickId { get; set; } 
    [DataMember] 
    public string OEM { get; set; } 
    [DataMember] 
    public string LotNumber { get; set; } 
    [DataMember] 
    public string SerialNumber { get; set; } 
    [DataMember] 
    public DateTime ExpirationDate { get; set; } 
    [DataMember] 
    public string ReconcileReason { get; set; } 
    [DataMember] 
    public string RemoveReason { get; set; } 
} 

मैं इस रिकॉर्ड को अपडेट करना चाहते हैं, तो वर्ग, WCF सेवा के लिए भेजा उचित इकाई फ्रेमवर्क वर्गों को मैप किया है, और सहेजा जाता है डेटाबेस में। स्थानांतरण को सरल बनाने के लिए मैंने सोचा कि मैं इस कक्षा को डब्लूसीएफ परियोजना में डाल दूंगा और इसे एमवीसी परियोजना में संदर्भित करूंगा। फिर मैं डब्ल्यूसीएफ और एमवीसी के बीच कक्षा को आगे बढ़ा सकता था। इसके अलावा, अगर मैंने डब्ल्यूसीएफ में कक्षा को अद्यतन किया तो यह एमवीसी में दिखाई देगा। केंद्रीकृत द्वारा इसका मतलब है।

+0

आपका प्रश्न थोड़ा अस्पष्ट है। क्या आप हमें कुछ कोड के साथ प्रस्तुत कर सकते हैं, उदाहरण के लिए 'केन्द्रीकृत वर्ग' से आपका क्या मतलब है? – Steven

+0

@ स्टीवन संपादन देखें और मुझे बताएं कि क्या चीजों को स्पष्ट करता है। धन्यवाद! – Will

उत्तर

2

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

  • हम एक विधानसभा (तथाकथित 'अनुबंध') है कि ग्राहक और WCF/बीएल बीच साझा किया जाता है ।
  • यह 'अनुबंध' असेंबली में सभी डीटीओ शामिल हैं जो तार पर और डब्ल्यूसीएफ को भेजे जाते हैं।
  • हमने सेवा संदर्भ सेटिंग्स में 'निर्दिष्ट संदर्भ असेंबली में पुन: उपयोग प्रकार' सेट करके अनुबंध असेंबली (डब्ल्यूसीएफ को सभी डीटीओ पुन: उत्पन्न करने के बजाय) का उपयोग करने के लिए डब्ल्यूसीएफ क्लाइंट प्रॉक्सी कॉन्फ़िगर किया।
  • हम उन डीटीओ को डेटा एन्नोटेशन विशेषताओं (और अन्य मेटाडाटा) के साथ सजाने के लिए तैयार करते हैं।
  • हम डब्ल्यूसीएफ विशेषताओं के साथ उन डीटीओ को सजाने के लिए नहीं हैं। डब्ल्यूसीएफ को डीटीओ को क्रमबद्ध करने की आवश्यकता नहीं है। वे वैकल्पिक हैं। अगर आप कर सकते हैं उन्हें बाहर छोड़ दें। यह सिर्फ आपके कोड को अव्यवस्थित करता है।
  • चूंकि ग्राहक एक ही असेंबली का उपयोग करता है, इसलिए हम ग्राहक पर डेटा एनाटेशन का उपयोग कर सकते हैं।
  • हम सर्वर पर भी मान्य हैं।
  • हम AutoMapper का उपयोग संस्थाओं से डीटीओ तक बॉयलरप्लेट मैपिंग करने के लिए करते हैं (लेकिन कभी भी दूसरी तरफ नहीं)।
  • फ्रैंक होने के लिए, आप डब्लूसीएफ को हमारे डीटीओ को क्रमबद्ध करने की अनुमति भी नहीं देते हैं, लेकिन JSON.NET और डब्ल्यूसीएफ का उपयोग केवल जेएसओएन भेजें और प्राप्त करें (सादा पाठ) जेएसओएन, क्योंकि जेएसओएन.नेट सीरियलाइजिंग और deserializing के लिए बस इतना अधिक लचीला है डेटा संरचनाएं। उदाहरण के लिए, हम JSON.NET का उपयोग (डी) अपरिवर्तनीय ऑब्जेक्ट संरचनाओं को क्रमबद्ध करते हैं। डब्ल्यूसीएफ के साथ कोशिश करें। वह बुरी तरह विफल हो जाएगा।

उस के शीर्ष पर हम करते हैं:

  • देखें मॉडल वर्गों का उपयोग ग्राहक कार्यक्षमता जोड़ने के लिए।
  • ग्राहक और सर्वर दोनों पर सत्यापन को चलाने की अनुमति देने के लिए अनुबंध असेंबली में कस्टम डेटा एन्नोटेशन सत्यापन जोड़ें।
  • सर्वर या क्लाइंट विशिष्ट सत्यापन (या तो अपनी व्यावसायिक परत या क्लाइंट एप्लिकेशन में कार्यान्वयन रखकर) को अनुमति देने के लिए IValidator<T> अबास्ट्रक्शन (किसी प्रकार का) जोड़ें।
  • अपवादों का उपयोग कर क्लाइंट को ट्रांसपोर्ट सर्वर विशिष्ट सत्यापन त्रुटियां वापस।
+0

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

+0

यदि आप उन्हें अपनी असेंबली में नहीं डालते हैं और सर्वर और क्लाइंट के बीच उस असेंबली को साझा करते हैं, तो इसका मतलब है कि विजुअल स्टूडियो को आपके लिए क्लाइंट प्रॉक्सी उत्पन्न करना होगा और क्लाइंट पर अपने डीटीओ को पुन: उत्पन्न करना होगा। न केवल आपको अतिरिक्त (जेनरेट) कोड का एक छोटा सा हिस्सा मिल जाएगा, वीएस * क्लाइंट पर किसी भी विशेषताओं (जैसे डेटा एनाटेशन विशेषताओं) को पुन: उत्पन्न नहीं करेगा। दूसरे शब्दों में: आप उन डीटीओ पर परिभाषित सभी मेटाडेटा को खो देंगे। – Steven

2

आप अभी भी अपनी संस्थाओं का उपयोग कर सकते हैं, लेकिन दृश्य मॉडल बनाएं और इसके बजाय अपने डेटा एनोटेशन डालें। एक परियोजना में सत्यापन कहां रखना है इसके बारे में बहुत सी बात है। आम तौर पर यह लगभग हमेशा दिया जाता है कि इसे यूआई में और फिर आमतौर पर कहीं और होने की आवश्यकता होती है। मैं इसे केंद्रीकृत करने की कोशिश करने से बचूंगा, क्योंकि यह कभी काम नहीं करता है (एक आकार शायद ही कभी फिट बैठता है)।

डब्ल्यूसीएफ परत को के भीतर अपने समाधान के वेडिंग के विषय पर, जब तक कि इसके लिए बहुत अच्छा कारण न हो, मैं इसे हर कीमत पर करने से बचूंगा। मैंने देखा है कि इस तरह की चीज कई बार गलत हो जाती है। यह बहुत सारे नकारात्मक प्रभाव लाता है। मैंने दो वाणिज्यिक मामलों में निपटाया है, आप बहुत सारे अंतराल और बहुत अधिक चतुरता के साथ खत्म हो जाते हैं। यह आपकी इकाइयों में व्यावसायिक तर्क डाल सकता है और उन तरीकों का उपयोग कर सकता है, एक सर्वर पर होस्ट किए जाने पर रखरखाव को एक दुःस्वप्न और पर्याप्त हार्डवेयर और सावधानीपूर्वक डिज़ाइन के बिना, आप नामित पाइप का उपयोग कर सकते हैं आपको जिस गति की आवश्यकता है, उसे प्राप्त करें, जो डब्ल्यूसीएफ का उपयोग करने से प्राप्त किसी वितरित लाभ को अस्वीकार करता है।

भारी प्रसंस्करण कार्यों को बाहरी रूप से बाहरी करने के लिए सबसे अच्छा होगा जो आप कहीं और होस्ट कर सकते हैं और एक छोटे, अधिक संक्षिप्त इंटरफ़ेस के माध्यम से संवाद कर सकते हैं। हकीकत में छवि प्रसंस्करण, गणितीय और वैज्ञानिक अनुप्रयोगों के अलावा, भारी डेटा प्रोसेसिंग फसल नहीं होती है।

+0

मैं यह भी जोड़ूंगा कि एमसीसी मॉडल के रूप में डब्ल्यूसीएफ कक्षाओं को उजागर करने में सुरक्षा जोखिम है। – VsMaX

+1

बीच में डब्ल्यूसीएफ का विचार यह है कि एमवीसी केवल प्रस्तुति के लिए उपयोग किया जाएगा। जब पृष्ठ पर फ़ील्ड अपडेट और सहेजे गए थे; वर्ग को पॉप्युलेट किया जाएगा और डब्ल्यूसीएफ को भेजा जाएगा और डेटाबेस में सहेजा जाएगा। अब सवाल यह है कि यह करने का एक आदर्श तरीका है। हम डेटाबेस में टेबल के सेट के लिए प्रत्येक सेवा जिम्मेदार होना चाहते हैं, इसलिए यदि डेटा जोड़ा/अपडेट/हटा दिया जाता है तो डेटा हमेशा उन सेवाओं के माध्यम से बहता है। – Will

+0

@ जो अच्छा लगता है, उन मामलों में जहां मैंने आंतरिक डब्ल्यूसीएफ परतों को मुद्दों का कारण बताया है, यह हमेशा परतों के कारण होता है क्योंकि यह केवल एक असेंबली होगी। डब्ल्यूसीएफ परत की सावधानीपूर्वक क्राफ्टिंग के साथ, सिद्धांत में यह काम/काम करना चाहिए। आप शायद एक डब्ल्यूसीएफ परत के साथ समाप्त हो जाएंगे जो एक कॉल में एक विशेष पृष्ठ प्रदर्शित करने के लिए आवश्यक सब कुछ का एक पूर्ण सेट (लगभग मॉडल देखें) देता है। इसके बाद बाद में मोबाइल फोन ऐप प्रस्तुति परत पर बोल्ट करना आसान हो जाएगा। मैं सिर्फ डब्ल्यूसीएफ परत के ऊपर की परतों में से किसी एक व्यापार तर्क को ध्यान में रखकर सावधान रहूंगा। –

2

हम आपके वर्तमान नियोक्ता में आपके पोस्ट में वर्णित तरीके से डब्ल्यूसीएफ का उपयोग करते हैं। हमने यूसी के भीतर मॉडल बाध्यकारी और सत्यापन के लिए एमवीसी अनुप्रयोग के भीतर संवाद करने के लिए डब्ल्यूसीएफ और एमवीसी के साथ डीटीओ कक्षाएं शुरू कीं और फिर व्यूमोडल्स को समाप्त कर दिया।

मैं मानता हूं कि कक्षाएं जो एक दूसरे के लगभग डुप्लीकेट हैं और उनके बीच मैपिंग एक दर्द है और कुछ स्तर पर गलत लगता है। मैंने जो कुछ किया है, उससे हमने जो किया है, और जो आपको करने के लिए मजबूर किया जा सकता है, वह सबसे अच्छा अभ्यास है।

डब्ल्यूसीएफ द्वारा किए गए भारी प्रसंस्करण के संबंध में एड्रियन का प्रस्ताव क्या है, इसके साथ ही समझ में आता है। मेरी वर्तमान नौकरी शुरू करने से पहले मैंने बस यही किया। अधिकांश व्यावसायिक तर्क एमवीसी अनुप्रयोग द्वारा सीधे संदर्भित व्यापार परत असेंबली में रखा गया था। कुछ संभावित लंबी चल रही प्रक्रियाओं के लिए मैंने अलग-अलग डब्ल्यूसीएफ सेवाओं को अलग-अलग होस्ट किया था, जिसमें एमवीसी अनुप्रयोग के साथ संवाद किया गया था।

आखिरकार, क्या आप वेब एपीआई बनाम डब्ल्यूसीएफ का उपयोग कर सकते हैं? वेब एपीआई हल्का वजन है और डब्ल्यूसीएफ बाइंडिंग आदि के साथ आने वाले सभी ओवरहेड के साथ HTTP का उपयोग करता है। इसके अतिरिक्त, वेब एपीआई के साथ आप एमवीसी एप्लिकेशन का उपयोग कर रहे हैं और वेब एपीआई के भीतर मॉडल सत्यापन का भी उपयोग कर सकते हैं। यह कुछ ऐसा है जो मैं काम कर रहा हूं और अधिक से अधिक आम हो रहा हूं।

आशा है कि मदद करता है!

+0

धन्यवाद। डुप्लिकेट कक्षाओं को मैप करना भी मेरे लिए गलत लगता है, लेकिन जैसा कि आपने कहा था कि यह सबसे अच्छा अभ्यास प्रतीत होता है। मुझे अभी तक वेबएपीआई के बारे में पता नहीं था। दुर्भाग्यवश, हमारी सेवाएं टीसीपी बाइंडिंग हैं, लेकिन वेबएपीआई मेरी कुछ अन्य परियोजनाओं पर उपयोगी हो सकती है। – Will

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