Edemede na-agabeghị nke ọma gbasara nlegharị anya ngwa ngwa

Aga m akọwara aha isiokwu ahụ ozugbo. Atụmatụ mbụ bụ inye ndụmọdụ dị mma, nke a pụrụ ịdabere na ya banyere otu esi eme ngwa ngwa iji ntụgharị uche na-eji ihe atụ dị mfe ma dị adị, ma n'oge benchmarking ọ tụgharịrị na ntụgharị uche adịghị nwayọọ dị ka m chere, LINQ dị nwayọọ karịa na nrọ m. Ma n'ikpeazụ ọ tụgharịrị na m mehiekwara na nha ... Nkọwa nke akụkọ ndụ a dị n'okpuru ịkpụ na na nkwupụta. Ebe ọ bụ na ihe atụ bụ nnọọ nkịtị na emejuputa atumatu na ụkpụrụ dị ka a na-emekarị na ụlọ ọrụ, ọ tụgharịrị bụrụ nnọọ ihe na-akpali, dị ka ọ dị m, ngosi nke ndụ: mmetụta na ọsọ nke isi isiokwu nke isiokwu bụ. adịghị ahụ anya n'ihi mgbagha mpụga: Moq, Autofac, EF Core na ndị ọzọ "eriri".

Amalitere m ịrụ ọrụ n'okpuru echiche nke akụkọ a: Kedu ihe kpatara ntụgharị uche ji nwayọ

Dị ka ị na-ahụ, odee na-atụ aro iji ndị nnọchiteanya achịkọtara kama ịkpọ kpọmkwem usoro ntụgharị uche dị ka ụzọ dị mma isi mee ngwa ngwa ngwa ngwa. Enwere, n'ezie, IL emission, ma ọ ga-amasị m izere ya, ebe ọ bụ na nke a bụ ụzọ kachasị arụ ọrụ iji rụọ ọrụ ahụ, nke jupụtara na njehie.

N'iburu n'uche na m na-enwekarị echiche yiri nke ahụ gbasara ọsọ ntụgharị uche, ebughị m n'obi karịsịa ịjụ nkwubi okwu onye edemede ahụ.

M na-ezutekarị iji echiche efu eme ihe na ụlọ ọrụ. A na-ewere ụdị ahụ. A na-ewere ozi gbasara ihe onwunwe ahụ. A na-akpọ usoro SetValue na onye ọ bụla na-aṅụrị ọṅụ. Uru ahụ erutela na mpaghara ebumnuche, onye ọ bụla nwere obi ụtọ. Ndị nwere ọgụgụ isi - ndị okenye na ndị otu - na-edepụta ndọtị ha ka ha jụ, na-adabere n'ụdị mmejuputa atumatu "ụwa niile" nke otu ụdị gaa na nke ọzọ. Ihe kachasị mkpa bụ nke a: anyị na-ewere mpaghara niile, were ihe niile, na-atụgharị n'elu ha: ọ bụrụ na aha ndị otu ụdị dabara, anyị na-eme SetValue. Site n'oge ruo n'oge anyị na-ejide ihe ndị ọzọ n'ihi mmejọ ebe anyị na-ahụghị ụfọdụ ihe onwunwe na otu n'ime ụdị ahụ, ma ọbụna ebe a nwere ụzọ isi mee ka arụmọrụ dịkwuo mma. Gbalịa/jide.

Ahụla m ka ndị mmadụ na-emepụtaghachi ihe nzacha na ndị na-ese ihe n'ebughị ngwá agha zuru ezu banyere otú ígwè ọrụ ndị bịara n'ihu ha si arụ ọrụ. Ahụla m ka ndị mmadụ na-ezobe mmejuputa iwu ha na-enweghị isi n'azụ atụmatụ, n'azụ interfaces, n'azụ injections, dị ka a ga-asị na nke a ga-agbaghara bacchanalia na-esote. Emere m imi m mgbe m ghọtara nke a. N'ezie, atụleghị m nkwụsị arụmọrụ n'ezie, ma, ọ bụrụ na ọ ga-ekwe omume, a gbanwere m mmejuputa ya ka ọ bụrụ "kachasị mma" ma ọ bụrụ na m nwere ike ịnweta aka m na ya. Ya mere, nha mbụ ndị a tụlere n'okpuru gbagwojuru m anya.

