c# - डोमेन(ORM) ऑब्जेक्ट्स से डेटा ट्रांसफर ऑब्जेक्ट्स(डीटीओ) में कैसे मैप करें




castle-activerecord dto-mapping (4)

मैंने एक ऐसी समस्या का समाधान किया है, जहां से मैंने कई पुराने वेब सेवा अनुबंधों के आंकड़ों को WCF डेटा अनुबंधों में कॉपी किया था। मैंने ऐसे कई तरीकों को बनाया है, जिनके साथ इस प्रकार हस्ताक्षर थे:

public static T ChangeType<S, T>(this S source) where T : class, new()

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

प्रतिनिधि बनने के बाद, यह अश्लील रूप से तेज़ी से है और मैं एक प्रतिनिधि में पारित करने के लिए अन्य अधिभार प्रदान करता है जो प्रतिच्छेदन मानदंड से मेल नहीं खाता है:

public static T ChangeType<S, T>(this S source, Action<S, T> additionalOperations) where T : class, new()

... तो आप अपने व्यक्तित्व के लिए व्यक्ति डीटीओ उदाहरण के लिए ऐसा कर सकते हैं:

Person p = new Person( /* set whatever */);
PersonDTO = p.ChangeType<Person, PersonDTO>();

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

यह पोस्ट करने के लिए बहुत ज्यादा कोड है, लेकिन अगर आप रुचि रखते हैं तो मैं स्काईड्राइव पर एक नमूना अपलोड करने का प्रयास करूँगा और यहां लिंक पोस्ट करूँगा।

रिचर्ड

वर्तमान सिस्टम जिस पर मैं काम कर रहा हूं, ऑरम (ऑब्जेक्ट रिलेशनल मैपिंग) को डोमेन ऑब्जेक्ट्स और डेटाबेस के बीच प्रदान करने के लिए कैसल एवरटेकॉर्ड का इस्तेमाल करता है। यह सब अच्छी तरह से और अच्छा है और ज्यादातर समय वास्तव में अच्छी तरह से काम करता है!

समस्या एस्केरोनस निष्पादन के लिए कैसल एक्ट्रेकॉर्ड्स समर्थन के बारे में आती है, ठीक है, और अधिक विशेष रूप से सत्र सत्र जो सत्र का प्रबंधन करता है जो कि वस्तुओं के हैं। लंबी कहानी छोटी, बुरा सामान होता है!

इसलिए हम डीटीओ ऑब्जेक्ट (जो डीबी के बारे में कुछ नहीं जानते हैं और सत्र, मैपिंग एट्रिब्यूट्स या सभी चीजों के लिए ध्यान नहीं रखते हैं) को डोमेन ऑब्जेक्ट्स (जो जानते हैं कि एक डीबी मौजूद है और देखभाल करते हैं) से आसानी से कन्वर्ट (लगता है स्वचालित रूप से लगता है) की तलाश कर रहे हैं ORM)।

क्या कोई ऐसा करने पर सुझाव देता है शुरुआत के लिए मैं वस्तु के एक मैपिंग के लिए एक बुनियादी एक के लिए देख रहा हूँ। डोमेन ऑब्जेक्ट व्यक्ति को व्यक्ति डीटीओ कहने के लिए मैप किया जाएगा मैं इसे मैन्युअल रूप से नहीं करना चाहता क्योंकि यह कचरा है

स्पष्ट रूप से प्रतिबिंब मन में आता है, लेकिन मैं इस साइट के आसपास चलती कुछ बेहतर आईटी ज्ञान के साथ आशा कर रहा हूं कि "कूलर" का सुझाव दिया जाएगा।

ओह, मैं सी # में काम कर रहा हूं, ऑरम ऑब्जेक्ट्स जैसा कि कैसल एक्टरेकॉर्ड के साथ मैप किए जाने से पहले कहा गया था।

उदाहरण कोड:

