Maqaal aan lagu guulaysan oo ku saabsan dardargelinta milicsiga

Waxaan isla markiiba sharxi doonaa cinwaanka maqaalka. Qorshaha asalka ah wuxuu ahaa in la siiyo talo wanaagsan oo la isku halleyn karo oo ku saabsan sidii loo dedejin lahaa isticmaalka milicsiga iyadoo la adeegsanayo tusaale fudud laakiin dhab ah, laakiin inta lagu jiro bar-tilmaameedka waxaa soo baxday in fekerku uusan ahayn mid gaabis ah sida aan mooday, LINQ wuu ka gaabiyaa riyooyinkayga. Laakin ugu dambayntii waxa ii soo baxday in aan aniguna ku qaldamay cabbiraadda... Faahfaahinta sheekadan nololeed waa kuwa hoos go’ay iyo faallooyinka. Maadaama tusaale ahaan uu yahay mid caadi ah oo loo fuliyo mabda'a sida caadiga ah ee lagu sameeyo ganacsiga, waxay u muuqatay mid xiiso leh, sida ay aniga ila tahay, muujinta nolosha: saameynta xawaaraha mawduuca ugu muhiimsan ee maqaalku wuxuu ahaa lama dareemi karo sababtuna waa caqli-gal dibadeed: Moq, Autofac, EF Core iyo kuwa kale "bandings".

Waxaan bilaabay inaan ku shaqeeyo aragtida maqaalkan: Waa maxay sababta Milicsigu u gaabiyaa

Sida aad arki karto, qoraagu waxa uu soo jeedinayaa in la isticmaalo wufuud la soo ururiyey halkii aad si toos ah ugu wici lahayd hababka nooca milicsiga si aad u dedejiso codsiga. Dabcan, waxaa jira qiiqa IL, laakiin waxaan jeclaan lahaa inaan iska ilaaliyo, maadaama tani ay tahay habka ugu shaqada badan ee lagu fuliyo hawsha, taas oo ay ka buuxaan khaladaad.

Anigoo tixgalinaya in aan mar walba ra'yi isku mid ah ka qabo xawaaraha milicsiga, si gaar ah uguma talagelin in aan su'aal ka keeno gabagabada qoraaga.

Inta badan waxaan la kulmaa isticmaalka macno-darrada ah ee milicsiga ganacsiga. Nooca waa la qaataa. Macluumaadka ku saabsan hantida waa la qaadayaa. Habka SetValue ayaa loo yaqaan oo qof kastaa wuu ku farxaa. Qiimaha ayaa yimid goobta la beegsanayo, qof kastaa wuu ku faraxsan yahay. Dadka aadka u caqli badan - waayeelka iyo hogaamiyayaasha kooxda - waxay u qoraan kordhintooda si ay u diidaan, iyaga oo ku saleysan hirgelinta khariidadaha "caalami" ee hal nooc oo kale ah. Nuxurku inta badan waa kan: waxaan qaadnaa dhammaan beeraha, qaadnaa dhammaan guryaha, ku celcelineynaa iyaga: haddii magacyada xubnaha nooca ay iswaafaqaan, waxaan fulineynaa SetValue. Waqti ka waqti waxaan qabanaa ka-reebis sababtoo ah khaladaadka halkaas oo aynaan ka helin qaar ka mid ah hantida mid ka mid ah noocyada, laakiin xitaa halkan waxaa jira hab looga baxo oo hagaajinaya waxqabadka. Isku day/qabso

Waxaan arkay dadka oo dib-u-abuuray baarayaasha iyo khariidado iyaga oo aan si buuxda u hubaysnayn macluumaadka ku saabsan sida mashiinnada iyaga ka horreeyay u shaqeeyaan. Waxaan arkay dadka oo ku qarinaya xeeladahooda gadaashooda istiraatijiyad, gadaashooda, irbado gadaasha, sida haddii tani ay cudur daar ka bixinayso bacchanalia xiga. Waxaan sanka kor u qaaday markaan xaqiiqsaday. Dhab ahaantii, maan cabbirin daadinta waxqabadka dhabta ah, iyo, haddii ay suurtagal tahay, waxaan si fudud u beddelay hirgelinta mid ka sii "fiican" haddii aan gacantayda ku heli karo. Sidaa darteed, cabbiraadaha ugu horreeya ee hoos looga hadlay ayaa si dhab ah ii jahawareeray.

Waxaan u maleynayaa in qaar badan oo idinka mid ah, akhrinta Richter ama fikrado kale, ay la kulmeen odhaah dhammaystiran oo cadaalad ah oo ka tarjumaysa koodka waa dhacdo saameyn xun ku leh waxqabadka codsiga.

