Cia kuv piav qhia lub npe ntawm tsab xov xwm tam sim ntawd. Thaum xub thawj, kuv npaj yuav muab cov lus qhia zoo thiab txhim khu kev qha txog kev ua kom ceev dua los ntawm kev siv ib qho piv txwv yooj yim tab sis muaj tseeb. Txawm li cas los xij, thaum lub sijhawm ntsuas, nws tau muab tawm tias kev xav tsis qeeb li kuv xav, thiab LINQ qeeb dua li kuv xav. Thiab nws tau muab tawm tias kuv kuj tau ua qhov yuam kev ntsuas ... Cov ntsiab lus ntawm zaj dab neeg tiag tiag no nyob hauv qab qhov txiav thiab hauv cov lus. Vim tias qhov piv txwv yog qhov yooj yim thiab siv rau hauv txoj kev uas feem ntau ua hauv kev lag luam, nws tau muab tawm los ua qhov kev qhia nthuav heev, hauv kuv lub tswv yim: qhov cuam tshuam rau kev ua tau zoo ntawm cov ntsiab lus tseem ceeb ntawm tsab xov xwm tsis pom tseeb vim yog kev xav sab nraud: Moq, Autofac, EF Core, thiab lwm yam "kev khi."
Kuv pib ua haujlwm raws li tsab xov xwm no:
Raws li koj tuaj yeem pom, tus sau tau hais kom siv cov neeg sawv cev uas tau muab tso ua ke es tsis txhob nkag mus rau cov txheej txheem hom kev xav ncaj qha ua ib txoj hauv kev zoo heev los ua kom daim ntawv thov ua haujlwm tau sai dua. Tau kawg, kuj muaj IL emission, tab sis nws zoo tshaj plaws kom tsis txhob ua, vim nws yog txoj hauv kev siv zog ntau thiab ua yuam kev ntau tshaj plaws los ua tiav txoj haujlwm.
Xav txog tias kuv yeej ib txwm muaj lub tswv yim zoo sib xws txog qhov ceev ntawm kev xav, kuv tsis xav nug tus sau cov lus xaus.
Kuv feem ntau ntsib kev siv kev xav tsis thoob hauv lub tuam txhab. Ib hom raug coj mus. Cov ntaub ntawv txog khoom raug khaws cia. Txoj kev SetValue raug hu, thiab txhua tus neeg zoo siab. Tus nqi tau tsaws rau hauv thaj teb lub hom phiaj, txhua tus neeg zoo siab. Cov neeg ntse - cov laus thiab cov thawj coj pab pawg - sau lawv cov kev txuas ntxiv rau cov khoom, raws li lawv cov "universal" mappers los ntawm ib hom mus rau lwm hom ntawm qhov kev siv tsis paub no. Lub ntsiab lus feem ntau yog qhov no: coj tag nrho cov teb, coj tag nrho cov khoom, rov ua dua lawv: yog tias cov npe ntawm cov tswv cuab hom sib phim, peb ua SetValue. Peb ntes cov kev zam tsis tu ncua thaum cov khoom tsis pom rau ib qho ntawm cov hom, tab sis txawm tias ntawm no muaj ib txoj hauv kev los txhim kho kev ua tau zoo: Sim / ntes.
Kuv tau pom tib neeg rov tsim cov parsers thiab mappers yam tsis tau paub txog seb cov log uas tau tsim ua ntej lawv ua haujlwm li cas. Kuv tau pom tib neeg zais lawv cov kev siv tsis paub dab tsi tom qab cov tswv yim, kev sib txuas, thiab kev txhaj tshuaj, zoo li qhov ntawd yuav zam txim rau qhov kev kub ntxhov tom qab. Kuv tig kuv lub qhov ntswg rau cov kev siv zoo li no. Qhov tseeb, kuv tsis tau ntsuas qhov kev ua tau zoo tiag tiag, thiab thaum twg ua tau, kuv tsuas yog hloov qhov kev siv rau qhov "zoo tshaj plaws" dua thaum kuv muaj sijhawm. Yog li cov kev ntsuas thawj zaug, uas tau tham hauv qab no, ua rau kuv xav tsis thoob tiag tiag.
Kuv xav tias ntau tus ntawm nej, thaum nyeem Richter lossis lwm tus kws tshawb fawb, tau pom qhov kev lees paub tseeb tias kev xav hauv cov lej yog ib qho xwm txheej uas muaj kev cuam tshuam tsis zoo rau kev ua haujlwm ntawm daim ntawv thov.
Kev hu xov tooj rau kev xav yuam kom CLR hla cov rooj sib txoos kom pom qhov yog, nrhiav lawv cov metadata, txheeb xyuas nws, thiab lwm yam. Ntxiv mus, kev xav thaum lub sijhawm taug kev ua rau muaj kev faib ntau lub cim xeeb. Peb siv lub cim xeeb, CLR unpacks GC, thiab khov ensu. Qhov no yuav tsum qeeb qeeb, ntseeg kuv. Qhov ntau ntawm lub cim xeeb hauv cov servers niaj hnub lossis cov tshuab huab tsis tiv thaiv kev ua haujlwm siab. Qhov tseeb, qhov ntau lub cim xeeb koj muaj, qhov siab dua qhov yuav tshwm sim uas koj yuav SAIB GC qhov kev ua tau zoo. Kev xav yog, hauv kev xav, tus chij liab tsis tsim nyog rau nws.
Txawm li cas los xij, peb txhua tus siv ob qho tib si IoC thawv thiab cov ntaub ntawv mappers, uas kuj vam khom kev xav, tab sis lawv cov kev ua tau zoo feem ntau tsis cuam tshuam. Nws tsis yog vim tias kev txhaj tshuaj thiab kev rho tawm los ntawm cov qauv ntsiab lus sab nraud yog qhov tsim nyog heev uas peb yuav tsum txi kev ua tau zoo hauv txhua kis. Nws yooj yim dua - lawv yeej tsis cuam tshuam rau kev ua tau zoo.
Qhov tseeb yog tias cov qauv feem ntau raws li kev xav siv txhua yam kev dag ntxias los ua kom zoo dua nws siv. Feem ntau, qhov no cuam tshuam nrog lub cache. Cov lus qhia thiab cov neeg sawv cev sau los ntawm cov ntoo qhia tawm kuj yog ib txwm muaj. Piv txwv li, tus automapper tswj hwm phau ntawv txhais lus sib xws uas qhia cov hom rau cov haujlwm uas tuaj yeem hloov pauv rau ib leeg yam tsis tas yuav xav txog.
Qhov no ua tiav li cas? Yeej, nws tsis txawv ntawm cov logic uas lub platform nws tus kheej siv los tsim JIT code. Thawj zaug hu ib txoj kev, nws raug compiled (thiab, yog, cov txheej txheem no tsis ceev). Cov kev hu tom qab ntawd hloov kev tswj hwm mus rau txoj kev compiled, thiab yuav tsis muaj kev cuam tshuam loj rau kev ua tau zoo.
Hauv peb qhov teeb meem, peb kuj tuaj yeem siv qhov zoo ntawm JIT compilation thiab tom qab ntawd siv tus cwj pwm compiled nrog tib qho kev ua tau zoo li nws cov AOT counterparts. Cov lus qhia yuav los cawm hauv qhov no.
Lub hauv paus ntsiab lus no tuaj yeem piav qhia luv luv raws li nram no:
Qhov kawg ntawm kev xav yuav tsum tau khaws cia ua tus neeg sawv cev uas muaj cov haujlwm sib sau ua ke. Nws kuj tseem ua rau muaj kev nkag siab los khaws cia txhua yam khoom tsim nyog nrog cov ntaub ntawv hom hauv cov teb ntawm koj hom neeg ua haujlwm khaws cia sab nraud.
Muaj laj thawj rau qhov no. Kev nkag siab zoo qhia peb tias yog tias muaj ib yam dab tsi tuaj yeem muab tso ua ke thiab khaws cia, nws yuav tsum yog.
Saib mus tom ntej, nws yuav tsum tau sau tseg tias caching muaj nws qhov zoo thaum ua haujlwm nrog kev xav, txawm tias tsis siv txoj kev sau ua ke. Qhov tseeb, ntawm no kuv tsuas yog rov hais dua cov ntsiab lus ntawm tus sau ntawm tsab xov xwm uas kuv txuas rau saum toj no.
Tam sim no, mus rau cov lej. Cia peb saib ib qho piv txwv raws li qhov teeb meem tsis ntev los no uas kuv tau ntsib hauv ib puag ncig kev tsim khoom loj ntawm lub tsev txhab nyiaj loj. Txhua lub koom haum yog cuav, yog li tsis muaj leej twg yuav kwv yees.
Muaj ib qho chaw tshwj xeeb. Cia peb hu nws ua Kev Sib Txuas Lus. Muaj cov email nrog cov qauv cev, uas tus parser thiab hydrator tsim cov kev sib cuag no. Ib tsab email tuaj txog, peb nyeem nws, txheeb xyuas nws ua khub tseem ceeb-tus nqi, tsim ib qho kev sib cuag, thiab txuag nws rau hauv lub ntaub ntawv.
Nws yooj yim heev. Cia peb hais tias ib tus neeg muaj cov khoom xws li lub npe tag nrho, hnub nyoog, thiab tus xov tooj. Cov ntaub ntawv no raug xa mus rau hauv email. Lub lag luam kuj xav tau kev txhawb nqa kom sai sai ntxiv cov yuam sij tshiab rau kev kos duab cov khoom rau cov khub hauv lub cev email. Qhov no yog thaum ib tug neeg ua qhov yuam kev hauv tus qauv lossis yog tias kev kos duab yuav tsum tau pib sai sai los ntawm tus khub tshiab ua ntej tso tawm, hloov kho rau hom ntawv tshiab. Tom qab ntawd peb tuaj yeem ntxiv kev sib raug zoo ntawm kev kos duab tshiab ua qhov kho cov ntaub ntawv pheej yig. Yog li, qhov no yog ib qho piv txwv tiag tiag.
Peb tab tom siv nws, tsim cov kev sim. Nws ua haujlwm.
Kuv yuav tsis qhia cov code: muaj ntau cov source code, thiab nws muaj nyob rau ntawm GitHub ntawm qhov txuas ntawm qhov kawg ntawm tsab xov xwm. Koj tuaj yeem rub tawm nws, kho nws dhau qhov tsis paub, thiab ntsuas seb nws yuav cuam tshuam li cas rau koj rooj plaub. Kuv tsuas yog yuav qhia cov code rau ob txoj kev qauv uas sib txawv ntawm lub hydrator uas yuav tsum ceev thiab lub hydrator uas yuav tsum qeeb.
Lub logic yog raws li nram no: tus qauv template tau txais cov khub tsim los ntawm parser lub hauv paus logic. Lub LINQ txheej yog parser thiab hydrator lub hauv paus logic, uas nug cov ntsiab lus database thiab phim cov yuam sij nrog cov parser cov khub (muaj cov lej tsis yog LINQ rau cov haujlwm no rau kev sib piv). Cov khub ces dhau mus rau txoj kev hydration tseem ceeb, thiab cov nqi khub tau teeb tsa rau cov khoom sib xws.
"Ceev" (Ua ntej Ceev hauv cov qauv ntsuas):
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;
}
Raws li peb pom tau, ib qho static collection nrog cov property setters siv—compiled lambdas uas hu rau tus entity's setter. Lawv tau tsim nrog cov lej hauv qab no:
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();
}
Feem ntau nws meej. Peb rov ua cov khoom, tsim cov neeg sawv cev rau lawv, hu rau cov neeg teeb tsa, thiab txuag lawv. Tom qab ntawd peb hu rau lawv thaum xav tau.
"Qeeb" (Cov lus ua ntej qeeb hauv cov qauv ntsuas):
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;
}
Ntawm no peb tam sim ntawd hla cov khoom thiab hu rau SetValue ncaj qha.
Rau qhov meej thiab ua tus qauv ntsuas, kuv tau siv txoj kev naive uas sau cov nqi ntawm lawv cov khub sib raug zoo ncaj qha rau cov teb ntawm cov chaw. Lub prefix yog Manual.
Tam sim no cia peb siv BenchmarkDotNet thiab sim nws qhov kev ua tau zoo. Thiab mam li nco dheev ... (spoiler ceeb toom: qhov no yog qhov tshwm sim tsis raug; cov ntsiab lus hauv qab no)

