.Net Castle Windsor Interceptor Logging

24.4.2019

Bir önceki yazdımda Castle Windsor konusunu anlatmıştım.
Örnek olarak repositoryleri container içerisinde ekledik diye düşünmüştük. Bu repositorylerde cağırılan methodların arasında girip transaction, exception durumlarında loglama yapmak isteyebilirim.
 

Bunun için Castle Windsor Dynamic Proxy içerisinde "IInterceptor" interface'ini kullanıyorum.
Bu arayüzü implemente etmek istediğimde benden "Intercept" adında "IInvocation" parametresi veren bir method isteyecektir. Bu method içerisinde "invocation.Proceed()" methodu cağırılmadan önce aksiyon alınmayacaktır.

public class RepositoryInterceptor : IInterceptor
   {
	 public void Intercept(IInvocation invocation)
        {
	    try
            {      
		//işlem öncesini logla
                invocation.Proceed();
            }
            catch (Exception ex)
            {
		//exception log
	    }
	     finally
            {
		//transaction log
	     }
	}
		
}

Her repository işleminde repository işleminde transaction logu alıp, exception alınması durumunda onu da loglayabilecek alanlarımızı oluşturduk. invocation üzerinden "Arguments" propertysine giderek parametreleri alabilirsiniz.
 

Bu repository işlemlerinde Expression'ları da serialize etmek isterseniz eğer nuget paketi olan "Serialize.Linq" öneriyorum. Argument is a Expression ise Linq ile serialize et. Değilse normal bir json serializer(newton) ile serialize edebilirsiniz.

Transaction, Exception loglama yaparken "invocation.Method.Name" method ismini, "invocation.TargetType.AssemblyQualifiedName" ile instance alınmış repository bilgisine ulaşabilirsiniz. Oluşturduğumuz interceptor'ın register işlemini yapmazsak eğer her hangi bir aksiyon arasına girmeyecektir.

Bir önceki Castle Windsor yazımda "RepositoryDependecyInstaller" classı içerisinde register işlemi yapmıştık.
Şimdi bu yaptığımız register işlemine interceptor ekleyelim.

public class RepositoryDependecyInstaller : IWindsorInstaller
 {
        public const string _mask = "SC.*";
	public const string _assemblyDirectoryName = "";
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            var assemblyFilter = new AssemblyFilter(_assemblyDirectoryName, mask: _mask);
	  container.Register(Component.For<RepositoryInterceptor>().LifestyleTransient());
            container.Register(Classes.FromAssemblyInDirectory(assemblyFilter).BasedOn()
                    .Configure(p => p.LifestyleScoped().Interceptors<RepositoryInterceptor>()));
                  	
        }  
}

İlk olarak "RepositoryInterceptor" container içerisinde register ediyoruz.
Daha sonra "IRepository" arayüzünden türüyen classları register ettiğimizde bölümde bunların interceptors'i "RepositoryInterceptor" diye belirtiyoruz. 

Böylece tüm repository işlemlerinin transaction, exception loglaması yapabiliyor oldum.

Samet ÇINAR Hakkında

2010 senesinden bu yana hem tam zamanlı hemde freelance olarak yazılım projelerinde görev almaktayım.
Her gün daha güzel geliştirmeler yapmak için araştırıp öğrenmeyi, öğrendiklerimi aktarmayı çok seviyorum.

İLGİLİ YAZILAR

YORUMLAR

Enver

4.5.2019

IRepository nerden geliyor hocam

Yorum Yap