U yeerida milicsiga waxay ku qasabtaa CLR inay dhex marto shirarka si ay u helaan midda ay u baahan yihiin, kor u qaadaan xogtooda badan, kala qaybiyaan, iwm. Intaa waxaa dheer, milicsiga marka la marinayo taxanaha waxay keenaysaa qoondaynta qadar badan oo xusuusta ah. Waxaan isticmaaleynaa xusuusta, CLR waxay daaha ka qaadaysaa GC-ga oo friezes ayaa bilaabmaya. Waa inay si muuqata u gaabis noqotaa, i rumayso. Xaddiga badan ee xusuusta ee server-yada wax soo saarka casriga ah ama mashiinnada daruuraha kama hortagayaan dib u dhac ku yimaada habaynta sare. Dhab ahaantii, mar kasta oo xusuusta bataan, ayay u badan tahay inaad Ogaysiiso sida GC u shaqeeyo. Milicsigu waa, aragti ahaan, calal cas oo dheeraad ah isaga.

Si kastaba ha ahaatee, dhammaanteen waxaan isticmaalnaa weelasha IoC iyo khariidado timirta, mabda'a hawlgalka kaas oo sidoo kale ku saleysan milicsiga, laakiin inta badan ma jiraan su'aalo ku saabsan waxqabadkooda. Maya, maaha sababtoo ah soo bandhigida ku-tiirsanaanta iyo ka-soo-baxa moodooyinka xaddidan ee dibadda ayaa aad lagama maarmaan u ah in aan u hurno waxqabadka xaalad kasta. Wax walba waa ka fudud yihiin - runtii wax badan ma saameynayso waxqabadka.

Xaqiiqdu waxay tahay in qaababka ugu caansan ee ku salaysan tignoolajiyada milicsiga ay isticmaalaan dhammaan noocyada tabaha si ay ula shaqeeyaan si ka wanaagsan. Caadiyan kani waa kayd. Caadi ahaan kuwani waa odhaahyo iyo ergooyin laga soo ururiyey geedka tibaaxaha. Isla automapper-ka ayaa ilaaliya qaamuus tartan ah oo u dhigma noocyada leh hawlo midba midka kale u rogi kara isaga oo aan wicin milicsiga.

Sidee taas lagu gaaraa? Asal ahaan, tani kama duwana caqligalka ah in madal lafteeda ay isticmaasho si ay u soo saarto koodka JIT. Marka habka loo yeero markii ugu horeysay, waa la soo ururiyaa (iyo, haa, habkani ma aha mid degdeg ah); wicitaanada soo socda, xakamaynta waxaa loo wareejiyaa habka horeba loo soo ururiyey, mana jiri doonto wax-qabad la taaban karo.

Xaaladeena, waxaad sidoo kale isticmaali kartaa ururinta JIT ka dibna waxaad isticmaali kartaa habdhaqanka la soo ururiyey oo leh waxqabad la mid ah kuwa dhiggooda ah ee AOT. Odhaahyada ayaa naga caawin doona kiiskan.

Mabda’a laga hadlayaa waxa si kooban loo qaabayn karaa sida soo socota:
Waa inaad kaydisaa natiijada u dambaysa ee milicsiga sidii ergo ka kooban hawsha la soo ururiyey. Waxa kale oo ay macno samaynaysaa in lagu kaydiyo dhammaan walxaha lagama maarmaanka ah oo wata nooca macluumaadka ee goobaha noocaaga, shaqaalaha, ee lagu kaydiyo meel ka baxsan walxaha.

Waxaa jira macquul this. Caqliga saliimka ahi wuxuu inoo sheegayaa in haddii wax la ururin karo oo la kaydin karo, ay tahay in la sameeyo.

Marka hore la eego, waa in la sheegaa in kaydinta ku shaqeynta milicsiga ay leedahay faa'iidooyinkeeda, xitaa haddii aadan isticmaalin habka la soo jeediyay ee ururinta tibaaxaha. Runtii, halkan waxaan si fudud ugu celinayaa qodobbada qoraaga maqaalka ee aan kor ugu tilmaamayo.

Hadda oo ku saabsan koodka. Aynu eegno tusaale ku salaysan xanuunkaygii dhawaa ee aan la kulmay wax-soo-saar halis ah oo ah hay'ad deyn ah oo halis ah. Dhammaan qaybaha waa kuwo khiyaali ah si aan qofna u malayn.

Waxaa jira nuxur. Ha jiro Xiriir. Waxaa jira xarfo leh jir la jaanqaadi karo, kuwaas oo parser-ka iyo hydrator-ka ay ka abuuraan xiriiryo isku mid ah. Warqad ayaa timi, waanu akhrinay, waxaanu u kala saarnay lammaane-qiimo muhiim ah, waxaanu samaynay xidhiidh, waxaanu ku kaydinay kaydka xogta.

