Chinyorwa chisina kubudirira pamusoro pekumhanyisa kufungisisa

Ini ndichakurumidza kutsanangura musoro wechinyorwa. Chirongwa chepakutanga chaive chekupa zano rakanaka, rinovimbika pamusoro pekukurumidza kushandiswa kwekufungisisa uchishandisa muenzaniso wakapfava asi wechokwadi, asi panguva yekumisikidza zvakazoitika kuti kufungidzira hakuna kunonoka sezvandaifunga, LINQ inononoka kupfuura muhope dzangu dzinotyisa. Asi pakupedzisira zvakazoitika kuti ini ndakakanganisawo muzviyero ... Tsanangudzo yenyaya iyi yehupenyu iri pasi pekucheka uye mumashoko. Sezvo muenzaniso wacho wakajairika uye uchiitwa musimboti sezvinowanzoitwa mubhizinesi, zvakazove zvinonakidza, sezvandinoona senge, ratidziro yehupenyu: kukanganisa kwekumhanya kwechinyorwa chikuru chechinyorwa chaive. hazvionekwe nekuda kwekunze logic: Moq, Autofac, EF Core uye mamwe "mabhendi".

Ndakatanga kushanda ndichifunga nezvechinyorwa ichi: Sei Reflection ichinonoka

Sezvauri kuona, munyori anokurudzira kushandisa vamiriri vakaunganidzwa pachinzvimbo chekudaidza nzira dzemhando yekuratidzira senzira huru yekumhanyisa kunyorera. Iko kune, hongu, IL emission, asi ndinoda kuidzivirira, sezvo iyi ndiyo nzira inonyanya kushanda-yekuita basa, iyo yakazara nezvikanganiso.

Tichifunga kuti ndagara ndine maonero akafanana nezve kumhanya kwekufungisisa, ini handina kunyanya kufunga kubvunza mhedziso dzemunyori.

Ini kazhinji ndinosangana nekushandisa zvisina musoro kwekufungisisa mubhizinesi. Mhando inotorwa. Mashoko pamusoro peimba inotorwa. Iyo SetValue nzira inonzi uye munhu wese anofara. Kukosha kwasvika mundima yakatarwa, munhu wese anofara. Vanhu vakangwara kwazvo - vakuru uye vanotungamira timu - nyora mawedzero avo kupikisa, zvichibva pakuita zvisina musoro kwekuita "pasi rose" mamepu eimwe mhando kune imwe. Chinhu chacho chinowanzova ichi: tinotora minda yese, totora zvivakwa zvese, tichidzokorora pamusoro pazvo: kana mazita enhengo dzemhando achienderana, tinoitisa SetValue. Nguva nenguva tinobata kunze nekuda kwekukanganisa kwatisina kuwana imwe pfuma mune imwe yemhando, asi kunyangwe pano pane nzira yekubuda nayo inovandudza mashandiro. Edza/kubata.

Ndakaona vanhu vachidzorerazve maparser nemamepu vasina kunyatsoshongedzwa neruzivo rwekuti michina yakauya pamberi pavo inoshanda sei. Ndakaona vanhu vachivanza mashandisiro avo ekusaziva kuseri kwemazano, kuseri kwenzvimbo, kuseri kwemajekiseni, sekunge izvi zvingaregerera iyo inotevera bacchanalia. Ndakasimudza mhino dzangu mudenga ndichiona kudaro. Muchokwadi, ini handina kuyera kudonha kwekuita chaiko, uye, kana zvichibvira, ndakangochinja kuita kune imwe "yakanyatsonaka" kana ndaigona kuisa maoko angu pairi. Naizvozvo, zviyero zvekutanga zvinokurukurwa pazasi zvakandivhiringidza zvakanyanya.

Ndinofunga vazhinji venyu, muchiverenga Richter kana dzimwe nyanzvi dzepfungwa, makawana chirevo chakakwana chekuti kuratidzira mukodhi chinhu chine kukanganisa kwakanyanya pakuita kwechikumbiro.

Kufona kufungisisa kunomanikidza CLR kuti ipfuure nemagungano kuti iwane iyo yavanoda, kudhonza metadata yavo, tsanangura, nezvimwe. Pamusoro pezvo, kufungisisa paunenge uchifamba zvakatevedzana zvinotungamira mukugovewa kwehuwandu hukuru hwendangariro. Isu tiri kushandisa ndangariro, CLR inofumura iyo GC uye mafiritsi anotanga. Inofanira kunge ichinonoka, nditende. Huwandu hukuru hwendangariro pamaseva emazuva ano ekugadzira kana michina yemakore haidzivisi kunonoka kugadzirisa. Muchokwadi, iyo yakanyanya ndangariro, iwe unowedzera mukana weKUZIVA mashandiro anoita GC. Reflection is, in theory, rimwe rag dzvuku rakawedzerwa kwaari.

