ืžืืžืจ ืœื ืžื•ืฆืœื— ืขืœ ื”ืืฆืช ื”ืฉืชืงืคื•ืช

ืžื™ื“ ืืกื‘ื™ืจ ืืช ื›ื•ืชืจืช ื”ืžืืžืจ. ื”ืชื•ื›ื ื™ืช ื”ืžืงื•ืจื™ืช ื”ื™ื™ืชื” ืœืชืช ืขืฆื•ืช ื˜ื•ื‘ื•ืช ื•ืืžื™ื ื•ืช ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื”ืฉื™ืžื•ืฉ ื‘ื”ืฉืชืงืคื•ืช ื‘ืืžืฆืขื•ืช ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ืืš ืžืฆื™ืื•ืชื™ืช, ืืš ื‘ืžื”ืœืš ื”ื‘ื ืฆ'ืžืจืงื™ื ื’ ื”ืชื‘ืจืจ ืฉื”ืฉืชืงืคื•ืช ืื™ื ื” ืื™ื˜ื™ืช ื›ืžื• ืฉื—ืฉื‘ืชื™, 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, ื™ืฉ ื™ื•ืชืจ ืืฉืคื” ื‘ืขืจืš ื‘ืื•ืชื• ืงื ื” ืžื™ื“ื”.

ืžึฐืขื•ึผื“ื›ึผึธืŸ

ืœื ื”ืืžื ืชื™ ืœืžืจืื” ืขื™ื ื™ื™, ืื‘ืœ ื—ืฉื•ื‘ ืžื›ืš, ื”ืงื•ืœื’ื” ืฉืœื ื• ืœื ื”ืืžื™ืŸ ืœื ืœืขื™ื ื™ ื•ืœื ืœืงื•ื“ ืฉืœื™ - ื“ืžื™ื˜ืจื™ ื˜ื™ื›ื•ื ื•ื‘ 0x1000000. ืœืื—ืจ ืฉื‘ื“ืงืชื™ ืคืขืžื™ื™ื ืืช ื”ืคืชืจื•ืŸ ืฉืœื™, ื”ื•ื ื’ื™ืœื” ื‘ืฆื•ืจื” ืžื‘ืจื™ืงื” ื•ื”ืฆื‘ื™ืข ืขืœ ืฉื’ื™ืื” ืฉืคืกืคืกืชื™ ืขืงื‘ ืžืกืคืจ ืฉื™ื ื•ื™ื™ื ื‘ื™ื™ืฉื•ื, ืจืืฉื•ื ื™ ืขื“ ืกื•ืคื™. ืœืื—ืจ ืชื™ืงื•ืŸ ื”ื‘ืื’ ืฉื ืžืฆื ื‘ื”ื’ื“ืจืช Moq, ื›ืœ ื”ืชื•ืฆืื•ืช ื ืคืœื• ืขืœ ืžืงื•ืžืŸ. ืœืคื™ ืชื•ืฆืื•ืช ื”ื‘ื“ื™ืงื” ื”ื—ื•ื–ืจืช, ื”ืžื’ืžื” ื”ืขื™ืงืจื™ืช ืœื ืžืฉืชื ื” - LINQ ืขื“ื™ื™ืŸ ืžืฉืคื™ืขื” ืขืœ ื”ื‘ื™ืฆื•ืขื™ื ื™ื•ืชืจ ืžืืฉืจ ื”ืฉืชืงืคื•ืช. ืขื ื–ืืช, ื–ื” ื ื—ืžื“ ืฉื”ืขื‘ื•ื“ื” ืขื ื”ื™ื“ื•ืจ Expression ืœื ื ืขืฉื™ืช ืœืฉื•ื•ื, ื•ื”ืชื•ืฆืื” ื ืจืื™ืช ืœืขื™ืŸ ื”ืŸ ื‘ื”ืงืฆืื” ื•ื”ืŸ ื‘ื–ืžืŸ ื”ื‘ื™ืฆื•ืข. ื”ื”ืฉืงื” ื”ืจืืฉื•ื ื”, ื›ืืฉืจ ืฉื“ื•ืช ืกื˜ื˜ื™ื™ื ืžืื•ืชื—ืœื™ื, ื”ื™ื ื‘ืื•ืคืŸ ื˜ื‘ืขื™ ืื™ื˜ื™ ื™ื•ืชืจ ืขื‘ื•ืจ ื”ืฉื™ื˜ื” ื”"ืžื”ื™ืจื”", ืื‘ืœ ืื– ื”ืžืฆื‘ ืžืฉืชื ื”.

ืœื”ืœืŸ ื”ืชื•ืฆืื” ืฉืœ ื”ืžื‘ื—ืŸ ื”ื—ื•ื–ืจ:

ืžืืžืจ ืœื ืžื•ืฆืœื— ืขืœ ื”ืืฆืช ื”ืฉืชืงืคื•ืช

