Регистрация AOP-пути и пользовательских сообщений - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь реализовать возможности регистрации в моем приложении с использованием интерфейса IInterceptor Autofa c, предоставляемого 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 элементов в базу данных» и так далее.

Теперь мне интересно, как я могу имитировать c такое поведение без необходимости повторного внедрения моего ILogger экземпляра везде. AOP-способ ведения журнала - это тип c с точки зрения сообщений, которые мы можем предоставить.

Надеюсь, ясно, чего я пытаюсь достичь.

...