Waa dugsi hoose Aynu sheegno in xidhiidhku leeyahay guryaha Magaca oo buuxa, Da'da iyo Telefoonka Xiriirka. Xogtan waxaa lagu gudbiyay warqadda. Ganacsigu waxa kale oo uu rabaa taageero si uu awood ugu yeesho in uu si dhakhso leh ugu daro furayaal cusub oo loogu talagalay samaynta guryaha hay'ad laba-labo ah oo ku jira jidhka xarafka. Haddii ay dhacdo in qof uu ku qoro template ama ka hor inta aan la sii dayn waa lagama maarmaan in si degdeg ah loo bilaabo khariidaynta lammaane cusub, la qabsanaya qaabka cusub. Markaa waxaan ku dari karnaa isku xidhka khariidaynta cusub sidii xog-fix raqiis ah. Taasi waa, tusaale nololeed.

Waxaan hirgelineynaa, abuurnaa imtixaanno. shaqeeya

Ma bixin doono koodhka: waxaa jira ilo badan, waxaana laga heli karaa GitHub iyada oo loo marayo isku xirka dhamaadka maqaalka. Waad ku shuban kartaa, jidhdili kartaa si ka baxsan aqoonsiga oo aad cabbiri kartaa, sida ay u saamaynayso kiiskaaga. Waxa kaliya oo aan siin doonaa koodka laba hab oo template ah oo kala saaraya hydrator-ka, kaas oo loo malaynayay in uu dhakhso badan yahay, laga bilaabo dareeraha, kaas oo loo maleynayay inuu yahay mid gaabis ah.

Caqligu waa sida soo socota: Habka template wuxuu helayaa lammaane ay dhaleen macquulka baarser-ka aasaasiga ah. Lakabka LINQ waa parser-ka iyo caqliga aasaasiga ah ee hydrator-ka, kaas oo ka dhigaya codsi ku saabsan macnaha guud ee xogta oo isbarbar dhigaya furayaasha lammaane ka soo baxa baarser (hawlahan waxaa jira kood aan lahayn LINQ marka la barbardhigo). Marka xigta, lammaanaha ayaa loo gudbiyaa habka ugu muhiimsan ee fuuq-celinta iyo qiyamka lammaanaha ayaa loo dejiyay sifooyinka u dhigma ee hay'adda.

"Dhakhso" (hordhac degdeg ah marka la fiiriyo):

 protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
        {
            var contact = new Contact();
            foreach (var setterMapItem in _proprtySettersMap)
            {
                var correlation = correlations.FirstOrDefault(x => x.PropertyName == setterMapItem.Key);
                setterMapItem.Value(contact, correlation?.Value);
            }
            return contact;
        }

Sida aan arki karno, ururin aan caadi ahayn oo leh hanti dejiye ayaa la isticmaalaa - lambdas la soo ururiyey oo wacaya cidda wax dejisa. Waxaa sameeyay summadan:

        static FastContactHydrator()
        {
            var type = typeof(Contact);
            foreach (var property in type.GetProperties())
            {
                _proprtySettersMap[property.Name] = GetSetterAction(property);
            }
        }

        private static Action<Contact, string> GetSetterAction(PropertyInfo property)
        {
            var setterInfo = property.GetSetMethod();
            var paramValueOriginal = Expression.Parameter(property.PropertyType, "value");
            var paramEntity = Expression.Parameter(typeof(Contact), "entity");
            var setterExp = Expression.Call(paramEntity, setterInfo, paramValueOriginal).Reduce();
            
            var lambda = (Expression<Action<Contact, string>>)Expression.Lambda(setterExp, paramEntity, paramValueOriginal);

            return lambda.Compile();
        }

Guud ahaan way caddahay. Waxaanu maraynaa guryaha, waxaanu u abuurnaa wufuud u yeedha dejinta, waananu badbaadinaa. Markaa waanu wacnaa marka loo baahdo.

"Slow" (horgale tartiib tartiib ah ee bartilmaameedyada):

        protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
        {
            var contact = new Contact();
            foreach (var property in _properties)
            {
                var correlation = correlations.FirstOrDefault(x => x.PropertyName == property.Name);
                if (correlation?.Value == null)
                    continue;

                property.SetValue(contact, correlation.Value);
            }
            return contact;
        }

Halkan waxaan isla markiiba dhaafnay guryaha oo si toos ah u wac SetValue.

Si loo caddeeyo iyo tixraac ahaan, waxaan hirgeliyay hab naive ah oo si toos ah u qoraya qiyamka lammaaneyaashooda isku xirnaanta si toos ah qaybaha goobta. Horgalayaasha - Buugga.

