2017-09-04 13 views
15

私のアプリケーションを.Net Framework 4.5.1からDot Net Coreに移行しています。私はBeforeExecuteとAfterExecute上のユーザー情報とパラメータを記録するためのRealProxyクラスを使用していた はDotnetコアのAOP:DotnetコアのReal Proxyを使用する動的プロキシ

(このlinkのように)今では、私は第三parties.Iを使用したくないドットcore.Plusにはそのような事がないようですActionfilterを使用しているlinkが見つかりましたが、そのジョブは実行されません。

私の質問はどのようにしてダイナミックプロキシをドットネットコアに実装できますか? RealProxy Classの代替品はありますか?

答えて

0

すでにRealProxy in dotnet core?に回答しているように、RealProxyは.NETコアには存在しません。

代わりのDispatchProxyは、ここに素晴らしい例があります: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"); 
    } 
} 

我々は(ここでは示されていない)、対応するインターフェイスを例クラスCalculatorを持っている場合:

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

私達ができます単にこのように使用してください。

static void Main(string[] args) 
{ 
    var decoratedCalculator = LoggingDecorator<ICalculator>.Create(new Calculator()); 
    decoratedCalculator.Add(3, 5); 
    Console.ReadKey(); 
} 

あなたは希望のログを取得します。

+1

「私がすでに答えたように...」なぜあなたはその質問を重複していないのですか? –

関連する問題