It looks like RealProxy won't come to .NET Core/Standard. In der Ausgabe schlägt ein Microsoft-Entwickler DispatchProxy als Alternative vor.
Außerdem können einige vorhandene AOP-Frameworks .NET Core bereits oder in der Zukunft unterstützen (wie in den Kommentaren zu der Frage zu sehen). Eine Alternative ist die DispatchProxy
, die hier ein wunderbares Beispiel hat: http://www.c-sharpcorner.com/article/aspect-oriented-programming-in-c-sharp-using-dispatchproxy/.
Wenn wir den Code zu vereinfachen, ist es das, was wir bekommen:
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");
}
}
Wenn wir also ein Beispiel Klasse Calculator
mit einer entsprechenden Schnittstelle (hier nicht dargestellt):
public class Calculator : ICalculator
{
public int Add(int a, int b)
{
return a + b;
}
}
können wir einfach verwenden Sie es wie dieser
static void Main(string[] args)
{
var decoratedCalculator = LoggingDecorator<ICalculator>.Create(new Calculator());
decoratedCalculator.Add(3, 5);
Console.ReadKey();
}
Haben Sie die Lösung gefunden ??? –
@RafaelEnriquez Bis heute ist im asp net core 1 nichts implementiert. Vielleicht mit 1.1 oder 1.2. wenn ich etwas gefunden habe, werde ich die Antwort hier posten :) –
Also, was ist die Lösung dafür? Ist https://www.nuget.org/packages/System.Runtime/ kompatibel mit .NetCore? –