Nekudaro, isu tese tinoshandisa IoC midziyo uye date mappers, iyo inoshanda musimboti yakavakirwa pakufungisisa, asi kazhinji hapana mibvunzo nezvekuita kwavo. Kwete, kwete nekuti kuunzwa kwekutsamira uye kubvisa kubva kune ekunze akaganhurirwa mamodheru akakosha zvekuti isu tinofanirwa kupira kuita mune chero mamiriro ezvinhu. Zvese zviri nyore - hazvikonzerese kuita zvakanyanya.

Icho chokwadi ndechekuti iwo akajairika masisitimu ayo akavakirwa pane yekuratidzira tekinoroji anoshandisa ese marudzi emanomano kushanda nawo zvakanyanya. Kazhinji iyi i cache. Kazhinji aya ndiwo Matauriro uye vamiriri vakaunganidzwa kubva mumuti wekutaura. Iyo imwechete automapper inochengetedza duramazwi rinokwikwidza rinoenderana nemhando nemabasa anogona kushandura rimwe kuita rimwe pasina kudaidza ratidziro.

Izvi zvinowanikwa sei? Chaizvoizvo, izvi hazvina kusiyana nemafungiro ayo chikuva pachacho chinoshandisa kugadzira JIT kodhi. Kana nzira ikadanwa kekutanga, inounganidzwa (uye, hongu, iyi nzira haina kukurumidza); pane dzinotevera nhare, kutonga kunotamiswa kune yakatogadzirwa nzira, uye hapazove nekukosha kwekuita kwekuita.

Kwatiri, iwe unogona zvakare kushandisa JIT kuunganidza wobva washandisa iyo yakaunganidzwa maitiro nekuita kwakafanana neayo maAOT. Matauriro achatibatsira munyaya iyi.

Nheyo iri mubvunzo inogona kuumbwa muchidimbu seizvi:
Iwe unofanirwa kuchengera yekupedzisira mhedzisiro yekufungisisa senhume ine iyo yakaunganidzwa basa. Izvo zvakare zvine musoro kuvharira zvese zvinodiwa zvinhu zvine ruzivo rwemhando muminda yemhando yako, mushandi, izvo zvakachengetwa kunze kwezvinhu.

Pane pfungwa mune izvi. Kunzwisisa kunotiudza kuti kana chimwe chinhu chichigona kuunganidzwa uye kuchengetwa, chinofanira kuitwa.

Kutarisa kumberi, zvinofanirwa kutaurwa kuti cache mukushanda nekufungisisa ine zvayakanakira, kunyangwe iwe usingashandisi nzira yakarongwa yekunyora mazwi. Chaizvoizvo, pano ndiri kungodzokorora zvirevo zvemunyori wechinyorwa chandinoreva pamusoro.

Zvino nezve kodhi. Ngatitarisei muenzaniso wakavakirwa pakurwadziwa kwangu kwazvino kwandaifanira kutarisana nako mukugadzirwa kwakakomba kwechikwereti chakakomba. Masangano ese ndeemanyepo zvekuti hapana angafungidzira.

Pane chimwe chinhu. Ngapave neContact. Kune mavara ane muviri wakamisikidzwa, kubva iyo parser uye hydrator inogadzira aya madhiri. Tsamba yakasvika, takaiverenga, tikaipatsanura mukiyi-value pairs, takagadzira yekubata, ndokuichengeta mudhatabhesi.

Ndeyekutanga. Ngatitii munhu anobatika ane zvivakwa Zita Rakazara, Zera uye Runhare Runhare. Iyi data inofambiswa mutsamba. Bhizinesi racho rinodawo rutsigiro kuti rikwanise kukurumidza kuwedzera makiyi matsva ekugadzira mepu yezvivakwa muzvikamu zviviri mumuviri wetsamba. Kana mumwe munhu aita typo mutemplate kana kuti isati yaburitswa zvinofanirwa kukurumidza kuburitsa mepu kubva kune mutsva mudiwa, kuchinjira kufomati nyowani. Ipapo isu tinokwanisa kuwedzera hutsva hwemepu yekubatanidza seyakachipa datafix. Ndiko, muenzaniso wehupenyu.

Isu tinoshandisa, kugadzira bvunzo. Mabasa.

Ini handisi kuzopa iyo kodhi: kune akawanda masosi, uye anowanikwa paGitHub kuburikidza neiyi link pakupera kwechinyorwa. Unogona kuzvitakura, kuvatambudza kupfuura kuzivikanwa uye kuvayera, sezvazvingakanganisa kwauri. Ini ndichangopa kodhi yemaitiro maviri etemplate anosiyanisa hydrator, iyo yaifanirwa kunge ichikurumidza, kubva kune hydrator, iyo yaifanirwa kunonoka.

Izvo zvine musoro ndeizvi: iyo template nzira inogamuchira mapairi anogadzirwa neiyo basic parser logic. Iyo LINQ layer ndiyo parser uye yakakosha logic ye hydrator, iyo inoita chikumbiro kune iyo dhatabhesi mamiriro uye inoenzanisa makiyi nemapairi kubva kune parser (pamabasa aya pane kodhi isina LINQ yekuenzanisa). Tevere, vaviri vacho vanopfuudzwa kune iyo huru hydration nzira uye kukosha kwevaviri kunoiswa kune inoenderana zvivakwa zvesangano.

