我正在尝试使用 AutofacIInterceptor
提供的接口将日志记录功能实现到我的应用程序中Autofac.Extras.DynamicProxy
。这是我到目前为止得到的。
应记录其操作的服务:
[Intercept("log-calls")]
public class FooService : IFooService
{
public int Add(int lhs, int rhs)
{
return lhs + rhs;
}
}
我的IInterceptor
实现:
public class Logger : IInterceptor
{
private readonly ILogger logger;
public Logger(ILogger logger)
{
this.logger = logger;
}
public void Intercept(IInvocation invocation)
{
var name = $"{invocation.Method.DeclaringType}.{invocation.Method.Name}";
var args = string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()));
this.logger.Write($"Calling: {name}");
this.logger.Write($"Args: {args}");
var watch = Stopwatch.StartNew();
invocation.Proceed();
watch.Stop();
var executionTime = watch.ElapsedMilliseconds;
this.logger.Write($"Done: result was {invocation.ReturnValue}");
this.logger.Write($"Execution Time: {executionTime}ms");
}
}
显示其用法的测试:
[Fact]
public void Should_Intercept_Method_Call()
{
// Arrange
var builder = new ContainerBuilder();
// ITestOutputhelper instance in this case
builder.Register(c => new Logger(this.logger))
.Named<IInterceptor>("log-calls");
builder.RegisterType<FooService>()
.As<IFooService>()
.EnableInterfaceInterceptors();
var container = builder.Build();
using var scope = container.BeginLifetimeScope();
var service = scope.Resolve<IFooService>();
// Act
_ = service.Add(2, 3);
// ...
}
结果:
Calling: ClassLibrary1.IFooService.Add
Args: 2, 3
Done: result was 5
Execution Time: 0ms
我习惯于输出消息(用于调试控制台和文本文件),这些消息向我展示了我的应用程序中发生了什么。诸如“SomeService 已导出 42 个项目”或“AnotherService 已将 20 个项目读取到数据库”之类的内容。
现在我想知道如何在不必在ILogger
任何地方再次注入我的实例的情况下模仿这种行为。就我们可以提供的消息而言,AOP 方式的日志记录是一种静态的。
我希望它清楚我想要达到的目标。