Peb pom dab tsi ntawm no? Cov txheej txheem uas muaj lub npe hu ua Fast prefix qeeb dua li cov txheej txheem nrog lub npe hu ua Slow prefix hauv yuav luag txhua qhov kev hla. Qhov no siv rau ob qho tib si kev faib tawm thiab kev ua tiav ceev. Ntawm qhov tod tes, kev siv daim ntawv qhia zoo nkauj thiab zoo nkauj, siv cov txheej txheem LINQ thaum twg ua tau, txo qis kev ua tau zoo. Qhov sib txawv yog kev txiav txim ntawm qhov loj. Qhov sib txawv no tsis hloov pauv nrog ntau tus lej hla. Qhov sib txawv tsuas yog qhov ntsuas. Nrog LINQ, nws qeeb dua 4-200 npaug, nrog kwv yees li tib yam ntawm cov khib nyiab.
TSHIAB
Kuv ntseeg tsis tau kuv ob lub qhov muag, tab sis qhov tseem ceeb tshaj, peb tus npoj yaig tsis ntseeg kuv ob lub qhov muag lossis kuv tus lej - Tom qab rov sim kuv qhov kev daws teeb meem, nws pom tau zoo heev thiab taw qhia qhov yuam kev uas kuv tsis tau pom vim muaj ntau qhov kev hloov pauv hauv kev siv thawj zaug. Tom qab kho qhov kab laum uas pom hauv Moq teeb tsa, tag nrho cov txiaj ntsig rov qab mus rau qhov qub. Cov txiaj ntsig rov sim qhia tias qhov sib txawv tseem tsis tau hloov pauv - LINQ tseem cuam tshuam rau kev ua tau zoo ntau dua li kev xav. Txawm li cas los xij, nws zoo siab uas pom tias txoj haujlwm ntawm kev sau cov lus qhia yog qhov tsim nyog, thiab cov txiaj ntsig pom tau hauv ob qho tib si kev faib thiab kev ua tiav lub sijhawm. Thawj qhov kev khiav, thaum cov teb zoo li qub tau pib, yog qeeb dua rau txoj kev "ceev", tab sis tom qab ntawd qhov xwm txheej hloov pauv.
Nov yog qhov tshwm sim rov qab los ntawm kev sim dua:

Xaus Lus: Thaum siv kev xav hauv lub tuam txhab, tsis tas yuav siv cov tswv yim dag ntxias - LINQ yuav noj kev ua tau zoo heev. Txawm li cas los xij, hauv cov txheej txheem siab-load uas xav tau kev ua kom zoo dua, kev xav tuaj yeem khaws cia rau hauv daim ntawv ntawm initializers thiab delegate compilers, uas tom qab ntawd yuav muab "ceev" logic. Txoj kev no, koj tuaj yeem khaws cia ob qho tib si kev ywj pheej ntawm kev xav thiab qhov ceev ntawm koj daim ntawv thov.
Cov lej ntsuas no muaj nyob ntawm no. Cov neeg uas xav paub ntxiv tuaj yeem xyuas kuv cov lus hais dua:
PS: Cov lej hauv kev xeem siv IoC, thaum cov qauv siv cov qauv tsim tshwj xeeb. Qhov no yog vim tias thaum kawg kev siv, kuv tshem tawm txhua yam uas tuaj yeem cuam tshuam rau kev ua tau zoo thiab cuam tshuam cov txiaj ntsig.
PPS: Ua tsaug rau tus neeg siv Rau qhov pom kuv qhov yuam kev hauv Moq teeb tsa, uas cuam tshuam rau qhov kev ntsuas thawj zaug. Yog tias tus nyeem ntawv muaj karma txaus, thov nias like rau nws. Ib tug neeg nres, ib tug neeg nyeem kom zoo zoo, ib tug neeg kuaj xyuas ob zaug, thiab taw qhia qhov yuam kev. Kuv xav tias qhov no tsim nyog tau kev hwm thiab kev khuv leej.
PPPS: Ua tsaug rau tus nyeem ntawv uas tau kawm txog cov qauv thiab qhov layout. Kuv pom zoo rau qhov sib xws thiab yooj yim. Kev nthuav qhia tsis muaj ntau yam zoo, tab sis kuv tau xav txog qhov kev thuam. Thov pib ua haujlwm.
Tau qhov twg los: www.hab.com