@ अजमास्टेरन के अनुरोध से मैंने एक उदाहरण से लिंक किया है कि मेरे पास (बुरी तरह से) एक साथ मज़ाकिया है I उदाहरण में एक कैप्चर फ़ॉर्म है , फ़ॉर्म नियंत्रक पर कब्जा, डोमेन ऑब्जेक्ट्स, सक्रियरेकॉर्ड रिपॉजिटरी और एक async सहायक। यह थोड़ा बड़ा है (3 एमबी) क्योंकि मैं इसे सक्रिय करने के लिए डेल की आवश्यकता थी जिसमें चल रहा था। आपको अपने स्थानीय मशीन पर ActiveRecordAsync नामक डेटाबेस बनाना होगा या बस .config फ़ाइल को बदलना होगा।

उदाहरण के मूल विवरण:

कैप्चर फ़ॉर्म

कैप्चर फ़ॉर्म में contoller का एक संदर्भ है

private CompanyCaptureController MyController { get; set; } 

प्रपत्र की प्रारंभिक रूप में यह MyController.Load को कॉल करता है (निजी) शून्य InitForm () {MyController = नया CompanyCaptureController (यह); MyController.Load (); } यह वापस एक विधि LoadComplete ()

public void LoadCompleted (Company loadCompany)
{
    _context.Post(delegate
    {
         CurrentItem = loadCompany;
         bindingSource.DataSource = CurrentItem;
         bindingSource.ResetCurrentItem();
         //TOTO: This line will thow the exception since the session scope used to fetch loadCompany is now gone.
         grdEmployees.DataSource = loadCompany.Employees;
         }, null);
    }
}

यह वह जगह है जहां "बुरी चीज़ें" होती है, क्योंकि हम कंपनी की बाल सूची का उपयोग कर रहे हैं जो आलसी लोड के रूप में सेट है

नियंत्रक

नियंत्रक के पास एक लोड विधि होती है जिसे प्रपत्र से कहा जाता था, फिर एएससीके सहायक को कॉल करने के लिए एसिंक्रोनस को लोडकॉम्पेनी विधि को कॉल करने के लिए और फिर कैप्चर फॉर्म की लोडसीम्पलेट विधि पर लौटें।

public void Load ()
{
    new AsyncListLoad<Company>().BeginLoad(LoadCompany, Form.LoadCompleted);
}

लोडकॉम्पेनी () विधि केवल एक ज्ञात कंपनी को खोजने के लिए रिपॉजिटरी का उपयोग करती है।

public Company LoadCompany()
{
    return ActiveRecordRepository<Company>.Find(Setup.company.Identifier);
}

बाकी उदाहरण उदाहरण के तौर पर सामान्य है, इसमें दो डोमेन वर्ग हैं, जो कि बेस क्लास से प्राप्त होते हैं, एक डेटा सेटअप करने के लिए एक सेटअप फ़ाइल और ActiveRecordMediator क्षमताओं को प्रदान करने के लिए रिपॉजिटरी।


वास्तव में यहां विवरण दर्ज करने के लिए माफी नहीं है, लेकिन एक मूल ओओ दृष्टिकोण डीटीओ को सक्रियरेकॉर्ड वर्ग के सदस्य बनाने के लिए होगा और सक्रियरेकॉर्डर को डीटीओ के एक्सेसर्स और म्यूटेटर का प्रतिनिधित्व करना होगा। आप एक्टिवरेकॉर्ड कक्षाओं से डीटीओ कक्षाओं का निर्माण करने के लिए कोड पीढ़ी या रिफैक्टरिंग उपकरण का उपयोग कर सकते हैं।



ValueInjecter का उपयोग करें, इसके साथ आप कुछ भी उदाहरण के लिए नक्शा कर सकते हैं

  • ऑब्जेक्ट <-> ऑब्जेक्ट
  • ऑब्जेक्ट <-> फॉर्म / वेबफॉर्म
  • डेटाराइडर -> ऑब्जेक्ट

और इसमें शानदार विशेषताएं हैं: सपाट और अनप्लगिंग

डाउनलोड में कई नमूने हैं





dto-mapping