PostSharpред рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрди

рдЫрд╡рд┐ рдЬрдм рдореИрдВрдиреЗ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдПрдХ рдХрдВрдкрдиреА рдХреЛ рд╕рд▓рд╛рд╣ рджреА рдереА, рддреЛ рд╣рдордиреЗ рдЖрдВрддрд░рд┐рдХ рдПрд╕рдУрдП рдврд╛рдВрдЪреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдереА рдЬрд┐рд╕реЗ рдЙрджреНрдпрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдврд╛рдВрдЪрд╛ рдХреЗрд╡рд▓ рдирд╛рдо рд╕реЗ SOA рдерд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реЛрдордЧреНрд░реЛрди, рдФрд░ рд╕рдмрд╕реЗ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ, рдпрд╣ рдЖрдИрдЯреА рд╡рд┐рднрд╛рдЧ рдХреЗ рдкреНрд░рдореБрдЦ рдХрд╛ "рдкрд╕рдВрджреАрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ" рдерд╛ред рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдерд╛ рдФрд░ рд╕рдВрджрд┐рдЧреНрдз рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдФрд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдпрд╛ рддреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реА рдЯреАрдо рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдмреЗрд╣рдж рдирд┐рд░рд╛рд╢ рдереАред рд▓реЗрдХрд┐рди, рдПрдХ рд╕рд▓рд╛рд╣рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдХреНрд╕рд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдХрд╛ рдЙрддреНрдкрд╛рдж "рдЦрд░рд╛рдм" рд╣реИ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЦреБрдж рдореЗрдВ рдЕрдкрдирд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡рд░реНрд╖реЛрдВ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм рдЙрд╕ рдХрдВрдкрдиреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдРрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗред рддрдм рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред

рдЗрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ

