AOP é bastante útil quando usado corretamente. Veja como fazer isso usando AutoFac e DynamicProxy.
Primeiro adicione o Autofac.Extras.DynamicProxy
pacote 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.