Ko te tuhinga kaore i angitu mo te whakatere whakaata

Ka whakamarama tonu ahau i te taitara o te tuhinga. Ko te mahere tuatahi ko te tuku tohutohu pai, pono mo te tere ake i te whakamahinga o te whakaata ma te whakamahi i tetahi tauira ngawari engari pono, engari i te wa e whakatauira ana ka puta ko te whakaaro kaore i te puhoi ki taku i whakaaro ai, he puhoi ake te LINQ i aku moemoea. Engari i te mutunga ka puta he he ano taku i roto i nga inenga... Ko nga korero mo tenei korero ora kei raro i te tapahi me nga korero. I te mea he mea noa te tauira me te whakatinana i runga i te kaupapa penei i te nuinga o te waa i roto i tetahi umanga, ka puta he mea tino pai, ki taku whakaaro, he whakaaturanga o te ora: ko te paanga ki te tere o te kaupapa matua o te tuhinga. kaore e kitea na te arorau o waho: Moq, Autofac, EF Core me etahi atu "paipai".

I timata ahau ki te mahi i raro i te whakaaro o tenei tuhinga: He aha i puhoi ai te Whakaata

Kei te kite koe, e kii ana te kaituhi ki te whakamahi i nga kaikawe kua whakahiato, kaua ki te karanga tika i nga tikanga momo whakaata hei huarahi pai ki te tere ake te tono. Ko te tikanga, ko te tukunga IL, engari e hiahia ana ahau ki te karo, na te mea koinei te huarahi tino kaha ki te mahi i te mahi, e kiki ana i nga hapa.

Ki te whakaaro he rite tonu taku whakaaro mo te tere o te whakaata, kaore au i tino whakaaro ki te patai i nga whakatau a te kaituhi.

He maha nga wa ka tutaki ahau ki te whakamahi poauau o te whakaata i roto i te umanga. Ka tangohia te momo. Ka tangohia nga korero mo te rawa. Ka karangahia te tikanga SetValue ka koa katoa. Kua tae mai te uara ki te mara whainga, harikoa katoa. Nga tangata tino mohio - nga kaumatua me nga kaiarahi roopu - tuhia o raatau toronga ki te whakahē, i runga i te whakatinanatanga koretake o nga mahere "ao" o tetahi momo ki tetahi. Ko te tikanga ko tenei: ka tangohia e matou nga mara katoa, ka tango i nga taonga katoa, ka huri ki runga ake: ki te rite nga ingoa o nga momo mema, ka mahia e matou a SetValue. Mai i ia wa ka hopukina e matou he rereke na runga i nga hapa kaore i kitea e matou etahi taonga i roto i tetahi o nga momo, engari ahakoa kei konei he huarahi ki waho ka pai ake te mahi. Whakamātauria/hopu.

Kua kite ahau i nga tangata e hanga hou ana i nga parsers me nga mapa me te kore e tino mau ki nga korero mo te mahi a nga miihini i mua i a raatau. Kua kite ahau i nga tangata e huna ana i a ratou whakatinanatanga poauau i muri i nga rautaki, i muri i nga atanga, i muri i nga werohanga, me te mea nei ka kore e puta te bacchanalia o muri mai. Ka huri taku ihu ki runga i nga ahuatanga penei. Ko te mea pono, kaore au i ine i te tino rerenga mahi, a, mena ka taea, ka whakarereke noa ahau i te whakatinanatanga ki te "tino pai" mena ka taea e au te eke ki runga. Na reira, ko nga inenga tuatahi i korerohia i raro nei i tino raruraru ahau.

Ki taku whakaaro he tokomaha o koutou, e panui ana i a Richter, etahi atu tohunga whakaaro ranei, kua kite i tetahi korero tino tika ko te whakaata i roto i te waehere he ahuatanga e pa ana ki te mahi o te tono.

Ma te waea whakaata ka kaha te CLR ki te haere ki roto i nga huihuinga ki te rapu i te mea e hiahiatia ana e ratou, ka toia a raatau metadata, ka poroporoaki, aha atu. I tua atu, ko te whakaata i te wa e haere ana i nga raupapa ka arahi ki te tohatoha i te nui o te mahara. Kei te whakamahia e matou te mahara, ka hurahia e CLR te GC ka timata te parai. Me tino puhoi, whakapono mai ki ahau. Ko te nui o te mahara i runga i nga kaiwhakarato whakangao hou, i nga miihini kapua ranei kaore e aukati i te roa o te tukatuka. Inaa, ka nui ake te mahara, ka kaha ake koe ki te WHAKAARO me pehea te mahi a te GC. Ko te whakaaro huritao, i roto i te ariā, he tawhero whero ano mo ia.

