1

我正在尝试使用 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 方式的日志记录是一种静态的。

我希望它清楚我想要达到的目标。

4

1 回答 1

0

如果您不想[Intercept("log-calls")]上课,可以尝试运行时 aop 框架,例如Norns.Urd或其他提供 GlobalInterceptor 的框架

您只需要添加一次 LoggerInterceptor ,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.ConfigureAop(i => i.GlobalInterceptors.Add(new LoggerInterceptor()));
}
于 2020-12-13T01:03:37.387 回答