programming oriented c# .net-core aop

aspect oriented programming c#



AOP en el núcleo de Dotnet: Proxy dinámico con Proxy real en el núcleo de Dotnet (1)

Esta pregunta ya tiene una respuesta aquí:

Estoy migrando mi aplicación de .Net Framework 4.5.1 a Dot Net Core. Estaba usando RealProxy Class para registrar la información de usuario y los parámetros en BeforeExecute y AfterExecute (como este link )

Ahora parece que no hay tal cosa en Dot core. Además, no quiero usar a terceros. Encontré este link que usa Actionfilter pero no funcionará.

mi pregunta es ¿Cómo puedo implementar Proxy dinámico en Dot net Core? ¿Hay alguna alternativa para la clase RealProxy?


Como ya respondí en RealProxy en dotnet core? , RealProxy no existe en .NET Core.

Una alternativa es DispatchProxy, que tiene un maravilloso ejemplo aquí: http://www.c-sharpcorner.com/article/aspect-oriented-programming-in-c-sharp-using-dispatchproxy/ .

Si simplificamos el código, esto es lo que obtenemos:

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"); } }

Entonces, si tenemos una Calculator clase de ejemplo con una interfaz correspondiente (no se muestra aquí):

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

Simplemente podemos usarlo así

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

Y obtendrá el registro deseado.