рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред PostSharp

рдкрд╣рд▓реВ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


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



PostSharp


PostSharp рдлреНрд░реЗрдорд╡рд░реНрдХ .NET рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред PostSharp, рдЕрдкрдиреЗ рдХрдИ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреЛрд╕реНрдЯ-рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ MSIL (Microsoft рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИред

PostSharp рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рддрд░реАрдХреЛрдВ, рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред





рдЙрджрд╛рд╣рд░рдг 1:

using System; using PostSharp.Aspects; namespace HelloAspects { class Program { private static void Main() { hello(); } [SayGoodbye] private static void hello() { Console.WriteLine("Hello!"); } } [Serializable] class SayGoodbyeAttribute : OnMethodBoundaryAspect { public override void OnExit(MethodExecutionArgs args) { Console.WriteLine("Goodbye."); } } }
      
      





рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрдВрд╕реЛрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛:



  рдирдорд╕реНрдХрд╛рд░!
 рдирдорд╕реНрдХрд╛рд░ред 


рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ SayGoodbye рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрд▓реЛ () рдкрджреНрдзрддрд┐ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдмрджрд▓ рдЧрдпрд╛ред



OnExit рд╡рд┐рдзрд┐ рдХреЛ рд╕рд▓рд╛рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ OnExit рдХреЛ рдЕрдВрддрддрдГ рдмреНрд▓реЙрдХ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЙрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдмрд╛рдж рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, OnMethodBoundaryAspect рд╡рд░реНрдЧ рддреАрди рдФрд░ рдЯрд┐рдкреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:



рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЙрджрд╛рд╣рд░рдг 1 рдкреЛрд╕реНрдЯрд╢рд╛рд░реНрдк рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдХрдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рд╛рдн рд╣реИред рдЙрджрд╛рд╣рд░рдг 2 AOP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЗрдЦрдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред



рдЙрджрд╛рд╣рд░рдг 2:

 using System; using System.Diagnostics; using PostSharp.Aspects; namespace HelloAspects { class Program { private static void Main() { Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); hello(); } [Trace] private static void hello() { Console.WriteLine("Hello!"); } } [Serializable] public class TraceAttribute : OnMethodBoundaryAspect { public override void OnEntry(MethodExecutionArgs args) { Trace.WriteLine(string.Format("Entering {0}.{1}.", args.Method.DeclaringType.Name, args.Method.Name)); } public override void OnExit(MethodExecutionArgs args) { Trace.WriteLine(string.Format("Leaving {0}.{1}.", args.Method.DeclaringType.Name, args.Method.Name)); } } }
      
      







рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ AOP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдлрд╛рдпрджрд╛ рд╣реИ? рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк AOP рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ Trace.WriteLine рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ ... AOP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕ рдХреНрд░реЙрд╕-рдХрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ (рдкрд╣рд▓реВ) рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред



рдмреЗрд╢рдХ, OnMethodBoundaryAspect рд╕реЗ рдкрд░реЗ PostSharp рдХреЗ рдкрд╣рд▓реВ рд╣реИрдВ:



PostSharp .NET рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдореЗрдВ AOP рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИред AOP OOP рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ (DRY рд╕рд┐рджреНрдзрд╛рдВрдд - рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ рдирд╣реАрдВ) рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред



PS рдпрд╣ рдкреЛрд╕реНрдЯ рдореИрдВрдиреЗ рд╕рдВрд╕реНрдерд╛рди рдореЗрдВ рдХрд┐рдП рдЧрдП рдЕрдзреНрдпрдпрди рдХреЗ рдХрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд┐рдЦреА рдереАред



All Articles