Heoi, kei te whakamahi katoa tatou i nga ipu IoC me nga mahere ra, ko te kaupapa whakahaere kei runga ano i te whakaata, engari kaore he patai mo o raatau mahi. Kao, ehara i te mea ko te whakaurunga o nga whakawhirinakitanga me te tangohanga mai i nga tauira horopaki iti o waho he mea tino tika kia mate tatou i nga mahi ahakoa he aha. He ngawari ake nga mea katoa - kaore e tino pa ki nga mahi.

Ko te meka ko nga anga tino noa e hangai ana i runga i te hangarau whakaata e whakamahi ana i nga momo tinihanga katoa kia pai ake ai te mahi ki a ia. Ko te tikanga he keteroki tenei. I te nuinga o te waa ko nga Whakaaturanga me nga kaikawe i whakahiato mai i te rakau korero. Ko taua kaipatuhi aunoa e pupuri ana i te papakupu whakataetae e taurite ana ki nga momo me nga mahi ka taea te huri tetahi ki tetahi me te kore e karanga whakaata.

Me pehea e tutuki ai tenei? Ko te mea nui, kaore tenei i te rereke mai i te arorau e whakamahia ana e te papaaho ake hei whakaputa waehere JIT. Ka karangahia tetahi tikanga mo te wa tuatahi, ka whakahiatohia (a, ae, kaore i te tere tenei mahi); i nga waea ka whai ake, ka whakawhitia te mana whakahaere ki te tikanga kua whakahiatotia, a karekau he whakahekenga mahi nui.

I a maatau, ka taea hoki e koe te whakamahi i te whakahiato JIT katahi ka whakamahi i te whanonga whakahiato me te mahi rite ki ona hoa AOT. Ka tae mai nga korero hei awhina i tenei keehi.

Ko te kaupapa e pa ana ka taea te hanga poto penei:
Me keteroki koe i te hua whakamutunga o te whakaata hei kaitakawaenga kei roto te mahi whakahiato. He mea tika ano te keteroki i nga mea katoa e tika ana me nga momo korero i roto i nga mara o to momo, te kaimahi, kei te rongoa i waho o nga taonga.

He arorau kei roto i tenei. E kii ana te maarama ki a tatou mehemea ka taea te whakahiato me te keteroki tetahi mea, me mahi.

Ma te titiro whakamua, me kii ko te keteroki i roto i te mahi me te whakaata he painga, ahakoa kaore koe e whakamahi i te tikanga whakahiato korero. Ina, kei te whakahoki ano ahau i nga korero a te kaituhi o te tuhinga e korero nei ahau i runga ake nei.

Inaianei mo te waehere. Kia titiro tatou ki tetahi tauira e ahu mai ana i runga i taku mamae tata nei i pa ki a au i roto i tetahi mahi nui o tetahi umanga nama. He mea tito noa nga hinonga katoa kia kore ai tetahi e pohehe.

Te vai ra te tahi mau tumu. Kia Hoapaki. He reta me te tinana paerewa, no reira ka hangaia e te parser me te hydrator enei hoapaki ano. Ka tae mai he reta, ka panuitia e matou, ka poroa ki nga takirua uara-matua, ka hanga he hoapaki, ka tiakina ki te paataka raraunga.

He kura tuatahi. Me kii kei tetahi hoapaki nga taonga Ingoa Katoa, Tau me te Waea Whakapaa. Ka tukuna enei raraunga i roto i te reta. Kei te hiahia hoki te pakihi ki te tautoko kia tere te taapiri i nga taviri hou mo te mapi i nga rawa hinonga kia takirua ki te tinana o te reta. Ina he hapa tetahi ki te tauira, ki te mea ranei i mua i te tukunga he mea tika kia tere te whakarewa mahere mai i tetahi hoa hou, ki te urutau ki te whakatakotoranga hou. Na ka taea e taatau te taapiri i tetahi hononga mahere hou hei whakatika raraunga iti. Arā, he tauira oranga.

Ka whakatinanahia e matou, ka hangaia nga whakamatautau. Mahi.

Kaore au e whakarato i te waehere: he maha nga puna, kei te waatea i runga i te GitHub ma te hono i te mutunga o te tuhinga. Ka taea e koe te utaina, te whakamamae i a raatau i tua atu i te mohiotanga me te ine i a raatau, ka pa ki to keehi. Ka hoatu noa e ahau te waehere o nga tikanga tauira e rua e wehewehe ana i te hydrator, i maharahia he tere, mai i te hydrator, i maharahia he puhoi.

Ko te arorau e whai ake nei: ko te tikanga tauira ka whiwhi takirua i hangaia e te arorau parser taketake. Ko te paparanga LINQ te parser me te arorau taketake o te hydrator, e tono ana ki te horopaki papaarangi me te whakataurite i nga taviri me nga takirua mai i te parser (mo enei mahi he waehere kaore he LINQ hei whakataurite). I muri mai, ka tukuna nga takirua ki te tikanga whakamaoritanga matua ka whakatauhia nga uara o nga takirua ki nga ahuatanga o te hinonga.

