Castle Windsor ile intercept yaparak exception, transaction loglama yapabiliriz.
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.
No Comments