Echere m na ọtụtụ n'ime unu, na-agụ Richter ma ọ bụ ndị ọkà mmụta echiche ndị ọzọ, achọpụtala nkwupụta ziri ezi zuru oke na ntụgharị uche na koodu bụ ihe na-enwe mmetụta na-adịghị mma na arụmọrụ nke ngwa ahụ.

Ntụgharị ịkpọ oku na-amanye CLR ịga na mgbakọ iji chọta nke ha chọrọ, bulite metadata ha, tusaa ha, wdg. Tụkwasị na nke ahụ, ntụgharị uche mgbe ị na-agafe usoro na-eduga na ntinye nke nnukwu ebe nchekwa. Anyị na-eji ebe nchekwa, CLR kpughee GC na friezes na-amalite. O kwesịrị ịdị nwayọ nwayọ, kwere m. Ọnụ ọgụgụ buru ibu nke ebe nchekwa na sava mmepụta nke oge a ma ọ bụ igwe igwe ojii anaghị egbochi oge nhazi dị elu. N'ezie, ka ebe nchekwa na-abawanye, ka o yikarịrị ka ị ga-achọpụta ka GC si arụ ọrụ. Ntụgharị uche bụ, na tiori, mgbakwunye uhie uhie maka ya.

Agbanyeghị, anyị niile na-eji igbe IoC na ndị na-ese ụbọchị, ụkpụrụ arụ ọrụ nke dabere na ntụgharị uche, mana anaghị enwekarị ajụjụ gbasara arụmọrụ ha. Ee e, ọ bụghị n'ihi na iwebata ndabere na abstraction si mpụga ọnọdụ ọnọdụ dị oke mkpa na anyị ga-achụ àjà arụmọrụ n'ọnọdụ ọ bụla. Ihe niile dị mfe - ọ naghị emetụta arụmọrụ nke ukwuu.

Nke bụ eziokwu bụ na usoro ndị a na-ahụkarị na-adabere na teknụzụ ntụgharị na-eji ụdị aghụghọ niile na-arụ ọrụ na ya nke ọma. Ọ na-abụkarị nke a bụ ebe nchekwa. Ndị a bụ Okwu na ndị nnọchiteanya achịkọtara site na osisi okwu. Otu automapper ahụ na-edobe akwụkwọ ọkọwa okwu asọmpi nke dabara ụdị nwere ọrụ nwere ike ịtụgharị otu n'ime ọzọ na-akpọghị ntụgharị uche.

Kedu ka esi enweta nke a? N'ụzọ bụ isi, nke a adịghị iche na mgbagha nke ikpo okwu n'onwe ya na-eji mepụta koodu JIT. Mgbe a na-akpọ usoro maka oge mbụ, a na-achịkọta ya (na, ee, usoro a adịghị ngwa ngwa); na oku na-esote, a na-ebufe njikwa na usoro a chịkọtara na mbụ, na ọ gaghị enwe nnukwu arụmọrụ arụmọrụ.

N'ọnọdụ anyị, ị nwekwara ike iji nchịkọta JIT wee jiri omume chịkọtara na otu arụmọrụ dị ka ndị otu AOT ya. Okwu ga-enyere anyị aka na nke a.

Enwere ike ịhazi ụkpụrụ a na-ekwu na nkenke dị ka ndị a:
Ị ga-echekwa nsonaazụ ikpeazụ nke ntụgharị uche dịka onye nnọchiteanya nwere ọrụ achịkọtara. Ọ dịkwa mma ịchekwa ihe niile dị mkpa yana ụdị ozi dị n'ọhịa ụdị gị, onye ọrụ, nke echekwara na mpụga ihe.

Enwere mgbagha na nke a. Amamihe na-agwa anyị na ọ bụrụ na enwere ike ịchịkọta ihe na cache, mgbe ahụ ekwesịrị ime ya.

Na-ele anya n'ihu, ekwesịrị ịsị na cache na-arụ ọrụ na ntụgharị uche nwere uru ya, ọ bụrụgodị na ị naghị eji usoro a chọrọ iji chịkọta okwu. N'ezie, ebe a ka m na-ekwughachi ihe odide nke onye dere edemede nke m na-ezo aka n'elu.

