Ведение журнала AOP с помощью StructureMap
Я пытаюсь реализовать простое ведение журнала с помощью подхода АОП с StructureMap.
В основном, я хочу сделать то, что задают в вопросе Castle, AOP и Logging в.NET с StructureMap.
CastleWindsor имеет полезную IInterceptor
что вы можете реализовать, а затем контролировать, когда метод вызывается с IInvocation.Proceed()
, Позволяет выполнять ведение журнала до и после вызова метода.
Как этого добиться с помощью StructureMap? Я устал использовать обычай Interceptor
но единственный дескриптор, который вы получаете, это когда экземпляр создается, а не когда вызывается метод для экземпляра.
1 ответ
Что-то вроде этого, вероятно, будет работать для вас:
Создайте перехватчик прокси замка:
public class LoggingInterceptor : IInterceptor
{
private readonly IMyLogger _logger;
public LoggingInterceptor(IMyLogger logger) { _logger = logger; }
public void Intercept(IInvocation invocation)
{
_logger.Log("Before calling " + invocation.Method);
invocation.Proceed();
_logger.Log("After calling " + invocation.Method);
}
}
Зарегистрируйте это в своей конфигурации SM, чтобы обернуть все IFoo
с прокси:
var proxyGenerator = new ProxyGenerator();
c.For<IFoo>().Use<Foo>();
c.For<IFoo>()
.EnrichAllWith(instance =>
proxyGenerator.CreateInterfaceProxyWithTarget<IFoo>(instance,
new LoggingInterceptor(new MyLogger())));
Все вызовы любого метода во всех случаях IFoo
теперь будет перехвачен LoggingInterceptor
, Конечно, вы можете отфильтровать, какие вызовы вы хотите зарегистрировать, проверив экземпляр.