"Nekukurumidza" (Prefix Fast mumabhenji):

 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;
        }

Sezvatinoona, muunganidzwa wakamira une setter zvivakwa unoshandiswa - akaumbwa lambdas anodaidza iyo setter entity. Yakagadzirwa neinotevera kodhi:

        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();
        }

Kazhinji zvakajeka. Isu tinoyambuka zvivakwa, tinogadzira nhume kune avo vanofona setter, uye tovachengeta. Tinobva tafona pazvinenge zvakakodzera.

"Slow" (Prefix Inononoka mumabhenji):

        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;
        }

Pano isu tinobva tapfuura zvivakwa uye tofonera SetValue zvakananga.

Nekujeka uye sereferensi, ini ndakashandisa nzira isina hunyanzvi inonyora kukosha kwepairi yavo yekubatanidza zvakananga mundima dzesangano. Prefix – Chinyorwa.

Zvino ngatitore BenchmarkDotNet uye tiongorore kuita. Uye kamwe-kamwe ... (spoiler - iyi haisi iyo mhedzisiro, ruzivo rwuri pazasi)

Chinyorwa chisina kubudirira pamusoro pekumhanyisa kufungisisa

Chii chatinoona pano? Nzira dzinotakura nekukunda iyo Yekukurumidza prefix inova inononoka munenge mapfuura ese pane nzira dzine Slow prefix. Izvi ndezvechokwadi kune zvese kugoverwa uye nekukurumidza kwebasa. Kune rimwe divi, kuita kwakanaka uye kwakanaka kwemepu uchishandisa LINQ nzira dzakagadzirirwa izvi pese pazvinogoneka, pane kudaro, zvinoderedza zvakanyanya kugadzirwa. Musiyano ndewekurongeka. Maitiro haachinji nenhamba dzakasiyana dzekupasa. Musiyano chete uri pachiyero. NeLINQ inononoka ka4 - 200, kune marara akawanda pachiyero chimwe chete.

ZVINYORWA

Handina kutenda maziso angu, asi zvinotonyanya kukosha, watinoshanda naye haana kutenda maziso angu kana kodhi yangu - Dmitry Tikhonov 0x1000000. Mushure mekutarisa mhinduro yangu kaviri, akawana zvine hungwaru uye akanongedza chikanganiso chandakapotsa nekuda kweshanduko dzinoverengeka mukuita, kutanga kusvika yekupedzisira. Mushure mekugadzirisa iyo yakawanikwa bug muMoq setup, zvese zvabuda zvakawira munzvimbo. Zvinoenderana nemhedzisiro yekudzokorora, maitiro makuru haachinje - LINQ ichiri kukanganisa kuita kupfuura kufungisisa. Nekudaro, zvakanaka kuti basa neKuratidzira kuunganidzwa hariitwe pasina, uye mhedzisiro inoonekwa zvese mukugovewa uye nguva yekuuraya. Kutanga kwekutanga, kana minda yakamira inotangwa, inononoka kune iyo "yekukurumidza" nzira, asi ipapo mamiriro anochinja.

Heino mhedzisiro yekuongororazve:

Chinyorwa chisina kubudirira pamusoro pekumhanyisa kufungisisa

Mhedziso: kana uchishandisa fungidziro mubhizinesi, hapana chikonzero chaicho chekushandisa manomano - LINQ ichadya chibereko zvakanyanya. Nekudaro, munzira dzakakura-mutoro dzinoda optimization, unogona kuchengetedza kutarisisa nenzira yevanotanga uye vamiriri vevamiriri, izvo zvinozopa "nekukurumidza" kufunga. Nenzira iyi unogona kuchengetedza zvese zviri zviviri kuchinjika kwekuratidzira uye nekumhanyisa kwechishandiso.

Iyo benchmark kodhi inowanikwa pano. Chero ani zvake anogona kutarisa kaviri mazwi angu:
HabraReflectionTests

PS: iyo kodhi mubvunzo inoshandisa IoC, uye mumabhenji inoshandisa yakajeka kuvaka. Chokwadi ndechekuti mukuita kwekupedzisira ndakacheka zvinhu zvese zvinogona kukanganisa kuita uye kuita kuti mhedzisiro iite ruzha.

PPS: Kutenda kumushandisi Dmitry Tikhonov @0x1000000 yekuona kukanganisa kwangu mukugadzirisa Moq, iyo yakakanganisa zviyero zvekutanga. Kana mumwe wevaverengi ane karma yakakwana, ndapota ifarire. Murume akamira, murume akaverenga, murume akatarisa kaviri ndokuratidza kukanganisa. Ndinofunga izvi zvakakodzera kuremekedzwa uye tsitsi.

PPPS: nekuda kwemuverengi akangwara akasvika pazasi pechimiro uye dhizaini. Ini ndiri wekufanana uye nyore. Kukurukurirana kwemharidzo kunosiya zvakawanda zvinoshuviwa, asi ini ndakafunga nezvekushoropodzwa. Ndinokumbira projectile.

Source: www.habr.com

Voeg