Ведение журнала 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, Конечно, вы можете отфильтровать, какие вызовы вы хотите зарегистрировать, проверив экземпляр.

Другие вопросы по тегам