
Performans aspect, bir web uygulamasında performans ile ilgili işlemlerin merkezi bir noktadan yönetilmesini sağlayan bir tasarım kalıbıdır.
Performans aspect, Aspect Oriented Programming (AOP) ile uygulanabilir. AOP, kesişen ilgiler (cross cutting concerns) olarak adlandırılan, uygulamanın farklı katmanlarında ortak olarak kullanılan işlemlerin merkezi bir noktadan yönetilmesini sağlayan bir programlama paradigmasıdır.
Performans aspect, AOP’nin bir uygulaması olarak, performans ile ilgili işlemleri yönetir.
Örneğin, bir web sitesinde sayfa yükleme süresini azaltmak, bellek kullanımını optimize etmek, önbellekleme yapmak gibi işlemler performans aspect ile gerçekleştirilebilir.
Performans aspect, genellikle web uygulamalarının başlatılması sırasında veya belirli metotların çağrılması sırasında devreye girer.
Performans aspect, Interceptor adı verilen yapılarla uygulanabilir. Interceptor, metot çağrımları sırasında araya girerek kesişen ilgileri işletmemizi ve yönetmemizi sağlamaktadır.
public class PerformanceAspect : MethodInterception { private readonly int _interval; private readonly Stopwatch _stopwatch; private readonly IMailHelper? _mailHelper; private readonly bool _sendMail; private readonly bool _debug; private readonly string _projectName; public PerformanceAspect(int interval, bool sendMail, bool debug, string projectName) { _interval = interval; _sendMail = sendMail; _debug = debug; _projectName = projectName; _mailHelper = ServiceTool.ServiceProvider!.GetService<IMailHelper>(); _stopwatch = ServiceTool.ServiceProvider!.GetService<Stopwatch>()!; } protected override void OnBefore(IInvocation invocation) { _stopwatch.Start(); } protected override void OnAfter(IInvocation invocation) { if (_stopwatch.Elapsed.TotalSeconds > _interval) { if (_sendMail) { if (invocation.Method.DeclaringType != null) { SendPerformanceMail(_projectName, invocation.Method.DeclaringType.FullName!, invocation.Method.Name, _stopwatch.Elapsed.TotalSeconds + " Saniye" ); } } if (_debug) { if (invocation.Method.DeclaringType != null) { Debug.Write( $"Performance:{invocation.Method.DeclaringType.FullName}.{invocation.Method.Name} : {_stopwatch.Elapsed.TotalSeconds} Saniye"); } } } } private void SendPerformanceMail(string projectName, string serviceName, string methodName, string timeSpan) { var client = new HttpClient(); using HttpResponseMessage response = client.GetAsync("https://rifatakarca.com/mailing/performance.html").Result; using HttpContent content = response.Content; string mailBody = content.ReadAsStringAsync().Result; if (!string.IsNullOrEmpty(mailBody)) { mailBody = mailBody.Replace("#PROJECTNAME#", projectName); mailBody = mailBody.Replace("#SERVICENAME#", serviceName); mailBody = mailBody.Replace("#METHODNAME#", methodName); mailBody = mailBody.Replace("#TIMESPAN#", timeSpan); _mailHelper!.SendEmail("rifatakarca@gmail.com", projectName + " Performans Raporu", mailBody, "Rifat Akarca"); } } }