Я пытаюсь реализовать возможности регистрации в моем приложении с использованием интерфейса 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 с точки зрения сообщений, которые мы можем предоставить.
Надеюсь, ясно, чего я пытаюсь достичь.