linq to sql रिपॉजिटरी पैटर्न को लागू करने के लिए LINQ से एसक्यूएल प्रदाता के लिए एंटिटी कक्षाएं डिकॉप्टेड कैसे?




linq-to-sql design-patterns (8)

मैंने रिपॉज़िटरी पैटर्न पर गौर किया है और मैंने कुछ ऐसे विचारों को पहचान लिया है जो मैं अतीत में उपयोग कर रहा था जिससे मुझे अच्छी तरह से महसूस हुआ।

हालांकि अब मैं एक ऐसा आवेदन लिखना चाहूंगा जो इस पद्धति का उपयोग करे लेकिन मैं रिपोटीटरी प्रदाता से शामिल होने वाले एंटीटी क्लास को पसंद कराना चाहता हूं

मैं कई विधानसभाएं बनाऊँगा:

  1. एक "इंटरफेस" असेंबली जो आईआरईपीसैटरी इंटरफेस सहित आम इंटरफेस होस्ट करेगा
  2. एक "इकाई" असेंबली जो इकाई, जैसे कि उत्पाद, उपयोगकर्ता, आदेश आदि की मेजबानी करेगा। इस विधानसभा को "इंटरफेस" असेंबली द्वारा संदर्भित किया जाएगा, क्योंकि कुछ तरीके इस तरह के प्रकार या उनके arrays वापस करेंगे। इसके अलावा यह मुख्य अनुप्रयोग विधानसभा (जैसे वेब अनुप्रयोग) द्वारा संदर्भित किया जाएगा
  3. एक या अधिक भंडार प्रदाता विधानसभा / विधानसभाएं प्रत्येक में (कम से कम) एक वर्ग जो आईआरपोझिटरी इंटरफ़ेस लागू करता है और यह एक निश्चित डाटा स्टोर के साथ काम करेगा। डेटा स्टोर में एक एसक्यूएल सर्वर, एक ओरेकल सर्वर, माइस् SQL, एक्सएमएल फाइल, वेब / डब्ल्यूसीएफ सेवाओं आदि शामिल हो सकते हैं।

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

मैं इस तरह के परिदृश्य में LINQ से SQL का उपयोग कैसे कर सकता हूं?


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


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

अफसोस की बात है कि LINQ में कोई डाटाकॉन्टेक्स्ट से निकालने के लिए कोई तरीका नहीं है, लेकिन आप उन्हें क्लोन कर सकते हैं, जो अच्छी तरह से काम करता है। सरल तरीके से ऐसा कुछ होगा:

public static T CloneEntity<T>(T source)
{
  DataContractSerializer dcs = new DataContractSerializer(typeof(T));
  using (Stream stream = new MemoryStream())
  {
    dcs.WriteObject(stream, source);
    stream.Seek(0, SeekOrigin.Begin);
    return (T)dcs.ReadObject(stream);
  }
}

मैं WCF के साथ कुछ इसी तरह किया था

1 अपने डीबीएमएल पर, आप यूनिडायरेक्शनल को सीरियलाइजेशन मोड सेट करते हैं

2 अपने टेबल पर सभी कॉलम अपडेट करें = जाँच करें = झूठी

3 निम्नलिखित की तरह अपनी सेवा कुछ लिखें:

   public class Service1 : IService1
    {
        public Company GetCompany(int companyId)
        {
            using (DataClasses1DataContext dc = new DataClasses1DataContext())
            {
                return (from c in dc.Companies where c.CompanyId == companyId select c).Single();
            }
        }

    public void SaveCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.Attach(company, true);
            dc.SubmitChanges();
        }
    }

    public void InsertCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.InsertOnSubmit(company);
            dc.SubmitChanges();
        }
    }
}

4 एक सेवा संदर्भ जोड़ें


मुझे लगता है कि आप पीओसीओ (सादा पुराने सीएलआर ऑब्जेक्ट्स) का समर्थन चाहते हैं। LINQ से एसक्यूएल के पास एक एडेप्टर है जिसे बंद 2 पीोको कहते हैं

लेकिन मैं स्विच को इकाई फ़्रेमवर्क करने की सलाह देता हूं, फिलहाल उनके पास एक पॉको एडेप्टर भी है, लेकिन v2 में बॉक्स के बाहर समर्थित होने की उम्मीद है


आपको LINQ को SQL उत्पन्न कोड का उपयोग करने की आवश्यकता नहीं है, आप आवश्यक कॉलम गुणों के साथ अपनी कक्षाएं सजाने के लिए या बाह्य XML मैपिंग फ़ाइल का उपयोग कर सकते हैं।


आप डेटाबेस के किसी भी वर्ग के लिए बाहरी XML फ़ाइल मैप बना सकते हैं:

 <?xml version="1.0" encoding="utf-8"?>
 <Database Name="DbName" 
           xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
    <Table Name="DbTableName">
       <Type Name="EntityClassName" >
           <Column Name="ID" Type="System.Int64" Member="Id"
                   DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
                   CanBeNull="false" />
           <Column Name="ColumnName" Type="System.String" Member="PropertyA"
                   DbType="VarChar(1024)" CanBeNull="true" />
       </Type>
    </Table>
 </Database>

और फिर एक्सएमएल को एक डेटासीन्टेक्स्ट वर्ग में पास करें:

 using (var cn = GetDbConnection())
  { var mappingSrc = XmlMappingSource.FromReader(xmlReader);

    using (var db = new DataContext(cn, mappingSrc))
     { var q = from entity in db.GetTable<EntityClassName>()
               where entity.PropertyA = "..."
               select entity.ID;
     }
  }


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





decouple