Ugbu a banyere koodu. Ka anyị lee ihe atụ nke dabere na mgbu m na-adịbeghị anya nke m ga-eche ihu na mmepụta siri ike nke ụlọ ọrụ kredit siri ike. Ụlọ ọrụ niile bụ akụkọ ifo ka onye ọ bụla ghara ịma.

Enwere isi ihe. Ka enwere kọntaktị. Enwere akwụkwọ ozi nwere ahụ ahaziri ahazi, nke parser na hydrator na-emepụta otu kọntaktị ndị a. Akwụkwọ ozi bịarutere, anyị gụrụ ya, tụba ya n'ime ụzọ abụọ bara uru, mepụta kọntaktị, wee chekwaa ya na nchekwa data.

Ọ bụ elementrị. Ka anyị kwuo na kọntaktị nwere aha zuru oke, afọ na ekwentị kọntaktị. A na-ebufe data a n'akwụkwọ ozi. Azụmahịa ahụ chọkwara nkwado iji nwee ike ịgbakwunye igodo ọhụrụ ngwa ngwa maka ihe njirimara nke eserese n'ime ụzọ abụọ n'ime ahụ nke akwụkwọ ozi ahụ. Ọ bụrụ na mmadụ emee typo na ndebiri ma ọ bụ ọ bụrụ na tupu ahapụ ya, ọ dị mkpa ịmalite eserese ngwa ngwa site na onye mmekọ ọhụrụ, na-emegharị na usoro ọhụrụ ahụ. Mgbe ahụ, anyị nwere ike ịgbakwunye njikọ maapụ ọhụrụ dị ka datafix dị ọnụ ala. Ya bụ, ihe atụ ndụ.

Anyị na-emejuputa, mepụta ule. Na-arụ ọrụ.

Agaghị m enye koodu ahụ: enwere ọtụtụ isi mmalite, ha dịkwa na GitHub site na njikọ na njedebe nke isiokwu ahụ. Ị nwere ike ibu ha, mekpaa ha ahụ nke ukwuu ma tụọ ha, dịka ọ ga-emetụta gị. M ga-enye naanị koodu nke ụzọ template abụọ nke na-amata ọdịiche nke hydrator, nke kwesịrị ịdị ngwa ngwa, site na hydrator, nke kwesịrị ịdị nwayọọ.

Ihe mgbagha bụ nke a: usoro ndebiri na-enweta ụzọ abụọ sitere na mgbagha nhụsianya bụ isi. Ngwunye LINQ bụ parser na mgbagha bụ isi nke hydrator, nke na-arịọ arịrịọ maka nchekwa data ma jiri igodo tụnyere ụzọ abụọ site na parser (maka ọrụ ndị a enwere koodu na-enweghị LINQ maka ntụnyere). Na-esote, a na-agafe ụzọ abụọ ahụ na usoro hydration bụ isi na ụkpụrụ nke ụzọ abụọ ahụ ka edobere ihe ndị kwekọrọ na ihe ahụ.

"Ọsọ ọsọ" (Ngwagharị ngwa ngwa na akara ngosi):

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

Dị ka anyị nwere ike ịhụ, a na-eji nchịkọta static nwere ihe nrụpụta ihe - lambdas chịkọtara nke na-akpọ ihe nhazi. Emepụtara site na koodu a:

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

N'ozuzu o doro anya. Anyị na-agafe akụrụngwa, mepụta ndị nnọchi anya ndị na-akpọ setters, wee chekwaa ha. Mgbe ahụ, anyị na-akpọ mgbe ọ dị mkpa.

"Ọdị nwayọọ" (Nganye ngwa ngwa na akara ngosi):

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

N'ebe a, anyị gafechara akụrụngwa wee kpọọ SetValue ozugbo.

Maka idoanya na dịka ntụnye aka, etinyere m usoro na-enweghị isi nke na-ede ụkpụrụ nke njikọ abụọ ha ozugbo na mpaghara ụlọ ọrụ. Prefix – Akwụkwọ ntuziaka.

