Unity

2012-08-01 21 views
5

numaralı telefon hattında araya giren yöntemler için tam yığın izlemesi Oturum açma ile günlüğe kaydetme hizmet yöntemlerini işlemek için Unity'yi kullanmayı düşünüyoruz. Bununla birlikte, bir endişe, tam yığın izinin çağrı alanında mevcut olmamasıdır; onun sadece bir önleme çağrısı içinde mevcut.Unity

public interface IExceptionService 
{ 
    void ThrowEx(); 
} 

public class ExceptionService : IExceptionService 
{ 
    public void ThrowEx() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class DummyInterceptor : IInterceptionBehavior 
{ 
    public IEnumerable<Type> GetRequiredInterfaces() 
    { 
     return Type.EmptyTypes; 
    } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     IMethodReturn ret = getNext()(input, getNext); 
     if (ret.Exception != null) 
      Console.WriteLine("Interceptor: " + ret.Exception.StackTrace + "\r\n"); 
     return ret; 
    } 

    public bool WillExecute 
    { 
     get { return true; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IUnityContainer container = new UnityContainer(); 
     container.AddNewExtension<Interception>(); 

     container.RegisterType<IExceptionService, ExceptionService>(
      new Interceptor<InterfaceInterceptor>(), 
      new InterceptionBehavior<DummyInterceptor>()); 

     try 
     { 
      container.Resolve<IExceptionService>().ThrowEx(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Call Site: " + e.StackTrace); 
     } 

    } 
} 

İşte konsol çıkışı o programı çalıştırmasını var:

Interceptor: 
at ConsoleDemo.ExceptionService.ThrowEx() in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 25 
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.<ThrowEx_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext) 

Call Site: 
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.ThrowEx() 
at ConsoleDemo.Program.Main(String[] args) in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 63 

yakalayıcısı yığın izleme gayet iyi ve hizmet düzeyinde giriş yapmak için yeterli olacaktır

İşte bir örnek tuzak. Bununla birlikte, çağrı yerinde ara proxy çağrısından geçen her şeyi kaybederiz;

İstisnayi bir ServiceException'da veya benzerleri içinde kapatabilirim ve bu çağrı yığıtını iç istisnada tutabiliyorum, ancak bu durum garip günlüğe kaydetme ve hata ayıklama denetim senaryolarına yol açacaktır (ancak iz tamamen kaybetmekten daha az zor olsa da)).

Ayrıca, TransparentProxyInterceptor'ı kullandığımız zaman ne istediğimizi daha az veya daha az aldığımızı fark ettim, ancak InterfaceInterception'dan daha yavaş olarak algılanıyor ve bazı gruplar için alarm zillerini tetikliyor.

Bir proxy'de çağrı sitesinde Unity araya girme ile tam yığın izlemesi almanın daha temiz bir yolu var mı?

cevap

2

.NET 4.5'te bu amaç için ExceptionDispatchInfo olacaktır. Bu soruyu görebilen tüm diğer sürümleri için

:
In C#, how can I rethrow InnerException without losing stack trace?

+0

Teşekkür, o cevabı bizim için harika çalışıyor! – Nick

+1

@Nick - Yaptığın şeyden daha fazlasını söyleyebilir misin? –

+0

Artık bu koda erişimim yok, fakat orijinal sorumda 'ret.Exception' ifadesini kabul edilen cevapta SO bağlantısından örnek yöntemlere aktarıyordum (etkin bir şekilde 'PreserveStackTrace (ret.Exception)' dan [buradan] ] (http://stackoverflow.com/a/2085377)). Ayrıca, yansıma tabanlı yaklaşımı, .NET 4.0 üzerinde çalışan yorum dizesinde de denedim. Eğer hala üzerinde çalışırken .NET 4.5'e taşınmış olsaydık, bunun yerine ExceptionDispatchInfo kullanmayı incelerdim. – Nick