कोड लिखने के बिना OData सेवा


सॉफ्टवेयर विकास के सबसे महत्वपूर्ण पहलुओं में से एक तेजी से प्रोटोटाइप है। अधिकांश सेवाओं के लिए कम से कम कुछ सीआरयूडी संचालन की आवश्यकता होती है, और अधिकांश अनुप्रयोगों को डेटा-संचालित अनुप्रयोगों के रूप में वर्णित किया जा सकता है। मैं जो API लिखता हूं वह मूल रूप से डेटाबेस से डेटा लेता है और क्लाइंट को JSON के रूप में वापस करता है। OdataToEntity एक उपकरण है जो एक डेटाबेस से एपीआई बनाता है और एक अलग REST API लिखने की आवश्यकता को समाप्त करता है।


इस लेख में, मैं दिखाऊंगा कि कैसे OdataToEntity CRUD लिखने के उबाऊ काम को खत्म करने में मदद कर सकता है। पिछले लेख में, मैंने कम से कम कोडिंग के साथ एक ओडटा सेवा बनाने के तरीके के बारे में बात की थी, इस लेख में मैं दिखाऊंगा कि कोड को लिखे बिना यह कैसे करना है।


यह कार्यक्षमता OdataToEntity.EfCore.DynamicDataContext प्रोजेक्ट में उपलब्ध है, जो OdataToEntity लाइब्रेरी का हिस्सा है। HTTP सर्वर का एक उदाहरण कंसोल प्रोग्राम के रूप में कार्यान्वित किया जाता है, जो इनपुट के रूप में डेटाबेस से एक कनेक्शन स्ट्रिंग को स्वीकार करता है। डेटाबेस समर्थित: MySql, PostgreSql, Sql सर्वर। उन पर तालिकाओं और CRUD संचालन के अलावा, विचार, संग्रहीत कार्यविधियाँ और कार्य उपलब्ध हैं।


HTTP सर्वर का विवरण


सर्वर स्रोत कोड GitHub पर उपलब्ध है
सर्वर कॉन्फ़िगरेशन कॉन्फ़िगरेशन फ़ाइल के माध्यम से किया जाता है। यह एक मानक Aspnet कोर फ़ाइल है जिसमें OdataToEntity कुंजी जोड़ी गई है


"OdataToEntity": { "BasePath" : "api", "Provider": "sqlserver", "ConnectionString": "Server=.\\sqlexpress;Initial Catalog=OdataToEntity;Trusted_Connection=Yes;", "UseRelationalNulls": true, "InformationSchemaMappingFileName": "InformationSchemaMapping.json" } 

"बेसपाथ" सर्वर URL में आधार पथ है।
"प्रदाता" - डेटाबेस प्रकार, संभावित मूल्य mysql, postgresql, sqlserver हैं।
"ConnectionString" डेटाबेस के लिए कनेक्शन स्ट्रिंग है।
"UseRelationalNulls" - इंगित करता है कि संबंधपरक डेटाबेस के शब्दार्थ का उपयोग करना है या नहीं
शून्य मानों की तुलना करते समय।
"InformationSchemaMappingFileName" - एपीआई में डेटाबेस प्रदर्शित करने के लिए अतिरिक्त सेटिंग।


