2017-09-04 78 views
15

Uygulamamı .NET Framework 4.5.1'den Dot Net Core'a geçiriyorum. Ben BeforeExecute ve AfterExecute üzerinde kullanıcı bilgilerini ve parametreleri giriş için RealProxy Class kullanıyordum AOP: Dotnet çekirdeğinde Gerçek Proxy ile Dinamik Proxy

(bu link gibi) Artık ben üçüncü parties.I kullanmak istemiyorum Dot core.Plus hiçbir böyle bir şey var gibi görünüyor Actionfilter kullanan bu link bulundu, ancak işi yapmayacak.

Benim sorum Nokta net çekirdeğinde Dinamik Proxy'yi nasıl uygularım? RealProxy Sınıfı için alternatif var mı?

cevap

0

Zaten RealProxy in dotnet core?'da yanıtladığım gibi, RealProxy .NET Core'da bulunmuyor.

Alternatif olarak DispatchProxy bir alternatiftir: http://www.c-sharpcorner.com/article/aspect-oriented-programming-in-c-sharp-using-dispatchproxy/.

public class LoggingDecorator<T> : DispatchProxy 
{ 
    private T _decorated; 

    protected override object Invoke(MethodInfo targetMethod, object[] args) 
    { 
     try 
     { 
      LogBefore(targetMethod, args); 

      var result = targetMethod.Invoke(_decorated, args); 

      LogAfter(targetMethod, args, result); 
      return result; 
     } 
     catch (Exception ex) when (ex is TargetInvocationException) 
     { 
      LogException(ex.InnerException ?? ex, targetMethod); 
      throw ex.InnerException ?? ex; 
     } 
    } 

    public static T Create(T decorated) 
    { 
     object proxy = Create<T, LoggingDecorator<T>>(); 
     ((LoggingDecorator<T>)proxy).SetParameters(decorated); 

     return (T)proxy; 
    } 

    private void SetParameters(T decorated) 
    { 
     if (decorated == null) 
     { 
      throw new ArgumentNullException(nameof(decorated)); 
     } 
     _decorated = decorated; 
    } 

    private void LogException(Exception exception, MethodInfo methodInfo = null) 
    { 
     Console.WriteLine($"Class {_decorated.GetType().FullName}, Method {methodInfo.Name} threw exception:\n{exception}"); 
    } 

    private void LogAfter(MethodInfo methodInfo, object[] args, object result) 
    { 
     Console.WriteLine($"Class {_decorated.GetType().FullName}, Method {methodInfo.Name} executed, Output: {result}"); 
    } 

    private void LogBefore(MethodInfo methodInfo, object[] args) 
    { 
     Console.WriteLine($"Class {_decorated.GetType().FullName}, Method {methodInfo.Name} is executing"); 
    } 
} 

biz karşılık gelen arayüzünden (burada gösterilen) bir örnek sınıfı Calculator sahip Yani eğer:

public class Calculator : ICalculator 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

biz biz kodunu basitleştirmek Eğer

, bu ne olsun sadece bu

ve istediğiniz günlük kaydı alacaksınız.

+1

"Zaten yanıtladığım gibi ..." sorusunu neden yinelenen olarak işaretlemediniz? –