Programação Orientada a Aspectos no .Net Core

AOP é bastante útil quando usado corretamente. Veja como fazer isso usando AutoFac e DynamicProxy.

Primeiro adicione o Autofac.Extras.DynamicProxypacote Nuget ao seu projeto.

Existem quatro etapas para implementar a interceptação usando DynamicProxy,

  • Crie interceptores.
  • Registre interceptores com Autofac.
  • Habilite a interceptação em tipos.
  • Associe interceptores a tipos a serem interceptados.

Crie um interceptor. Aqui está um exemplo de logger.

public class Logger: IInterceptor
{
TextWriter writer;
public Logger(TextWriter writer)
{
if(writer == null){
throw new ArgumentNullException(nameof(writer));
}
this.writer = writer
}

public void Intercept(IInvocation invocation)
{
var name = $"{invocation.Method.DeclaringType}.{invocation.Method.Name}";
var args = string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()));

writer
.WriteLine($"Calling: {name}");
writer
.WriteLine($"Args: {args}");

var watch = System.Diagnostics.Stopwatch.StartNew();
invocation
.Proceed(); //Intercepted method is executed here.
watch
.Stop();
var executionTime = watch.ElapsedMilliseconds;

writer
.WriteLine($"Done: result was {invocation.ReturnValue}");
writer
.WriteLine($"Execution Time: {executionTime} ms.");
writer
.WriteLine();
}
}

Finalmente, tendo a classe e as interfaces abaixo, registre a interceptação usando nosso logger acima.

public interface ICalculator {
int add(int a, int b);
}

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

Registrar interceptação

var b = new ContainerBuilder();

b
.Register(i=> new Logger(Console.Out));
b
.RegisterType<Calculator>()
.As<ICalculator>()
.EnableInterfaceInterceptors()
​.InterceptedBy(typeof(Logger));

var container = b.Build();

Você pode ver mais sobre isso neste post . Ele tem mais exemplos de usos para interceptores.