कार्यक्रम स्वचालित रूप से प्रक्रियाओं, कार्यों, डेटाबेस तालिकाओं के बीच संबंधों का पता लगाता है, उनकी विदेशी कुंजियों की जांच करता है। मैं एक ओडटा सेवा स्कीमा में संबंधों को एम्बेड करने के लिए इसका उपयोग करता हूं। नामों को और कस्टमाइज़ करने के लिए, InformationSchemaMapping.json फ़ाइल का उपयोग करें, जो क्रमबद्ध श्रेणी InformationSchemaMapping है
"ऑपरेशन" कुंजी संग्रहीत प्रक्रियाओं और कार्यों का वर्णन करती है, और "टेबल्स" तालिकाओं और विचारों का वर्णन करती है। गुण "DbName" - डेटाबेस में नाम, "EdmName" - सेवा में नाम, "बहिष्कृत" डेटाबेस और सेवा ऑब्जेक्ट को छोड़कर। यदि संग्रहीत कार्यविधि / फ़ंक्शन एक तालिका देता है, तो तालिका का नाम "ResultTableDbName" संपत्ति में सेट किया जाना चाहिए। नेविगेशन प्रॉपर्टी का नाम बदलने के लिए, आपको "नेवीगेशन" कुंजी का उपयोग करने की आवश्यकता है, जहां "टारगेटटेबलनाम" प्रॉपर्टी, नेविगेशन प्रॉपर्टी के टारगेट टेबल और "नेवीगेशन नेम" को इंगित करती है - इसका नाम। यदि तालिका में एक ही तालिका के लिए कई विदेशी कुंजी हैं, तो इन नेविगेशन गुणों के बीच अंतर करने के लिए, "TargetTableName" के बजाय, आपको "ConstraintName" निर्दिष्ट करना होगा - डेटाबेस विदेशी कुंजी का नाम। कई-से-कई संपत्ति के लिए, आपको "ManyToManyTarget" निर्दिष्ट करने की आवश्यकता है - लक्ष्य तालिका का नाम (कई-से-कई कार्यान्वयन के बारे में अधिक जानकारी के लिए, यह लिंक देखें)।


कोड उदाहरण


यदि आपको अपने कोड में इस कार्यक्षमता का उपयोग करने की आवश्यकता है, तो OdataToEntity.EfCore.DynamicDataContext प्रोजेक्ट का लिंक जोड़ें


 //Load our schema mappings (optional) InformationSchemaMapping informationSchemaMapping = GetMappings(); //Configure context var optionsBuilder = new DbContextOptionsBuilder<DynamicDbContext>(); optionsBuilder = optionsBuilder.UseSqlServer("Server=.\\sqlexpress;Initial Catalog=OdataToEntity;Trusted_Connection=Yes;"); IEdmModel dynamicEdmModel; //create database schema using (ProviderSpecificSchema providerSchema = new SqlServerSchema(optionsBuilder.Options)) using (var metadataProvider = providerSchema.CreateMetadataProvider(informationSchemaMapping)) { //create ef entity types manager DynamicTypeDefinitionManager typeDefinitionManager = DynamicTypeDefinitionManager.Create(metadataProvider); //Create adapter data access var dataAdapter = new DynamicDataAdapter(typeDefinitionManager); //Build OData edm model dynamicEdmModel = dataAdapter.BuildEdmModel(metadataProvider); } //Create query parser var parser = new OeParser(new Uri("http://dummy"), dynamicEdmModel); //Query var uri = new Uri("http://dummy/Orders?$expand=Customer,Items&$orderby=Id"); //The result of the query var stream = new MemoryStream(); //Execute query await parser.ExecuteGetAsync(uri, OeRequestHeaders.JsonDefault, stream, CancellationToken.None); stream.Position = 0; //Get result as string Console.WriteLine(new StreamReader(stream).ReadToEnd()); 

यह कैसे काम करता है


Information_schema विचार इकाई फ्रेमवर्क संदर्भ का निर्माण करते हैं। संदर्भ की इकाइयाँ सार वर्ग डायनामिक टाइप के वंशज हैं। यह वर्ग तालिका में कुल स्तंभों पर प्रतिबंध लगाता है, 50 से अधिक नहीं होना चाहिए। विदेशी कुंजी 30 से प्राथमिक कुंजी 50 से संपत्तियों के लिए नेविगेशन गुणों की संख्या अधिक नहीं होनी चाहिए।


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


स्रोत कोड संरचना


हल किया गया - sln \ OdataToEntity.Test.DynamicDataContext.sln
प्रोजेक्ट - source \ OdataToEntity.EfCore.DynamicDataContext
HTTP सर्वर - परीक्षण \ OdataToEntity.Test.DynamicDataContext.AspServer
टेस्ट - OdataToEntity.Test.DynamicDataContext
Sql परीक्षण आधार स्क्रिप्ट - test \ sql_scripts

Source: https://habr.com/ru/post/hi459656/


All Articles