рдбрд╛рдпрдиреЗрдорд┐рдХрдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдирд╛

рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, AOP рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдИ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдЧрд┐рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ (AOP рдкрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣рд╛рдБ mezastel рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ )ред рдЖрдЬ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдХреБрдЫ рдФрд░ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВрдЧреЗред


рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдк рдХрд░, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛрдб рдХреЛ рдХрдИ рдмрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рд╣рд╛рде рдореЗрдВ рдХреЛрдИ рднреА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдирд╣реАрдВ рдерд╛)ред рдФрд░ рдореИрдВ рдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдХреЙрд▓ рдХреЛ рдорд╛рдкрдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рдпрд╛ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдЯреВрд▓реНрд╕ рдХреА рдорджрдж рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЛ рдиреНрдпреВрдирддрдо рд░рд╛рд╢рд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рдП, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдк рдХреЛрдб рднреА рдбрд╛рд▓реЗрдВред
рдФрд░ рдлрд┐рд░ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдмрдВрдз рдХреЛ "рд╕рдорд░реНрдерди" рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрддрд┐рдо рд╕рджрд╕реНрдп рдХреЛ рдмреБрд▓рд╛рддреЗ рд╕рдордп, рдЖрдк рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛрдб рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд▓реНрджреА рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛! рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдПрдХ рдбреЛрдореЗрди рдореЙрдбрд▓ рд╣реИ:
using System;
using System.Threading;

namespace DynamicWrapperTest
{
public class Payment
{
public Guid Id { get ; set ; }
public Guid UserId { get ; set ; }
public Guid OperationId { get ; set ; }
public decimal Amount { get ; set ; }
public string Description { get ; set ; }
}

public class PaymentService
{
private readonly Random rand = new Random (Environment.TickCount);

public void MakePayment(Payment payment)
{
Thread.Sleep( TimeSpan .FromSeconds(rand.Next(5)));
}
}
}


* This source code was highlighted with Source Code Highlighter .

рдЕрдм рд╣рдо рдореВрд▓ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди, рдЖрджрдд рд╕реЗ рдмрд╛рд╣рд░, рдЗрд╕рдиреЗ рддреБрд░рдВрдд рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдиреАрдВрд╡ рд░рдЦреА):
using System;
using System.Dynamic;

namespace DynamicWrapperTest
{
public class DynamicWrapper : DynamicObject
{
private readonly object source;

public DynamicWrapper( object source)
{
this .source = source;
}

public override bool TryInvokeMember(InvokeMemberBinder binder, object [] args, out object result)
{
var methodInfo = source.GetType().GetMethod(binder.Name);
if (methodInfo != null )
{
Func< object , object [], object > func = (s, a) => methodInfo.Invoke(s, a);

result = MethodCall(func, source, args);

return true ;
}

result = null ;

return false ;
}

protected virtual object MethodCall(Func< object , object [], object > func, object src, object [] args)
{
return func(src, args);
}
}
}


* This source code was highlighted with Source Code Highlighter .

рдЕрдЧрд▓рд╛ рд╣рдорд╛рд░реА рдЕрдВрддрд┐рдо рд╡рд╕реНрддреБ рд╣реИ, рдЬреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдк рд▓реЗрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрд╡рд░рдг рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рди рдХрд┐ рдкреНрд░реЙрдХреНрд╕реА рдкреИрдЯрд░реНрди:
using System;
using System.Diagnostics;
using System.IO;

namespace DynamicWrapperTest
{
public class ProfilerWrapper : DynamicWrapper
{
private readonly int iterationCount;
private readonly TextWriter output;
private readonly Stopwatch stopwatch = new Stopwatch();

public ProfilerWrapper( object source, int iterationCount, TextWriter output)
: base (source)
{
this .iterationCount = iterationCount;
this .output = output;
}

protected override object MethodCall(Func< object , object [], object > func, object src, object [] args)
{
object result = null ;

for ( var i = 0; i < iterationCount; i++)
{
stopwatch.Restart();

result = base .MethodCall(func, src, args);

stopwatch.Stop();
output.WriteLine( "Step #{0} : Method call in {1} ms" , i + 1, stopwatch.Elapsed.TotalMilliseconds);
}

return result;
}
}
}


* This source code was highlighted with Source Code Highlighter .

рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб:
using System;

namespace DynamicWrapperTest
{
class Program
{
static void Main( string [] args)
{
var payment = new Payment
{
Id = Guid .NewGuid(),
UserId = Guid .NewGuid(),
OperationId = Guid .NewGuid(),
Amount = 500m,
Description = "Feed developers plz!!!"
};

var paymentService = new PaymentService();
dynamic dynamicWrapper = new ProfilerWrapper(paymentService, 10, Console .Out);

dynamicWrapper.MakePayment(payment);

Console .ReadKey();
}
}
}

* This source code was highlighted with Source Code Highlighter .

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


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


All Articles