рдЙрд╕реА рд╕рдордп, рд╣рдореЗрдВ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рджреБрд░реНрдШрдЯрдирд╛рдПрдВ рд▓рдЧрд╛рддрд╛рд░ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рдпрд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдореЗрдВ рдЗрд╕ рдЧрдбрд╝рдмрдбрд╝ рдФрд░ рдЕрд░рд╛рдЬрдХрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдерд╛, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХрдВрдкрдиреА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрддрд░ рдХрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕ рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдПрд░рд░ рдЯреНрд░реИрдкрд┐рдВрдЧ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рднреА "рдЧрдВрджрд╛ рдЪреАрдЬреЛрдВ" рдХреЛ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдореИрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА рдердХ рдЬрд╛рддрд╛ рдерд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реА рдЪреЗрдХ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдФрд░ рдЗрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдордд рдХрд░реЛ: рдЕрдиреНрдпрдерд╛ рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдЦреЛ рджреЗрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреБрд░рд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВ , рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ: рдЖрдк рд▓реЗрди-рджреЗрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PostSharp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдк рдШрд░-рдирд┐рд░реНрдорд┐рдд рдврд╛рдВрдЪреЗ рдкрд░ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдмрдирд╛рдПрдВ рдпрд╛ рдирд╣реАрдВред рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ OnMethodBoudaryAspect рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓реЗрдирджреЗрди рд╕рдорд░реНрдерди рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЧрд╛:
[Serializable] public class TransactionScopeAttribute : OnMethodBoundaryAspect { [NonSerialized] private ICharityService _charityService; private string _methodName; private string _className; public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) { _className = method.DeclaringType.Name; _methodName = method.Name; } public override void RuntimeInitialize(System.Reflection.MethodBase method) { // in practice, the begin/rollback/commit might be in a more general service // but for convenience in this demo, they reside in CharityService alongside // the normal repository methods _charityService = new CharityService(); } public override void OnEntry(MethodExecutionArgs args) { _charityService.BeginTransaction(); } public override void OnException(MethodExecutionArgs args) { _charityService.RollbackTransaction(); var logMsg = string.Format("exception in {0}.{1}", _className, _methodName); // do some logging } public override void OnSuccess(MethodExecutionArgs args) { _charityService.CommitTransaction(); } } 


рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИ рдФрд░ рдореЗрд░реЗ рдкреБрд░рд╛рдиреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рдирд╣реАрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓реЗрди-рджреЗрди рд░реЛрд▓рдмреИрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЛрдб рдореЗрдВ рдЬреЛ onException рдЙрдард╛рддрд╛ рд╣реИ)ред рдЖрдкрдХреЛ рдмрд╕ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЖрдкрдХреЛ [TransactionScope] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд▓реЗрди-рджреЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдПрдХ рд╕рд░рд▓ рдкрд╣рд▓реВ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝ рд╢реБрд░реВ / рдкреНрд░рддрд┐рдмрджреНрдз / рд░реЛрд▓рдмреИрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЦреБрдж рдХреА рд░рдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред рд╣рдордиреЗ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╕рдорд╛рди рдХреЛрдб рднреА рдирд┐рдХрд╛рд▓рд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдпрд╛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬрд╣рд╛рдВ рдКрдкрд░ рдХреЛрдб рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рд╣реИред рдКрдкрд░ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ, рд╢реБрд░реБрдЖрдд / рдХрдорд┐рдЯ / рд░реЛрд▓рдмреИрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдбрдореА рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЕрдВрддрд┐рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИред рдпрджрд┐ рдЖрдк ADO.NET рдХрдиреЗрдХреНрд╢рди, рдЬреИрд╕реЗ SqlConnection, ODBC, Oracle, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓реЗрдирджреЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕рдорд░реНрдерд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП TransactionScope (рдкрд╣рд▓реВ рдирд╛рдо рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ) рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЗрдирджреЗрди рд╕рдорд░реНрдерди рдХрд╛ рдореВрд▓ рдкрд╣рд▓реВ рд╣реИ, рддреЛ рдЖрдЗрдП рдЕрдкрдиреЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛ рд▓рдЧрд╛рддрд╛рд░ рдЯреВрдЯ рд░рд╣реА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЪрдХреНрд░ рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рдлрд▓ рд╣реЛрдиреЗ рддрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдкреНрд░рдпрд╛рд╕ рд╕реНрдерд┐рд░ рд░рд╣реЗрдВ рдФрд░ рдПрдХ рдЕрдВрддрд╣реАрди рдЪрдХреНрд░ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдПрдХ DataException рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдЕрдкрд╡рд╛рдж рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрд╢рди рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕ рдмреЗрдХрд╛рд░ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдРрд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ:
 [Serializable] public class TransactionScopeAttribute : MethodInterceptionAspect { [NonSerialized] private ICharityService _charityService; [NonSerialized] private ILogService _logService; private int _maxRetries; private string _methodName; private string _className; public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) { _methodName = method.Name; _className = method.DeclaringType.Name; } public override void RuntimeInitialize(System.Reflection.MethodBase method) { _charityService = new CharityService(); _logService = new LogService(); _maxRetries = 4; // you could load this from XML instead } public override void OnInvoke(MethodInterceptionArgs args) { var retries = 1; while (retries <= _maxRetries) { try { _charityService.BeginTransaction(); args.Proceed(); _charityService.CommitTransaction(); break; } catch (DataException) { _charityService.RollbackTransaction(); if (retries <= _maxRetries) { _logService.AddLogMessage(string.Format( "[{3}] Retry #{2} in {0}.{1}", _methodName, _className, retries, DateTime.Now)); retries++; } else { _logService.AddLogMessage(string.Format( "[{2}] Max retries exceeded in {0}.{1}", _methodName, _className, DateTime.Now)); _logService.AddLogMessage("-------------------"); throw; } } catch (Exception ex) { _charityService.RollbackTransaction(); _logService.AddLogMessage(string.Format( "[{3}] {2} in {0}.{1}", _methodName, _className, ex.GetType().Name, DateTime.Now)); _logService.AddLogMessage("-------------------"); throw; } } _logService.AddLogMessage("-------------------"); } } 


рд╣рд╛рдБ, рдпрд╣ рдереЛрдбрд╝рд╛ рднрдпрд╛рд╡рд╣ рд▓рдЧрддрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рдЪрд▓реЛ рдЗрд╕реЗ рдЕрд▓рдЧ рд▓реЗ рд▓реЛред CompileTimeInitialize рдФрд░ RuntimeInitialize рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рд▓реЛрдЧреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ: рд╡реЗ рд╕рд┐рд░реНрдл рдХрдХреНрд╖рд╛ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдпрд╛рдж рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
OnInvoke рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЪрд╛рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:

рдЕрдкрдиреЗ рд╕рд░рд▓ рдЖрд╡реЗрджрди рдореЗрдВ, рдореИрдВрдиреЗ CharityService рд╕реЗрд╡рд╛ рдмрдирд╛рдИ, рдЬреЛ 50% рдорд╛рдорд▓реЛрдВ рдореЗрдВ DataException рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╢реЗрд╖ 50% рдореЗрдВ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рдЧрднрдЧ 50 рдореЗрдВ рд╕реЗ 1 рдХреЙрд▓ рдореЗрдВ, рдпрд╣ рдПрдХ DataException рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдиреНрдпред рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓реЙрдЧ рд╡рд┐рдВрдбреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЖрд░рдВрдн, рд░реЛрд▓рдмреИрдХ рдФрд░ рдХрдорд┐рдЯ рдХреЙрд▓ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдиреБрдорддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ рдПрдХ DataException рдирд╣реАрдВ рдерд╛ред

рдЗрд╕ рдкрд╣рд▓реВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдХреБрдЫ рдордЬрдмреВрддреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реВ рдХреЛрдб рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рдмрдВрдзрдиреАрдп рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд░рд┐рдлрд▓реЗрдХреНрдЯрд┐рдВрдЧ рд╣реЛрдЧрд╛: рд╡рд░реНрдЧреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди, рдФрд░ рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рдиред рдПрдХ рд╕реВрддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрджрд░реНрдн:

Source: https://habr.com/ru/post/In126624/


All Articles