αααα»αααΉαααααααααΈα
αααααΎαα’αααααααααΆααα αααααΆαααΎαααΊαααααααααΌααααΆαααα’ αα·αα’αΆα
αα»αα
α·αααααΆαα’αααΈαααααααααΎαααααΏαααααΆαααααΎααααΆααααΆααααα»ααααα
αΆαααααααααΎα§ααΆα αααααΆαααα ααα»ααααααΆααααααα ααα»αααααααα»αα’αα‘α»ααααααααΎααΆαααΆααααα ααΆααΆααααα αΆαααΆααΆααααα»ααααα
αΆαααα·αααΊαααΌα
αααα»αααΆααα·ααα LINQ ααΊααΊαααΆααα»αα·αααα’αΆααααααααααααα»αα ααα»αααααα
ααΈαααα
αα ααΆααΆαααααααααΆαααΆαααα»αααααΆαααα α»ααααα»αααΆαααΆααααα... ααααααΆααααα’α·αααααΏααααΆαααΈαα·ααααααΊαααα·ααα
αααααααΆαααΆααα αα·ααα
αααα»αααα·αααααα α
αΆααααΆααααΈα§ααΆα ααααααααΊααΆααΏαααααααΆα αΎαααααΌαααΆαα’αα»ααααααΆαααααΆαααααΌα
αααααααΌαααΆαααααΎα‘αΎαααΆααααααΆαα
αααα»ααα ααααΆααα½αααΆααΆααααααα
ααΆαα½αα±ααα
αΆααα’αΆααααααααΆααααΌα
αααααΆα αΆααααΌα
ααΆαααα»α ααΆααααα αΆαααΈαα·α: αααααααΆααααΎααααΏααααααααΆαααααααΆααααα’αααααααΊ αα·αα’αΆα
ααααααααΆααααΆααααααααΆααααααααα·ααααΆααΆααααα
: Moq, Autofac, EF Core αα·α "αααα»ααααααααΈ" ααααααααα
αααα»αα
αΆααααααΎαααααΎααΆααααααα
αααΆααα’αΆααααααααα’ααααααααα
ααΌα αααα’αααα’αΆα ααΎα α’ααααα·ααααααααΎα±ααααααΎααααα·ααΌαααααΆαα αααααααΆααΆαααΆαα α αααααααΆααααΌααα·ααΈααΆααααααααααααααα»ααααα αΆααααΆαααααααΆαααααα’αααα»αααΆααααααΎαααααΏααααααα·ααΈαααΆαααααΆααα ααΆααΆααα·αααΆααααΆαααΆαααααΆα IL ααα»αααααααα»αα αααααααΆαααΆ ααααααααααΆαα·ααΈαααααΉαααα’ααααΎαααααΆαααααααααααα»ααααα»αααΆαα’αα»ααααααΆαααΆα αααααΆαααααααααααα α»αα
ααααα·α αΆαααΆααΆαααα»ααααααααΆααααα·αααααααααααΆα’αααΈααααΏαααααΆααααα»ααααα αΆαα αααα»ααα·αααΆααααααα·αααααΎααααΈαα½αααΆαααααα·ααααΆαααααα’ααααα·αααααααααα
ααΆααΏαααααα»ααα½ααααααααΆαααααΎααΆααααα»ααααα αΆααααααααααααααα αααα»ααα ααααΆαα ααααααααααΌαααΆαααα ααααααΆαα’αααΈαααααααααααααα·ααααΌαααΆαααα αα·ααΈααΆααααα SetValue ααααΌαααΆαααα α ααΆ α αΎααααααααααΆααΈαααΆαα αααααααΆααααααααΆαααααα α’αααααΆααα’ααααααΆαααααΆαα α·αααα ααα»αααααααΆαααΆαα - ααα»αααα αΆαα αα·αα’αααααΉαααΆααααα»α - αααααααααααααααααααααα½αααααΎααααΈααααΆαα αααααα’ααααΎααΆαα’αα»ααααααααααααααα "ααΆααα" α’αααααααΎαααααΈααΈαααααααα½ααα αααααααα½ααααα ααααΉαααΆαααΆααααααΆααΊα ααΎαααααΆαααΆααα’αα αααααααααααααααα·ααΆααα’αα ααααΎαααααααααΎαα½αααΆα ααααα·αααΎααααααααααααααααΆαα·αααααΌαααααΆ ααΎαααααα·ααααα· SetValue α ααΈααααα½ααα ααααα½α ααΎαα αΆααααΆαααααΈααΎαααααααααΆαααααα α»ααααααΎααα·αααΆαααααΎααααααααααααααα·αα½αα ααα½ααα αααα»αααααααααΆαα½α ααα»ααααααΌααααΈαααα ααΈαααααααΆααα·ααΈαααααααΎα’αααααααΎαα‘αΎαααΌαααΆαα’αα»ααααα ααΆααααα/α αΆααα
αααα»αααΆαααΎαααα»ααααααααΎαα§αααααααα αα·αα’ααααααααΎααααααΈα‘αΎααα·αααααα·αααΆαα’αΆαα»αααααααααΆαα½αααΉαααααααΆαα’αααΈααααααααααΆαααΈαααααααα»ααα½αααααααΎαααΆαα αααα»αααΆαααΎαααα»αααααΆααααΆαα’αα»αααααααααααααααααααα½ααααα ααΈααααααα»αααααΆααααα αα ααΈαααααα ααα»α αααααΆαα αα ααΈαααααααΆαα αΆαα ααΌα ααΆααααα·αααΎααΆααααααΉααααααΆαα αααα bacchanalia ααΆαααααααααΆααα αααα»αααΆαααΎαα αααα»ααααααααα»ααα αααααΉαααΆααα·αααααααα ααΆααα·ααα αααα»ααα·αααΆαααΆαααααααααΆαααα ααααΆαααααΆαα’αα»ααααααΆααααααααα α αΎαααααα·αααΎα’αΆα ααααΎαα ααΆα αααα»αααααΆααααααααΆααααααΌαααΆαα’αα»αααααα ααΆ "ααα’αααα»α" ααααααααα ααααα·αααΎαααα»αα’αΆα α αΆαααααααα»αααΆαα ααΌα αααα ααΆαααΆαααααααααΌααααααΆααα·ααΆααααΆααΆααααααααααΎα±αααααα»ααααα ααα‘ααααΆααααααααααα
αααα»ααα·αααΆα’αααααΆα αααΎααααα’αΆα Richter α¬α’αααααααααα·ααααΆααααααααααΆαααααααΆααααα ααααΈαααααααΆαααααααΉαααααΌαααΆαααααα»ααααααΆααααα»ααααα αΆαααα αααα»αααΌαααΊααΆααΆαα»ααΌααααααΆααααααααΆααα’αα·αααααΆααααΆαααααΆααααΎααΆαα’αα»αααααααααα·ααΈα
ααΆαα α ααΆααααα»ααααα αΆαααααααα±αα CLR ααααααΆααααΆααα½αααααα»αααααΆ ααΎααααΈαααααααα’αααΈααααα½αααααααΌαααΆα ααΆααααα·ααααααααααΆαααααα½ααα ααααα½αααΆααα ααΎαααΈααα ααΆααααα»ααααααΆαααααααααααααααααΆααααΆαααααΆαααααααααΆααα αααααΆααααα ααααααΆαα αα αΆααααΆαα αααΎαα ααΎααααα»αααααΎααααΆααα’αααα αα αΆα α αΎα CLR ααΎα GC α αΎαααΆααααααα αΆααααααΎαα ααΆαα½αααααΊααα½αα±ααααααααααΆαα ααΏαααα»αα ααα·ααΆαα’αααα αα αΆαααα αααΎααα ααΎαααΆαααΈαααααα·αααααααααΎα α¬αααΆαααΈαααααα·αααΆαααΆαααΆααααααΆααααααααΎαααΆαααααααααααα ααΆααΆααα·α ααΆαα αα αΆαααΆααααα αααΎα α’αααααααααΆααΉαααααααααΆααααΈααααααα GC ααααΎαααΆαα ααΆαααααΉααααΈ ααΆααααα»ααααα αΆααααΊααΆαααααΆαααααα ααααααααααααΆααααΆααα
αααααΆαααΆαααΆααααα ααΎαααΆααα’ααααααΆααααΎ IoC containers αα·α date mappers αααααΆαααααΆαααααααα·ααααα·ααΆααααααα’ααααΎααΆααααα»ααααα αΆααααααα ααα»ααααααΆααααααΆαα·αααΆααααα½αα’αααΈααααΎαααΆαααααααΆααα αα αα·αααααααααΆαααααΆαααααΆαααααΆαα’αΆααααα αα·αααΆαα’ααΌααΈααΈααααΌααα·αααααααΆαααααα·αααΆααααα ααΊα αΆαααΆα αααΆαααααααΎαααααΌααααααααΆαα’αα»αααααααα»αααααΈααΆαααααα α’αααΈααααααααΆαααΊααΆααααααΆα - ααΆαα·αααΆαα·ααααααΆαααααααΆαα’αα»ααααα αααΎαααα
ααΆααα·αααΊααΆαααααααααααΌαα αααα»ααααααα’ααααΎαα αα αααα·ααααΆαααα»ααααα αΆααααααΎαααα·α αααααααααααααΎααααΈααααΎααΆαααΆαα½αααΆααΆααααααα’αααααΎαα ααΆααααααΆαααααΊααΆααααΆαααααααΆααα ααΆααααααΆααΆαααααααΊααΆαααααα αα·αααααα·ααΌαααααΆαα αααααααΈαααααΆαααααααα automapper ααΌα ααααΆαααααΆαα ααΆαα»ααααααααα½ααααααααααααααΌααααααααααααΆαα½αααΉααα»αααΆααααα’αΆα ααααααααα½ααα ααΆαα½αααααααααααααα·αα α ααΆααααα»ααααα αΆααα
ααΎααααααααα ααΆααααααααααΆ? ααααΆαα ααΆαα·ααα»αααΈαααααα·ααααΆααααααα·ααΆαααα½αα―αααααΎααΎααααΈαααααΎαααΌα JIT αααααα αα αααααααα·ααΈααΆααααααα½αααααΌαααΆαα α ααΆααΎαααααΌα ααΆααααΌαααΆαα ααααα (α αΎαααΆα ααααΎαααΆαααααα·αααΏααα) αα ααΎααΆαα α ααΆαααααααααΆαα ααΆααααααααααααααΌαααΆαααααααα αα·ααΈααΆααααααααααΆαα ααααααα½α α αΎα α αΎαααΆααΉααα·αααΆαααΆαα’αΌαααΆαααααΎαααΆαααααΆαααααα
αααα»αααααΈααααααΎα α’αααααα’αΆα ααααΎααΆαα ααααα JIT α αΎααααααΆααααααααΎα₯αα·ααΆααα αααααααΆαα½αααΉαααΆαα’αα»ααααααΌα ααααΆααΉαααααΆααΈ AOT ααααααΆα ααΆααααα ααααα·ααΉααααααααα½αααααααΎααααα»αααααΈαααα
αααααΆααααα
αααα»ααααα½αα’αΆα
ααααΌαααΆααααααΎααααααααααααΌα
ααΆαααααα:
α’ααααα½ααααααααΆαα»αααααααα
α»ααααααααααΆααααα»ααααα
αΆααααΆααααα·ααΌαααααΆααα»αααΆαα
αααααα ααΆααααα ααα»ααααααααααα»αααΆααααααΆαα»αααααα»α
αΆαααΆα
αααΆααα’ααααΆαα½αααΉαααααααΆααααααααα
αααα»αααΆαααααααααααααα’ααα αααααα αααααααΌαααΆααααααΆαα»ααα
ααΆααααα
ααααα»α
ααΆααααααα·ααααΆαα αααα»αααΏααααα ααα·α’αΆααααααααααΆααααΎαααΆ ααααα·αααΎααΆαα’αααΈαα½αα’αΆα α ααααα αα·ααα»ααααα»αααααΆαααααααΆααααΆα αααααΆαα½αααααααΌαααΆαααααΎα
αααααΉααα αα»α ααΆαα½αααααααΌαααΆααα·ααΆαααΆααααΆαααααααΆαααααα»αααΆαααααΎααΆαααΆαα½αααΆααααα»ααααα αΆααααΆααα»ααααααααα·ααααααΆ αααααΈααΆα’ααααα·αααααΎαα·ααΈααΆααααααααααΆαααααΎα‘αΎααααα»αααΆαα ααααααααααααααααα ααΆααα·ααα αα ααΈααααααα»αααααΆαααααα·ααΆαα‘αΎααα·αααΌαα’αααααααααα’ααααα·ααααα’αααααααααααα»ααααααΆαααΎα
α₯α‘αΌααααα’αααΈαααααΌαα ααΌααααα‘ααααΎαα§ααΆα ααααα½ααααααα’ααααΎααΆαααΊα αΆααααΆαααααααΈαααααααααααα»αααααααα»αααααΌαααααααα»ααα αααα»αααΆαααα·ααααααααααααααααααΆαααα₯αααΆαααααααααααααα½αα α’αααααΆαααΆααα’αααα»αααααααααα·α ααΌα ααααααααΆαααααΆααααΆααααααΆα
ααΆαααααΉαααΆαααααα α’αα»ααααΆαα±ααααΆαααααΆααααααα ααΆαα’αααααααααΆααα½α’ααααααααααααΆα αααα§αααααααα αα·α hydrator αααααΎαααααΆααααααααΌα ααααΆααΆαααααα αααα»ααααα½αααΆαααααα ααΎαα’αΆαααΆ αααααΆαα ααΆααΌααααααααααΉα αααααΎαααααΆαααααα αα·ααααααΆαα»αααΆαααα»αααΌαααααΆααα·ααααααα
ααΆααΆαααα α§αααΆααΆααααΆααααααααΆαααααααααααααα· αααααααα α’αΆαα» αα·αααΌαααααααααΆααααααα αα·αααααααααααααΌαααΆααααααΌαααΆααααα»αααα α’αΆααΈαααααααα ααααΆαααΆαααΆααααααααα ααΎααααΈα’αΆα ααααααααααααΈαααΆαααΆαααα αααααααΆααααΆαααΌααααααΈααααα»ααΆαα»αα ααΆααΌαα αααα»ααα½α’ααααα αααα»αααααΈαααααααΆααααΆααααααΎαα»ααα αααα»αααααΌ α¬ααααα·αααΎαα»ααααα ααααααΆα α αΆαααΆα αααααΌαα αΆααααααΎαααΆαααΌααααααΈααΆαααααΆααααΈααααΌααααΈ αααααααααααα½ααα ααΉαααααααααααΈα αααααΆααααααΎαα’αΆα ααααααααΆαααΆααααΆααααααααΆαααααααΈααααΈαα½αααΆ datafix αααα αααβααΊβααΆβα§ααΆα αααβααΈαα·αα
ααΎαα’αα»αααα, αααααΎαααΆαααααΎαααααα ααΆαααΆαα
αααα»αααΉααα·αααααααααααΌαααα ααΆααααααααΆα αααΎα α αΎααα½αααΆααΆααα ααΎ GitHub ααΆαααααααααααΆαααα α α»ααααα ααααα’αααααα α’αααα’αΆα αααα»ααα½αααΆ ααααΎααΆαα»ααααααα½αααααΎαααΈααΆαααα½αααααΆαα αα·αααΆααααααααα½αααΆ ααΌα αααααΆααΉααααααΆαααααααααΈααααα’αααα αααα»αααΉαααααααααααΌααααα·ααΈααΆαααααααααΌααΈαααα»αααααααααααα αα hydrator αααααααααααΆααΏα ααΈ hydrator αααααααααααΆααΊαα
αααααα·ααααΆααΆαααΌα ααΆααααααα αα·ααΈααΆαααααααααΌααα½αααΆαααΌααααααααΎαααααααααα·ααααΆαααααΌαααααΆαα αααααΆαα LINQ ααΊααΆα’αααααα αα·ααααααα·ααααΆααΌαααααΆααααα hydrator αααααααΎααΆαααααΎαα»ααα ααΆααααα·ααααΌαααααΆααα·αααααα α αΎαααααααααααααΆαα½αααΌααΈα§αααααααα (αααααΆαααα»αααΆαααΆαααααααΆαααΌααααααααΆα LINQ αααααΆαααααααααα)α αααααΆαααα ααΌααααΌαααΆααααααΌααα αα·ααΈααΆααααα hydration α αααα α αΎααααααααααΌααααΌαααΆαααααααα αααααααααααααα·αααααααΌαααααΆααα’αααααΆαα
"ααΏα" (αα»αααααααΏααααα»αααΆααΆααα·αααα»)α
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;
}
ααΌα αααααΎαα’αΆα ααΎαααΎα ααΆααααααΌααα·αα·αααααααααΆααααααααααααααα· setter ααααΌαααΆαααααΎ - lambdas α ααααααααα α ααΆ setter entity α αααααΎααααααΌαααΆααααααα
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 α αΎααα·αα·αααααΎαααΆαα’αα»ααααα α αΎαααααΆαα ... (spoiler - ααααα·ααααααΆααααααααααΉαααααΌααα ααααααΆααααα’α·αααΆααα ααΆαααααα)
ααΎααΎαααΎαα’αααΈαα
ααΈααα? αα·ααΈααΆααααααααααα½ααααααααααΎαα»ααααα Fast αααααα
ααΆααΊαααΆααααα»αααΆαααααααΆααααααΎαααααΆααα’ααααΆααα·ααΈααΆααααααααααΆααα»αααααααΊαα αααααΆααΆααα·ααααααΆααααΆααααΆααααα
αα αα·αααααΏαααααΆαααΆαα αααααΆααα·αααα ααΆαα’αα»αααααααααΈαααααααααα’αΆα αα·αααΎαααΆααααααααΎαα·ααΈααΆααααα LINQ αααααΆααααααααααΆααααΆαααααααααααΈαααααααααα’αΆα
ααααΎαα
ααΆα αααα»ααα
αα·α ααΆαααααααααα·αααΆααααΆαα
αααΎαα ααΆααα»αααααΆααΊααααΆααα ααααααα·αααααΆααααααΌαααΆαα½αααΉαααααααααααααΆααααΆαααααααΆαα ααΆααα»αααααΆαααα½ααααααΊαα
αααα»αααΆαααααααΆαα ααΆαα½αααΉα LINQ ααΆααΆαααααΏαααΊαααΆα 4 αα
200 αα ααΆααΆαααααΆαα
αααΎααα
ααΎααΆαααααααΆαααΌα
ααααΆα
ααααΎα±ααααΆαααααα
αααα»αβαα·αβααΏβαααααβαααα»αβαα ααα»ααααβααααΆααβααΆαβαααβαα
βααα αα·αααβαα½αβααΆαααΆαβααααβααΎαβαα·αβααΏβαααααβαααα»α α¬βααΌαβααααβαααα»α -
αααααΆααααααααααΆαααααΎαααααα‘αΎααα·αα
ααα
ααααΈααααα·ααααΆαα αα
αααααααΎααΆααααα»ααααα
αΆαααα
αααα»ααα ααααΆα αα·αα
αΆαααΆα
αααΆααα
αααααα·α
ααααα - LINQ ααΉααααΈα’ααααα·αααΆαααΆααααα
αααΎαα ααααααΆαααΆααααα αα
αααα»ααα·ααΈααΆααααααααα»αααααααααααΆαααΆαααΆααααααΎαααααα·αααααΆα α’αααα’αΆα
αααααΆαα»αααΆααααα»ααααα
αΆαααααα»αααααααααΆα’ααααααααΎαααααΌα αα·αα’αααα
αααααααααα·ααΌ ααααααααΆααααααΉααααααααΌααααααα·ααααΆ "ααΏα" α αα·ααΈαααα’αααα’αΆα
αααααΆααΆαααΆααααΆαααααααααααΆααααα»ααααα
αΆαα αα·αααααΏααααααααα·ααΈα
αααααΌααααααΆααα
ααΈαααα ααααΆααααΆααα’αΆα
αα·αα·αααααΎαααΆααααααααααα»αααΈαααα
PSα ααΌααα αααα»αααΆαααααΎαααααααααΎ IoC α αΎααα αααα»αααααααααααΆααααΎααΆαααααΆαααΆα αααΆααααΆααα ααΆααα·αααΊααΆαα αααα»αααΆαα’αα»ααααα α»αααααααααα»αααΆαααΆααα ααααΌααααααΆααΆααα’αααααα’αΆα αααααΆαααααααΆαα’αα»αααα αα·αααααΎα±αααααααααα·αααΆαααααααααααΆαα
PPS: ααΌαα’ααα»ααααα’αααααααΎααααΆαα
PPPS: ααΌαα’ααα»ααααα’αααα’αΆαααααααα
αααααααΆαααΆαααααααααααΆαααααααααα
ααΆααααααα·αααΆααα
ααΆα αααα»ααααααΆααα―ααααααΆα αα·αααΆαααΆααααα½αα ααΆαααΌαβααβααβαααα αΆαβαα»αβααΆβααΆαβα
ααβααΆαβα
αααΎα ααα»ααααβαααα»αβααβααΆαβαα·ααααβααβαα·α
αΆαααΆα αααα»ααα»αααΆααααΆααααα½α
α
ααααα: www.habr.com