Hadda aan qaadano BenchmarkDotNet oo aan baarno waxqabadka. Oo si lama filaan ah... (qaswadayaasha - tani maaha natiijada saxda ah, faahfaahinta ayaa hoos ku qoran)

Maqaal aan lagu guulaysan oo ku saabsan dardargelinta milicsiga

Maxaan ku aragnaa halkan? Hababka sida guusha leh horgalayaasha degdega ah u noqda kuwa gaabis ah ku dhawaad ​​dhammaan baasaska marka loo eego hababka leh horgalaha tartiib tartiib ah. Tani waa run labadaba qoondaynta iyo xawaaraha shaqada. Dhanka kale, hirgelinta quruxda iyo quruxda badan ee khariidaynta iyadoo la adeegsanayo hababka LINQ ee loogu talagalay tan meel kasta oo suurtagal ah, liddi ku ah, waxay si weyn u yaraynaysaa wax soo saarka. Farqigu waa kala dambayn. Isbeddelku kuma beddelo tirooyinka baasaska kala duwan. Farqiga kaliya ayaa ah miisaanka. Iyadoo LINQ ay 4 - 200 jeer ka gaabinayso, waxaa jira qashin badan oo qiyaas ahaan isku miisaan ah.

UPDATED

Ma rumaysanin indhahayga, laakiin waxaa ka sii muhiimsan, saaxiibkay ma rumaysnayn indhahayga ama koodkayga - Dmitry Tikhonov 0x1000000. Markii uu laba-laab-baaray xalkayga, waxa uu si cajiib ah u daah-furay oo ii tilmaamay khalad iga dhacay oo ay sabab u tahay isbeddello badan oo ku yimi fulinta, bilow ilaa dhammaad. Ka dib markii la hagaajiyay cayayaanka la helay ee Moq, dhammaan natiijooyinka waxay ku dhaceen meel. Marka loo eego natiijooyinka ku-noqoshada, isbeddelka ugu weyni isma beddelo - LINQ wali waxay saamaysaa waxqabadka in ka badan milicsiga. Si kastaba ha ahaatee, way fiican tahay in shaqada la isku dubarididda muujinta aan loo samayn si aan micne lahayn, natiijaduna waxay muuqanaysaa labadaba qoondaynta iyo waqtiga fulinta. Daah-furka ugu horreeya, marka goobaha taagan la bilaabo, si dabiici ah ayey u gaabis u tahay habka "dhakhso", laakiin markaa xaaladdu way isbedeshaa.

Waa kan natiijada ku celiska:

Maqaal aan lagu guulaysan oo ku saabsan dardargelinta milicsiga

Gabagabo: marka la isticmaalayo milicsiga ganacsiga, ma jirto baahi gaar ah oo loo qabo in la isticmaalo khiyaano - LINQ waxay cuni doontaa wax soo saar badan. Si kastaba ha noqotee, hababka culeyska sare leh ee u baahan hagaajinta, waxaad badbaadin kartaa milicsiga qaabka bilowga iyo ergada, kaas oo markaa bixin doona caqli-gal "dhakhso leh". Sidan ayaad ku ilaalin kartaa dabacsanaanta milicsiga iyo xawaaraha codsiga.

Koodhka bartilmaameedka ayaa laga heli karaa halkan. Qof kastaa wuu laba-hubin karaa erayadayda:
Habra Milicsiga Tijaabada

PS: koodhka imtixaanada waxa uu isticmaalaa IoC, bar-tilmaameedkana waxa uu isticmaalaa dhismo cad. Xaqiiqdu waxay tahay in fulinta kama dambaysta ah aan jaray dhammaan qodobbada saameynaya waxqabadka oo natiijada ka dhigi kara buuq.

PPS: Waad ku mahadsan tahay isticmaalaha Dmitry Tikhonov @0x1000000 si aan u ogaado qaladka aan ka galay dejinta Moq, kaas oo saameeyay cabbirkii ugu horreeyay. Haddii mid ka mid ah akhristayaasha uu haysto karma ku filan, fadlan like saar. Ninkii wuu istaagay, ninkii ayaa akhriyay, ninkii laba-baaray oo khaladkii tilmaamay. Waxaan qabaa in tani ay tahay mid mudan ixtiraam iyo naxariis.

PPPS: Waad ku mahadsan tahay akhristaha xikmadda leh ee hoos u dhigay qaabka iyo naqshadeynta. Waxaan ahay midnimo iyo raaxo. Diblomaasiyadda wax-soo-jeedinta waxay ka tagaysaa wax badan oo la doonayo, laakiin waxaan xisaabta ku darsaday dhaleeceynta. Waxaan waydiisanayaa madfaca.

Source: www.habr.com

Add a comment