ืžืกืงื ื”: ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ื”ืฉืชืงืคื•ืช ื‘ืืจื’ื•ืŸ, ืื™ืŸ ืฆื•ืจืš ืžื™ื•ื—ื“ ืœื ืงื•ื˜ ื‘ื˜ืจื™ืงื™ื - LINQ ืชืื›ืœ ื™ื•ืชืจ ืืช ื”ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื•ืช. ืขื ื–ืืช, ื‘ืฉื™ื˜ื•ืช ืขื•ืžืก ื’ื‘ื•ื” ื”ื“ื•ืจืฉื•ืช ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”, ืืชื” ื™ื›ื•ืœ ืœื—ืกื•ืš ื”ืฉืชืงืคื•ืช ื‘ืฆื•ืจื” ืฉืœ ืืชื—ื•ืœื™ื ื•ืžื”ื“ืจื™ื ืฉืœ ื ืฆื™ื’, ืฉื™ืกืคืงื• ืื– ื”ื™ื’ื™ื•ืŸ "ืžื”ื™ืจ". ื›ืš ืชื•ื›ืœื• ืœืฉืžื•ืจ ื”ืŸ ืขืœ ื’ืžื™ืฉื•ืช ื”ื”ืฉืชืงืคื•ืช ื•ื”ืŸ ืขืœ ืžื”ื™ืจื•ืช ื”ื™ื™ืฉื•ื.

ืงื•ื“ ื”ื”ืฉื•ื•ืื” ื–ืžื™ืŸ ื›ืืŸ. ื›ืœ ืื—ื“ ื™ื›ื•ืœ ืœื‘ื“ื•ืง ืฉื•ื‘ ืืช ื“ื‘ืจื™:
ื‘ื“ื™ืงื•ืช HabraReflection

ื .ื‘.: ื”ืงื•ื“ ื‘ืžื‘ื—ื ื™ื ืžืฉืชืžืฉ ื‘-IoC, ื•ื‘ืžื“ื“ื™ื ื”ื•ื ืžืฉืชืžืฉ ื‘ืžื‘ื ื” ืžืคื•ืจืฉ. ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื‘ื™ื™ืฉื•ื ื”ืกื•ืคื™ ื ื™ืชืงืชื™ ืืช ื›ืœ ื”ื’ื•ืจืžื™ื ืฉื™ื›ื•ืœื™ื ืœื”ืฉืคื™ืข ืขืœ ื”ื‘ื™ืฆื•ืขื™ื ื•ืœืขืฉื•ืช ืืช ื”ืชื•ืฆืื” ืจื•ืขืฉืช.

PPS: ืชื•ื“ื” ืœืžืฉืชืžืฉ ื“ืžื™ื˜ืจื™ ื˜ื™ื›ื•ื ื•ื‘ @0x1000000 ืขืœ ื’ื™ืœื•ื™ ื”ื˜ืขื•ืช ืฉืœื™ ื‘ื”ื’ื“ืจืช Moq, ืฉื”ืฉืคื™ืขื” ืขืœ ื”ืžื“ื™ื“ื•ืช ื”ืจืืฉื•ื ื•ืช. ืื ืœืžื™ืฉื”ื• ืžื”ืงื•ืจืื™ื ื™ืฉ ืžืกืคื™ืง ืงืืจืžื”, ื‘ื‘ืงืฉื” ืชืื”ื‘ื•. ื”ืื™ืฉ ืขืฆืจ, ื”ืื™ืฉ ืงืจื, ื”ืื™ืฉ ื‘ื“ืง ืฉื•ื‘ ื•ื”ืฆื‘ื™ืข ืขืœ ื”ื˜ืขื•ืช. ืื ื™ ื—ื•ืฉื‘ ืฉื–ื” ืจืื•ื™ ืœื›ื‘ื•ื“ ื•ืื”ื“ื”.

PPPS: ืชื•ื“ื” ืœืงื•ืจื ื”ืžื•ืงืคื“ ืฉื”ื’ื™ืข ืœืชื—ืชื™ืช ื”ืกื’ื ื•ืŸ ื•ื”ืขื™ืฆื•ื‘. ืื ื™ ื‘ืขื“ ืื—ื™ื“ื•ืช ื•ื ื•ื—ื•ืช. ื”ื“ื™ืคืœื•ืžื˜ื™ื” ืฉืœ ื”ืžืฆื’ืช ืžื•ืชื™ืจื” ื”ืจื‘ื” ืœืจืฆื•ื™, ืื‘ืœ ืœืงื—ืชื™ ืืช ื”ื‘ื™ืงื•ืจืช ื‘ื—ืฉื‘ื•ืŸ. ืื ื™ ืžื‘ืงืฉ ืืช ื”ืงืœื™ืข.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”