2008-09-18 41 views
10

Uygulama yöntemi günlüğü yükünü hafifletmek için Postsharp çerçevesini kullanmayı düşünüyorum. Temelde logging özelliği ile yöntemleri süslemek için bana izin verir ve derleme zamanında il içine gerekli olan logging kodu enjekte eder. Bu çözümü sevinçli zaman kodu ortamından uzak tutar. Düşünceleriniz, deneyimleriniz veya daha iyi alternatifleriniz var mı?PostSharp - il dokuma - düşünceler

+0

Aynı şeyi düşünüyordum. İnsanların ne düşündüğünü duymak isterim. –

+0

Evet, bir kaç haftalığına beni rahatsız ettim - ama derleme süresinin genelindeki ek yük kayıt kodu eksikliğine değdiğini düşünüyorum, herkesin kullandığını duymak harika. – redsquare

cevap

7

AOP ile Castle Windsor DynamicProxies kullanarak günlük kaydı uygularım. Şimdiden Kale için IoC konteynerini kullanıyordum, bu yüzden AOP için kullanmak benim için en az dirençli yoldu. bilgi bana bildirin Daha fazlasını isterseniz, ben bir blog yazısı olarak serbest bırakılması için yukarı kodu toplama sürecinde olduğum

Düzenleme

Tamam, burada faily temel temel intercepter kodu, ama o her şeyi yapar İhtiyacım var. İki intercepter vardır, bir tane her bir yazma ve diğeri daha ince taneli kayıt için izin vermek için metod isimlerini tanımlamanıza izin verir. Bu çözüm Kale Windsor

Özet Taban sınıfı üzerinde faily bağlıdır

namespace Tools.CastleWindsor.Interceptors 
{ 
using System; 
using System.Text; 
using Castle.Core.Interceptor; 
using Castle.Core.Logging; 

public abstract class AbstractLoggingInterceptor : IInterceptor 
{ 
    protected readonly ILoggerFactory logFactory; 

    protected AbstractLoggingInterceptor(ILoggerFactory logFactory) 
    { 
     this.logFactory = logFactory; 
    } 

    public virtual void Intercept(IInvocation invocation) 
    { 
     ILogger logger = logFactory.Create(invocation.TargetType); 

     try 
     { 
      StringBuilder sb = null; 

      if (logger.IsDebugEnabled) 
      { 
       sb = new StringBuilder(invocation.TargetType.FullName).AppendFormat(".{0}(", invocation.Method); 

       for (int i = 0; i < invocation.Arguments.Length; i++) 
       { 
        if (i > 0) 
         sb.Append(", "); 

        sb.Append(invocation.Arguments[i]); 
       } 

       sb.Append(")"); 

       logger.Debug(sb.ToString()); 
      } 

      invocation.Proceed(); 

      if (logger.IsDebugEnabled && invocation.ReturnValue != null) 
      { 
       logger.Debug("Result of " + sb + " is: " + invocation.ReturnValue); 
      } 
     } 
     catch (Exception e) 
     { 
      logger.Error(string.Empty, e); 
      throw; 
     } 
    } 
} 
} 

Tam Günlüğü Implemnetation

namespace Tools.CastleWindsor.Interceptors 
{ 
using Castle.Core.Logging; 

public class LoggingInterceptor : AbstractLoggingInterceptor 
{ 
    public LoggingInterceptor(ILoggerFactory logFactory) : base(logFactory) 
    { 
    } 
} 
} 

Yöntem günlüğü

namespace Tools.CastleWindsor.Interceptors 
{ 
using Castle.Core.Interceptor; 
using Castle.Core.Logging; 
using System.Linq; 

public class MethodLoggingInterceptor : AbstractLoggingInterceptor 
{ 
    private readonly string[] methodNames; 

    public MethodLoggingInterceptor(string[] methodNames, ILoggerFactory logFactory) : base(logFactory) 
    { 
     this.methodNames = methodNames; 
    } 

    public override void Intercept(IInvocation invocation) 
    { 
     if (methodNames.Contains(invocation.Method.Name)) 
      base.Intercept(invocation); 
    } 
} 
} 
+0

Merhaba Hızlı bir demo verebilirseniz harika olun - – redsquare

+0

metodları üzerinden özniteliklerle çalışırım Giriş yapma, doğrulama, vb. Gibi çapraz kesme işleri ile ilgilenmek için Attribute'u kullanma konusunda istekli değilim. Boo tabanlı bir harici DSL kullanırım IoC Konteynerini konfigüre etmek için ben orada loglama atayım. Bu, hızlı yanıt için C# –

+0

tezahüratları değiştirmeden günlük ekleyebilir/kaldırabildiğim anlamına gelir. Sadece giriş için kale ve IOC tanıtan bir xml yapılandırma ağrısına bir dünya içine girecek gibi geliyor. – redsquare

3

Bunu tam olarak yapmak için kullandınız. Harika çalışıyor! Kesinlikle tavsiye ederim!

+0

Merhaba Joel, – redsquare

6

+ 1 'e gönderiliyor. Birkaç şey için kullanıyorum (C# koduna önkoşullar ve postconditions eklemek için bazı girişimler dahil) ve onsuz nasıl yapılacağını bilmiyorum ...

5

Ne kadar süreceğine bağlıdır. Projeyi geliştirmek ve desteklemek. Elbette, IL dokuma güzel bir teknolojidir, ancak IL ve/veya derleme meta veri formatı (1.1 ve 2.0 arasında olduğu gibi) tekrar değiştiğinde ve bu değişiklikler aracı yeni formatla uyumlu hale getirmezse ne olur?

Eğer bu araca bağımlıysanız, teknolojiyi araç desteklenene kadar yükseltmenizi önler. Bununla ilgili herhangi bir garanti verilmediyse (ya da bu gelişme devam ederse de, muhtemelen görünecektir), uzun vadeli bir projede kullanmak konusunda çok dikkatli olacağım.

Kısa vadede sorun yok.

+0

Great point Greg için dikkat etmeniz gereken ipuçları veya püf noktaları. Teşekkürler – redsquare

+0

PostSharp açık kaynak olduğu için geliştirme, ona bağlı olduğunuz sürece devam edebilir. –

+1

Teoride bu doğrudur, ama ne yazık ki teori ve pratiğin her zaman aynı değildir. NDoc açık kaynaklıdır ve bir zamanlar gelişmekteydi, ama şimdi uykuda yatıyor. Açık kaynak projeleri hala çevrelerinde bir topluluğa ihtiyaç duyarlar ve buna bağlıysanız, bunu sürdürmeye devam edebilirsiniz. Bu yükü istiyor musun? –

İlgili konular