SORU
25 AĞUSTOS 2008, PAZARTESİ


Nasıl C yöntem aramalarımı yapıyorum#?

Belirli bir sınıf için her yöntem çağrısı (yöntem imzası ve gerçek parametre değerleri) ve her çıkış yöntemi (yöntem imzası) oturum isterim işlevselliği yani izlemeyi istiyorum.

Nasıl olduğunu varsayarak: I bunu

  • Herhangi bir 3rd party kullanmak istemiyorum C SOP kütüphaneler#,
  • İzlemek istediğim tüm yöntemleri için yinelenen kod eklemek istemiyorum
  • Sınıfın ortak API değiştirmek istemiyorum - sınıf kullanıcılar aynı şekilde tüm yöntemleri aramak gerekir.

Soruyu daha somut hale getirmek için 3 sınıf var varsayalım:

 public class Caller 
 {
     public static void Call() 
     {
         Traced traced = new Traced();
         traced.Method1();
         traced.Method2(); 
     }
 }

 public class Traced 
 {
     public void Method1(String name, Int32 value) { }

     public void Method2(Object object) { }
 }

 public class Logger
 {
     public static void LogStart(MethodInfo method, Object[] parameterValues);

     public static void LogEnd(MethodInfo method);
 }

Nasıl çağırmakLogger.LogStartveLogger.LogEndher çağrı içinMethod1veMethod2bu değiştirmedenArayan.Arayöntem ve açıkça aramalar eklemedenTakip.Method1veTakip.Method2?

Eğer biraz Arama yöntemini değiştirmek için iznim var mı çözüm Ne olabilir? Edit:

CEVAP
25 AĞUSTOS 2008, PAZARTESİ


C# SOP yönelik bir dil değildir. Bazı SOP özellikleri ve bazı Diğerleri taklit edebilirsiniz ama C ile SOP yapım var# acı verici.

Ne istediğini tam olarak yapmak için yollar aradım ve bunu yapmak için daha kolay bir yol buldum.

Anladığım kadarıyla, bu yapmak istediğin nedir:

[Log()]
public void Method1(String name, Int32 value);

ve iki ana seçenek var bunu yapmak için

  1. Adıyla, ya da ContextBoundObject sınıftan ve İMessageSink devralan bir öznitelik tanımlar devralır. This article güzel bir örnek vardır. Performansını aşağı 10x performans bahsediyorum, yani, cehennem gibi geçecek bir Adıyla kullanarak dikkatli bir şekilde bunu denemeden önce düşün kaybetti böylece nontheless göz önünde bulundurmanız gerekir.

  2. Diğer seçenek kodu direkt olarak enjekte edilir. Çalışma zamanında, bir yansıma" her sınıf, öznitelikleri almak ve uygun arama Yansıması edemediğini düşünüyorum önemli benim için. (ve enjekte "okumak için kullanman gerekecek anlamı Yansıma bence yöntem olarak yayarlar.Yayarlar zaten varolan bir yöntem) içinde yeni bir kod eklemek için izin vermedi. Tasarım zamanında bu gerçekten nasıl bitti hiçbir fikrim yok hangi CLR derleyici uzantısı oluşturma anlamına gelecektir.

Son seçenek IoC framework kullanıyor. Belki de en IoC çerçeveler yöntemleri bağımlısı olmamızı sağlayan giriş noktaları tanımlayarak çalışır, ancak, elde etmek için ne istediğinize bağlı olarak, bu adil bir yaklaşım olabilir gibi mükemmel bir çözüm değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • failblog

    failblog

    17 HAZİRAN 2008
  • LardTardProductions's channel

    LardTardProd

    10 NİSAN 2009
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010