“Karekau” (Whakamua Tere i roto i nga tohu tohu):

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

Ka taea e tatou te kite, ka whakamahia he kohinga pateko me nga ahuatanga kaiwhakatakoto - kohia nga lambdas e kiia ana ko te hinonga kaiwhakatakoto. I hangaia e te waehere e whai ake nei:

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

I te nuinga o te waa he maamaa. Ka takahia e matou nga taonga, ka hangaia he kaikawe mo ratou ka karanga he kaiwhakatakoto, ka tiakina. Na ka waea tatou ina tika.

“Porooro” (Prefix Pōturi i roto i nga tohu tohu):

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

I konei ka mawhiti tonu i nga taonga ka karanga tika ki a SetValue.

Mo te whakamarama me te tohutoro, i whakatinanahia e ahau tetahi tikanga poauau e tuhi tika ana i nga uara o o raatau hononga takirua ki nga mara hinonga. Prefix – Manual.

Inaianei me tango a BenchmarkDotNet me te tirotiro i te mahinga. Na ohorere... (kaipahua - ehara tenei i te hua tika, kei raro nga korero)

Ko te tuhinga kaore i angitu mo te whakatere whakaata

He aha ta tatou e kite nei? Ko nga tikanga e mau ana i te prefix Tere ka tere ake i roto i te tata katoa o nga paahitanga i nga tikanga whai prefix puhoi. He pono tenei mo te tohatoha me te tere o te mahi. I tetahi atu taha, ko te whakatinanatanga ataahua me te huatau o te mapi ma te whakamahi i nga tikanga LINQ mo tenei i nga waahi ka taea, engari, ka tino whakaitihia te hua. Ko te rereke o te raupapa. Ko te ia e kore e huri ki te maha o nga paahitanga. Ko te rereke anake ko te tauine. Ki te LINQ he 4 - 200 nga wa puhoi ake, he nui ake nga para i runga i te ahua kotahi.

Whakahoutia

Kaore au i whakapono ki oku kanohi, engari ko te mea nui, kaore to matou hoa mahi i whakapono ki oku kanohi, ki taku tohu - Dmitry Tikhonov 0x1000000. I te tirotiro-rua i taku otinga, ka tino kitea e ia tetahi hapa i ngaro i ahau na te maha o nga huringa o te whakatinanatanga, i te timatanga ki te whakamutunga. Whai muri i te whakatika i te bug i kitea i roto i te tatūnga Moq, ka taka katoa nga hua. E ai ki nga hua whakamatautau, kaore e rereke te ahua matua - ka pa te LINQ ki nga mahi nui atu i te whakaata. Heoi, he pai ki te kore e mahia te mahi me te whakahiato Whakaaturanga, a ka kitea te hua i roto i te tohatoha me te wa mahi. Ko te whakarewanga tuatahi, ka arawhitihia nga mara pateko, he puhoi ake mo te tikanga "tere", engari ka huri te ahuatanga.

Anei te hua o te whakamatautau ano:

Ko te tuhinga kaore i angitu mo te whakatere whakaata

Whakamutunga: i te wa e whakamahi ana i te whakaaro huritao i roto i tetahi hinonga, kaore he take ki te mahi tinihanga - ka nui ake te hua o te LINQ. Heoi, i roto i nga tikanga kawenga nui e hiahia ana ki te arotautanga, ka taea e koe te tiaki i te whakaata i roto i te ahua o nga kaiwhakataki me nga kaiwhakatakoto kaitoha, katahi ka whakarato i te arorau "tere". Ma tenei ka taea e koe te pupuri i te ngawari o te whakaata me te tere o te tono.

Kei konei te tohu tohu tohu. Ka taea e te tangata te taki rua aku kupu:
HabraReflectionTests

PS: Ko te waehere i roto i nga whakamatautau ka whakamahi i te IoC, i roto i nga tohu tohu ka whakamahia e ia he hanga maamaa. Ko te meka i roto i te whakatinanatanga whakamutunga ka tapahia e ahau nga mea katoa ka pa ki te mahi me te ngangau o te hua.

PPS: Nga mihi ki te kaiwhakamahi Dmitry Tikhonov @0x1000000 mo te kitenga i taku hapa i te whakaturanga Moq, i pa ki nga inenga tuatahi. Mena kei te karma tetahi o nga kaipanui, koa koa. Ka tu te tangata, ka panui te tangata, ka taki rua te tangata, ka tohu i te he. Ki taku whakaaro he mea tika tenei mo te whakaute me te aroha.

PPPS: he mihi ki te kaipanui tino mohio kua tae ki raro o te ahua me te hoahoa. Ko ahau mo te taurite me te waatea. Ko te tohu o te whakaaturanga he nui noa atu te hiahia, engari i aro ahau ki nga whakahee. Ka tono ahau mo te kaupapa.

Source: will.com

Tāpiri i te kōrero