ืืื ืืกืืืจ ืืช ืืืชืจืช ืืืืืจ. ืืชืืื ืืช ืืืงืืจืืช ืืืืชื ืืชืช ืขืฆืืช ืืืืืช ืืืืื ืืช ืืืฆื ืืืืืฅ ืืช ืืฉืืืืฉ ืืืฉืชืงืคืืช ืืืืฆืขืืช ืืืืื ืคืฉืืื ืื ืืฆืืืืชืืช, ืื ืืืืื ืืื ืฆ'ืืจืงืื ื ืืชืืจืจ ืฉืืฉืชืงืคืืช ืืื ื ืืืืืช ืืื ืฉืืฉืืชื, LINQ ืืืืืช ืืืชืจ ืืืฉืจ ืืกืืืืื ืฉืื. ืืื ืืกืืฃ ืืชืืจืจ ืฉืื ืื ื ืขืฉืืชื ืืขืืช ืืืืืืช... ืคืจืืื ืขื ืกืืคืืจ ืืืืื ืืื ื ืืฆืืื ืืืชื ืืืชืืืืืช. ืืืืืื ืฉืืืืืื ืื ื ืคืืฆื ืืืืืฉืืช ืืืืคื ืขืงืจืื ื ืืคื ืฉื ืขืฉื ืืืจื ืืื ืืืคืขื, ืืื ืืชืืจืจื ืืืืืื ืืขื ืืื ืช ืืืื, ืืคื ืฉื ืจืื ืื, ืฉื ืืืื: ืืืฉืคืขื ืขื ืืืืืจืืช ืฉื ืื ืืฉื ืืืจืืื ืฉื ืืืืืจ ืืืืชื ืื ืืืจืืฉ ืืืื ืืืืืื ืืืฆืื ื: Moq, Autofac, EF Core ืืืืจืื "bandings".
ืืชืืืชื ืืขืืื ืืืชืจืฉืืืช ืืืืืจ ืืื:
ืืคื ืฉืืชื ืืืื ืืจืืืช, ืืืืืจ ืืฆืืข ืืืฉืชืืฉ ืื ืฆืืืื ืืืืืจืื ืืืงืื ืืงืจืื ืืฉืืจืืช ืืฉืืืืช ืกืื ืืฉืชืงืคืืช ืืืจื ืืฆืืื ืช ืืืจื ืืืื ืืช ืืืืฉืื. ืืฉ ืืืืื ืคืืืืช IL, ืืื ืืืืชื ืจืืฆื ืืืืื ืข ืืื ื, ืฉืื ืื ืืืจื ืืขืชืืจื ืืืืชืจ ืืืืฆืืข ืืืฉืืื, ืืืจืืื ืืืขืืืืช.
ืืืชืืฉื ืืื ืฉืชืืื ืืืืชื ืื ืืขื ืืืื ืืืื ืืืืจืืช ืืืฉืชืงืคืืช, ืื ืืชืืืื ืชื ืืืืืื ืืืืื ืกืคืง ืืืกืงื ืืช ืืืืืจ.
ืืขืชืื ืงืจืืืืช ืื ื ื ืชืงื ืืฉืืืืฉ ื ืืืื ืืืฉืชืงืคืืช ืืืจืืื. ืืกืื ื ืืงื. ืืืืข ืขื ืื ืืก ื ืืงื. ืฉืืืช SetValue ื ืงืจืืช ืืืืื ืฉืืืื. ืืขืจื ืืืืข ืืฉืื ืืืขื, ืืืื ืืจืืฆืื. ืื ืฉืื ืืืืื ืืืื - ืงืฉืืฉืื ืืจืืฉื ืฆืืืช - ืืืชืืื ืืช ืืืจืืืืช ืฉืืื ืืืืืืืงื, ืืืชืืกืก ืขื ืืืฉืื ื ืืืื ืฉืืื ืืืคืื "ืืื ืืืจืกืืืื" ืืกืื ืืื ืืืืจ. ืืืืืช ืืื ืืืจื ืืื ืื: ืื ืื ื ืืืงืืื ืืช ืื ืืฉืืืช, ืืืงืืื ืืช ืื ืืืืคืืื ืื, ืืืืจืื ืขืืืื: ืื ืืฉืืืช ืฉื ืืืืจื ืืกืื ืชืืืืื, ืื ืื ื ืืืฆืขืื ืืช SetValue. ืืื ืคืขื ืื ื ืชืืคืกืื ืืจืืืื ืขืงื ืืขืืืืช ืืื ืื ืืฆืื ื ื ืืก ืืืฉืื ืืืื ืืืกืืืื, ืื ืื ืืื ืืฉ ืืืฆื ืฉืืฉืคืจ ืืช ืืืืฆืืขืื. ื ืกื ืืชืคืืก.
ืจืืืชื ืื ืฉืื ืืืฆืืืื ืืืืฉ ืืช ืืื ืชืืื ืืืืคืืช ืืืื ืืืืืช ืืืืฉืื ืืืืืื ืืืืืข ืขื ืืืืคื ืฉืื ืคืืขืืืช ืืืืื ืืช ืฉืืื ืืคื ืืื. ืจืืืชื ืื ืฉืื ืืกืชืืจืื ืืช ืืืืืขืืช ืื ืืืืืืช ืฉืืื ืืืืืจื ืืกืืจืืืืืช, ืืืืืจื ืืืฉืงืื, ืืืืืจื ืืืจืงืืช, ืืืืื ืื ืืชืืจ ืืช ืืืงืื ืืื ืฉืืืืจ ืืื. ืืจืืชื ืืช ืืืฃ ืืืฉืืข ืืื ื ืืื. ืืืขืฉื, ืื ืืืืชื ืืช ืืืืคืช ืืืืฆืืขืื ืืืืืชืืช, ืืื ืืคืฉืจ, ืคืฉืื ืฉืื ืืชื ืืช ืืืืฉืื ื"ืืืคืืืืื" ืืืชืจ ืื ืืืืืชื ืืฉืื ืขืืื ืืช ืืื. ืืื, ืืืืืืืช ืืจืืฉืื ืืช ืฉื ืืื ื ืืืื ืืืืื ืืืชื ืืืื.
ืื ื ืืืฉื ืฉืจืืื ืืื, ืงืืจืืื ืจืืืืจ ืื ืืืืืืืืืืื ืืืจืื, ื ืชืงืื ืืืืืจื ืืืื ืช ืืืืืืื ืืคืื ืืฉืชืงืคืืช ืืงืื ืืื ืชืืคืขื ืฉืืฉ ืื ืืฉืคืขื ืฉืืืืืช ืืืืชืจ ืขื ืืืฆืืขื ืืืคืืืงืฆืื.
ืืฉืชืงืคืืช ืงืจืืื ืืืืฆืช ืืช ื-CLR ืืขืืืจ ืขื ืืจืืืืช ืืื ืืืฆืื ืืช ืืืื ืฉืื ืฆืจืืืื, ืืืฉืื ืืช ืืืื ื ืชืื ืื ืฉืืื, ืื ืชื ืืืชื ืืื'. ืื ืืกืฃ, ืืฉืชืงืคืืช ืชืื ืืฆืืืช ืจืฆืคืื ืืืืืื ืืืงืฆืื ืฉื ืืืืช ืืืืื ืฉื ืืืืจืื. ืื ืื ื ืื ืฆืืื ืืช ืืืืืจืื, CLR ืืืฉืฃ ืืช ื-GC ืืืชืืืืื ืืคืจืืืื. ืื ืืืืจ ืืืืืช ืืืื ืืืืื ื ืืืจืช, ืชืืืื ืื. ืืืืืืช ืืืืืจืื ืืขืฆืืืืช ืืฉืจืชื ืืืฆืืจ ืืืืจื ืืื ืื ืืืืื ืืช ืขื ื ืืื ื ืืื ืขืืช ืขืืืืืื ืืืืืื ืืขืืืื. ืืืขืฉื, ืืื ืฉืืืชืจ ืืืืจืื, ืื ืืื ืืกืืืื ืฉืชืฉืื ืื ืืื ื-GC ืขืืื. ืืฉืชืงืคืืช ืืื, ืืชืืืืจืื, ืกืืจืืื ืืืื ื ืืกืฃ ืขืืืจื.
ืขื ืืืช, ืืืื ื ืืฉืชืืฉืื ืืงืื ืืืื ืจืื ืฉื IoC ืืืืคื ืชืืจืืืื, ืฉืขืงืจืื ืืคืขืืื ืฉืืื ืืืืกืก ืื ืขื ืืฉืชืงืคืืช, ืื ืืจืื ืืื ืฉืืืืช ืืืื ืืืืฆืืขืื ืฉืืื. ืื, ืื ืืืื ืฉืืื ืกืช ืชืืืช ืืืคืฉืื ืืืืืืื ืืืฆืื ืืื ืฉื ืืงืฉืจ ืืืืืืื ืื ืื ื ืืืฆืืช ืขื ืฉืขืืื ื ืืืงืจืื ืืืฆืืขืื ืืื ืืงืจื. ืืื ืคืฉืื ืืืชืจ - ืื ืืืืช ืื ืืฉืคืืข ืืจืื ืขื ืืืืฆืืขืื.
ืืขืืืื ืืื ืฉืืืกืืจืืช ืื ืคืืฆืืช ืืืืชืจ ืืืืืกืกืืช ืขื ืืื ืืืืืืืช ืืฉืชืงืคืืช ืืฉืชืืฉืืช ืืื ืืื ื ืืจืืงืื ืืื ืืขืืื ืืืชื ืืฆืืจื ืืืคืืืืืืช ืืืชืจ. ืืืจื ืืื ืื ืืืืื. ืืืจื ืืื ืืื ืืืืืืื ืื ืฆืืืื ืืืืจืืืื ืืขืฅ ืืืืืื. ืืืชื ืืืคื ืืืืืืื ืืืืืง ืืืืื ืชืืจืืชื ืฉืืชืืื ืืืคืืกืื ืขื ืคืื ืงืฆืืืช ืฉืืืืืืช ืืืืืจ ืืืช ืืืืจืช ืืืื ืืงืจืื ืืฉืชืงืคืืช.
ืืื ืื ืืืฉื? ืืขืืงืจื ืฉื ืืืจ, ืื ืื ืฉืื ื ืืืืืืืื ืฉืื ืืฉืชืืฉืช ืืคืืืคืืจืื ืขืฆืื ืืื ืืืฆืืจ ืงืื JIT. ืืฉืืชืืื ื ืงืจืืช ืืคืขื ืืจืืฉืื ื, ืืื ืืชืืฆืขืช ืงืืืคืืืฆืื (ืืื, ืชืืืื ืื ืืื ื ืืืืจ); ืืงืจืืืืช ืขืืงืืืช, ืืฉืืืื ืืืขืืจืช ืืืชืืื ืฉืืืจ ืืืืืจ, ืืื ืืืื ืืจืืื ืืฉืืขืืชืืช ืืืืฆืืขืื.
ืืืงืจื ืฉืื ื, ืืชื ืืืื ืื ืืืฉืชืืฉ ืืงืืืคืืืฆืื ืฉื JIT ืืื ืืืฉืชืืฉ ืืืชื ืืืืช ืืงืืืคืืืฆืื ืขื ืืืชื ืืืฆืืขืื ืืื ืขืืืชืื ื-AOT. ืืืืืืื ืืืืื ืืขืืจืชื ื ืืืงืจื ืื.
ืืช ืืขืืงืจืื ืืืืืืจ ื ืืชื ืื ืกื ืืงืฆืจื ืืืืคื ืืื:
ืืชื ืฆืจืื ืืืืกื ืืช ืืชืืฆืื ืืกืืคืืช ืฉื ืืฉืชืงืคืืช ืื ืฆืื ืืืืื ืืช ืืคืื ืงืฆืื ืืืืืืจืช. ืื ืื ืืืืื ื ืืฉืืืจ ืืช ืื ืืืืืืืงืืื ืืืจืืฉืื ืขื ืืืืข ืกืื ืืฉืืืช ืฉื ืืืืคืืก ืฉืื, ืืขืืื, ืืืืืืกื ืื ืืืืฅ ืืืืืืืงืืื.
ืืฉ ืืื ืืืืืื. ืืฉืื ืืืฉืจ ืืืืจ ืื ื ืฉืื ื ืืชื ืืงืืคื ืืืฉืืืจ ืืฉืื ืืืืืื, ืื ืฆืจืื ืืขืฉืืช ืืืช.
ืืืื ืงืืืื, ืืฉ ืืืืจ ืฉืืืืืื ืืขืืืื ืขื ืืฉืชืงืคืืช ืืฉ ืืช ืืืชืจืื ืืช ืฉืื, ืื ืื ืืื ื ืืฉืชืืฉ ืืฉืืื ืืืืฆืขืช ืฉื ืงืืืคืืืฆืื ืฉื ืืืืืืื. ืืืขืฉื, ืืื ืื ื ืคืฉืื ืืืืจ ืขื ืืชืืืช ืฉื ืืืืจ ืืืืืจ ืฉืืืื ืื ื ืืชืืืืก ืืขืื.
ืขืืฉืื ืืืื ืืงืื. ืืืื ื ืกืชืื ืขื ืืืืื ืฉืืืืกืกืช ืขื ืืืื ืฉืื ืืืืจืื ื ืฉื ืืืฆืชื ืืืชืืืื ืืืชื ืืืคืงื ืจืฆืื ืืช ืฉื ืืืกื ืืฉืจืื ืจืฆืื ื. ืื ืืืฉืืืืช ืคืืงืืืืืืช ืื ืฉืืฃ ืืื ืื ืื ืืฉ.
ืืฉ ืืืื ืืืืช. ืฉืืืื ืงืฉืจ. ืืฉ ืืืชืืืช ืืขืืืช ืืืฃ ืกืื ืืจืื, ืฉืืื ืืื ืชื ืืืืืจืืืจ ืืืฆืจืื ืืช ืืืชื ืื ืฉื ืงืฉืจ. ืืืืข ืืืชื, ืงืจืื ื ืืืชื, ืคืจืฉื ื ืืืชื ืืืืืืช ืืคืชื-ืขืจื, ืืฆืจื ื ืืืฉ ืงืฉืจ ืืฉืืจื ื ืืืชื ืืืกื ืื ืชืื ืื.
ืื ืืืื ืืจื. ื ื ืื ืฉืืืืฉ ืงืฉืจ ืืฉ ืืช ืืืืคืืื ืื ืฉื ืืื, ืืื ืืืืคืื ืืืฆืืจืช ืงืฉืจ. ื ืชืื ืื ืืื ืืืขืืจืื ืืืืชื. ืืขืกืง ืื ืจืืฆื ืชืืืื ืืื ืืืืืช ืืกืืื ืืืืกืืฃ ืืืืืจืืช ืืคืชืืืช ืืืฉืื ืืืืคืื ืืืคืืื ื ืืฉืืช ืืืืืืช ืืืืฃ ืืืืชื. ืืืงืจื ืฉืืืฉืื ืืืฆืข ืฉืืืืช ืืงืืื ืืชืื ืืช ืื ืื ืืคื ื ืืฉืืจืืจ ืืฉ ืฆืืจื ืืืคืขืื ืืืืืคืืช ืืืคืื ืืฉืืชืฃ ืืืฉ, ืชืื ืืชืืื ืืคืืจืื ืืืืฉ. ืื ื ืืื ืืืืกืืฃ ืืชืื ืืืคืื ืืืฉ ืืชืืงืื ื ืชืื ืื ืืื. ืืืืืจ, ืืืืื ืืืืื.
ืื ื ืืืืฉืืื, ืืืฆืจืื ืืืืงืืช. ืขืืื.
ืื ื ืื ืืกืคืง ืืช ืืงืื: ืืฉ ืืจืื ืืงืืจืืช, ืืื ืืืื ืื ื-GitHub ืืจื ืืงืืฉืืจ ืืกืืฃ ืืืืืจ. ืืชื ืืืื ืืืขืืืก ืืืชื, ืืขื ืืช ืืืชื ืืื ืืืืจ ืืืืืื ืืืชื, ืืคื ืฉืื ืืฉืคืืข ืืืงืจื ืฉืื. ืื ื ืืชื ืจืง ืืช ืืงืื ืฉื ืฉืชื ืฉืืืืช ืชืื ืืช ืฉืืืืืืืช ืืื ืืืืืจืืืืจ, ืฉืืื ืืืืจ ืืืืืช ืืืืจ, ืืืื ืืืืืจืืืืจ, ืฉืืื ืืืืจ ืืืืืช ืืืื.
ืืืืืืื ืืื ืืืืงืื: ืฉืืืช ืืชืื ืืช ืืงืืืช ืืืืืช ืฉื ืืฆืจื ืขื ืืื ืืืืืืงื ืืืกืืกืืช ืฉื ืื ืชื. ืฉืืืช ื-LINQ ืืื ื-parser ืืืืืืืงื ืืืกืืกืืช ืฉื ืืืืจืืืืจ, ืฉืขืืฉื ืืงืฉื ืืืงืฉืจ ืฉื ืืกื ืื ืชืื ืื ืืืฉืืื ืืคืชืืืช ืขื ืืืืืช ืื-parser (ืขืืืจ ืคืื ืงืฆืืืช ืืื ืืฉ ืงืื ืืื LINQ ืืฆืืจื ืืฉืืืื). ืืืืจ ืืื, ืืืืืืช ืืืขืืจืื ืืฉืืืช ืืืืืจืฆืื ืืจืืฉืืช ืืขืจืื ืืืืืืช ื ืงืืขืื ืืืืคืืื ืื ืืชืืืืื ืฉื ืืืฉืืช.
"ืืืืจ" (ืงืืืืืช ืืืืจ ืืืืืื):
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;
}
ืืคื ืฉืื ื ืืืืืื ืืจืืืช, ื ืขืฉื ืฉืืืืฉ ืืืืกืฃ ืกืืื ืขื ืืืคืืื ืื ืืงืืขืื - ืืืืืืช ืืืืืจ ืืงืืจืืืช ืืืฉืืช ืืืงืืขืช. ื ืืฆืจ ืขื ืืื ืืงืื ืืื:
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();
}
ืืืืคื ืืืื ืื ืืจืืจ. ืื ื ืืืฆืื ืืช ืืืืคืืื ืื, ืืืฆืจืื ืขืืืจื ื ืฆืืืื ืืืชืงืฉืจืื ืืงืืืขืื ืืฉืืืจืื ืืืชื. ืืื ืื ืื ื ืืชืงืฉืจืื ืืฉืฆืจืื.
"ืืืื" (ืงืืืืืช ืืืื ืืืืืื):
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;
}
ืืื ืื ื ืืื ืขืืงืคืื ืืช ืืืืคืืื ืื ืืืชืงืฉืจืื ืืฉืืจืืช ื-SetValue.
ืืฉื ืืืืืจืืช ืืืคื ืืื, ืืืฉืืชื ืฉืืื ื ืืืืืช ืืืืชืืช ืืช ืืขืจืืื ืฉื ืฆืืื ืืืชืื ืฉืืื ืืฉืืจืืช ืืฉืืืช ืืืฉืืช. ืงืืืืืช - ืืื ื.
ืขืืฉืื ืืืื ื ืืงื ืืช BenchmarkDotNet ืื ืืื ืืช ืืืืฆืืขืื. ืืคืชืืื... (ืกืคืืืืจ - ืื ืื ืืชืืฆืื ืื ืืื ื, ืคืจืืื ืืืืฉื)
ืื ืื ืื ื ืจืืืื ืืื? ืฉืืืืช ืื ืืฉืืืช ืื ืืฆืืื ืืช ืืงืืืืืช ืืืืืจื ืืชืืจืจืืช ืืืืืืืช ืืืชืจ ืืืขื ืืื ืืืขืืจืื ืืืฉืจ ืฉืืืืช ืขื ืืงืืืืืช ืืืืื. ืื ื ืืื ืื ืืืงืฆืื ืืื ืืืืืจืืช ืืขืืืื. ืืฆื ืฉื ื, ืืืฉืื ืืคื ืืืืื ืื ืฉื ืืืคืื ืืฉืืืืช LINQ ืืืืืขืืืช ืืื ืืื ืืงืื ืืคืฉืจื, ืืืืคื, ืืคืืืช ืืืื ืืช ืืชืคืืงื. ืืืืื ืืื ืืกืืจ. ืืืืื ืื ืืฉืชื ื ืขื ืืกืคืจืื ืฉืื ืื ืฉื ืืขืืจืื. ืืืืื ืืืืื ืืื ืืงื ื ืืืื. ืขื LINQ ืื ืืืื ืคื 4 - 200, ืืฉ ืืืชืจ ืืฉืคื ืืขืจื ืืืืชื ืงื ื ืืืื.
ืึฐืขืึผืืึผึธื
ืื ืืืื ืชื ืืืจืื ืขืื ืื, ืืื ืืฉืื ืืื, ืืงืืืื ืฉืื ื ืื ืืืืื ืื ืืขืื ื ืืื ืืงืื ืฉืื -
ืืืื ืืชืืฆืื ืฉื ืืืืื ืืืืืจ:
ืืกืงื ื: ืืขืช ืฉืืืืฉ ืืืฉืชืงืคืืช ืืืจืืื, ืืื ืฆืืจื ืืืืื ืื ืงืื ืืืจืืงืื - LINQ ืชืืื ืืืชืจ ืืช ืืคืจืืืืงืืืืืืช. ืขื ืืืช, ืืฉืืืืช ืขืืืก ืืืื ืืืืจืฉืืช ืืืคืืืืืืฆืื, ืืชื ืืืื ืืืกืื ืืฉืชืงืคืืช ืืฆืืจื ืฉื ืืชืืืืื ืืืืืจืื ืฉื ื ืฆืื, ืฉืืกืคืงื ืื ืืืืืื "ืืืืจ". ืื ืชืืืื ืืฉืืืจ ืื ืขื ืืืืฉืืช ืืืฉืชืงืคืืช ืืื ืขื ืืืืจืืช ืืืืฉืื.
ืงืื ืืืฉืืืื ืืืื ืืื. ืื ืืื ืืืื ืืืืืง ืฉืื ืืช ืืืจื:
ื .ื.: ืืงืื ืืืืื ืื ืืฉืชืืฉ ื-IoC, ืืืืืืื ืืื ืืฉืชืืฉ ืืืื ื ืืคืืจืฉ. ืืขืืืื ืืื ืฉืืืืฉืื ืืกืืคื ื ืืชืงืชื ืืช ืื ืืืืจืืื ืฉืืืืืื ืืืฉืคืืข ืขื ืืืืฆืืขืื ืืืขืฉืืช ืืช ืืชืืฆืื ืจืืขืฉืช.
PPS: ืชืืื ืืืฉืชืืฉ
PPPS: ืชืืื ืืงืืจื ืืืืงืคื ืฉืืืืข ืืชืืชืืช ืืกืื ืื ืืืขืืฆืื. ืื ื ืืขื ืืืืืืช ืื ืืืืช. ืืืืคืืืืืื ืฉื ืืืฆืืช ืืืชืืจื ืืจืื ืืจืฆืื, ืืื ืืงืืชื ืืช ืืืืงืืจืช ืืืฉืืื. ืื ื ืืืงืฉ ืืช ืืงืืืข.
ืืงืืจ: www.habr.com