Ugbu a, ka anyị were BenchmarkDotNet wee nyochaa arụmọrụ. Na mberede ... (onye na-emebi ihe - nke a abụghị nsonaazụ ziri ezi, nkọwa dị n'okpuru)

Edemede na-agabeghị nke ọma gbasara nlegharị anya ngwa ngwa

Kedu ihe anyị na-ahụ ebe a? Ụzọ na-eji mmeri na-ebu prefix ngwa ngwa na-aghọ nwayọọ nwayọọ n'ihe fọrọ nke nta ka ọ bụrụ ụzọ niile karịa ụzọ ndị nwere prefix Slow. Nke a bụ eziokwu maka ma oke na ọsọ nke ọrụ. N'aka nke ọzọ, mmejuputa nke ọma ma mara mma nke eserese site na iji ụzọ LINQ ezubere maka nke a n'ebe ọ bụla o kwere mee, n'ụzọ megidere nke ahụ, na-ebelata arụpụtaghị ihe. Ihe dị iche bụ n'usoro. Usoro anaghị agbanwe site na ọnụọgụ ngafe dị iche iche. Naanị ihe dị iche bụ na nha. Na LINQ ọ na-eji nwayọọ nwayọọ 4 - 200, a na-enwekwu ihe mkpofu n'ihe dịka otu nha.

emelitere

Ekwetaghị m anya m, mana nke ka mkpa, onye ọrụ ibe anyị ekweghị ma anya m ma ọ bụ koodu m - Dmitry Tikhonov 0x1000000. N'ịbụ onye nyochachara ihe ngwọta m ugboro abụọ, ọ chọpụtara nke ọma ma gosipụta njehie m tụfuru n'ihi mgbanwe dị iche iche na mmejuputa, nke mbụ ruo n'ikpeazụ. Mgbe edozichara ahụhụ ahụ achọtara na nhazi Moq, nsonaazụ niile dabara na ebe. Dị ka nsonaazụ nyochaghachi, isi ihe na-eme adịghị agbanwe - LINQ ka na-emetụta arụmọrụ karịa ntụgharị uche. Otú ọ dị, ọ dị mma na ọrụ ahụ na nchịkọta nkwupụta okwu adịghị eme n'efu, a na-ahụkwa nsonaazụ ya ma na oke na oge igbu. Mwepụta mbụ, mgbe etinyere oghere static, na-adịkarị nwayọ maka usoro “ngwa ngwa” mana ọnọdụ ahụ na-agbanwe.

Nke a bụ nsonaazụ nnwale a:

Edemede na-agabeghị nke ọma gbasara nlegharị anya ngwa ngwa

Nkwubi okwu: mgbe ị na-eji ntụgharị uche na ụlọ ọrụ, ọ dịghị mkpa ọ bụla iji aghụghọ mee ihe - LINQ ga-eri nri karịa. Otú ọ dị, na ụzọ ibu dị elu nke chọrọ njikarịcha, ị nwere ike ịchekwa ntụgharị uche n'ụdị mmalite na ndị nchịkọta nnọchiteanya, nke ga-enye echiche "ngwa ngwa". N'ụzọ dị otú a, ị nwere ike ịnọgide na-enwe ma mgbanwe nke ntụgharị uche na ọsọ nke ngwa.

Koodu benchmark dị ebe a. Onye ọ bụla nwere ike ịlele okwu m ugboro abụọ:
Nnwale HabraReflection

PS: koodu dị na ule na-eji IoC, na akara ngosi ọ na-eji arụ ọrụ doro anya. Nke bụ eziokwu bụ na na mmejuputa ikpeazụ m na-ebipụ ihe niile nwere ike imetụta arụmọrụ ma mee ka ọ pụta ìhè.

PPS: Daalụ onye ọrụ Dmitry Tikhonov @0x1000000 maka ịchọpụta njehie m na ịtọlite ​​​​Moq, nke metụtara nha mbụ. Ọ bụrụ na onye ọ bụla n'ime ndị na-agụ akwụkwọ nwere karma zuru oke, biko masịrị ya. Nwoke ahụ kwụsịrị, nwoke ahụ gụpụtara, nwoke ahụ nyochara ugboro abụọ wee gosi mmejọ ahụ. Echere m na nke a kwesịrị nsọpụrụ na ọmịiko.

PPPS: ekele maka onye na-agụ akwụkwọ nke ọma bụ onye ruru ala nke ụdị na imewe. A bụ m maka otu na ịdị mma. Diplomacy nke ihe ngosi na-ahapụ ọtụtụ ihe a chọrọ, mana eburu m nkatọ ahụ n'uche. M na-arịọ maka projectile.

isi: www.habr.com

Tinye a comment