PostSharp - ткачество иль - мысли - PullRequest
10 голосов
/ 18 сентября 2008

Я рассматриваю использование Postsharp Framework для облегчения бремени регистрации методов приложений. Это в основном позволяет мне украшать методы атрибутом logging и во время компиляции вставляет необходимый код регистрации в il. Мне нравится это решение, так как оно защищает от шума времени и кода. Есть мысли, опыт или лучшие альтернативы?

Ответы [ 4 ]

7 голосов
/ 18 сентября 2008

Я применяю протоколирование с помощью АОП, используя Castle Windsor DynamicProxies. Я уже использовал Castle для его контейнера IoC, поэтому использование его для AOP стало для меня способом наименьшего сопротивления. Если вы хотите больше информации, дайте мне знать, я нахожусь в процессе исправления кода для выпуска его в виде поста в блоге

Редактировать

Хорошо, вот основной код Intercepter, очень простой, но он делает все, что мне нужно. Есть два перехватчика, каждый регистрирует каждый, а другой позволяет вам определять имена методов, чтобы обеспечить более детальную регистрацию. Это решение полностью зависит от замка Виндзор

Абстрактный Базовый класс

namespace Tools.CastleWindsor.Interceptors
{
using System;
using System.Text;
using Castle.Core.Interceptor;
using Castle.Core.Logging;

public abstract class AbstractLoggingInterceptor : IInterceptor
{
    protected readonly ILoggerFactory logFactory;

    protected AbstractLoggingInterceptor(ILoggerFactory logFactory)
    {
        this.logFactory = logFactory;
    }

    public virtual void Intercept(IInvocation invocation)
    {
        ILogger logger = logFactory.Create(invocation.TargetType);

        try
        {
            StringBuilder sb = null;

            if (logger.IsDebugEnabled)
            {
                sb = new StringBuilder(invocation.TargetType.FullName).AppendFormat(".{0}(", invocation.Method);

                for (int i = 0; i < invocation.Arguments.Length; i++)
                {
                    if (i > 0)
                        sb.Append(", ");

                    sb.Append(invocation.Arguments[i]);
                }

                sb.Append(")");

                logger.Debug(sb.ToString());
            }

            invocation.Proceed();

            if (logger.IsDebugEnabled && invocation.ReturnValue != null)
            {
                logger.Debug("Result of " + sb + " is: " + invocation.ReturnValue);
            }
        }
        catch (Exception e)
        {
            logger.Error(string.Empty, e);
            throw;
        }
    }
}
}

Полная реализация журнала

namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Logging;

public class LoggingInterceptor : AbstractLoggingInterceptor
{
    public LoggingInterceptor(ILoggerFactory logFactory) : base(logFactory)
    {
    }
}
}

Метод регистрации

namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Interceptor;
using Castle.Core.Logging;
using System.Linq;

public class MethodLoggingInterceptor : AbstractLoggingInterceptor
{
    private readonly string[] methodNames;

    public MethodLoggingInterceptor(string[] methodNames, ILoggerFactory logFactory) : base(logFactory)
    {
        this.methodNames = methodNames;
    }

    public override void Intercept(IInvocation invocation)
    {
        if ( methodNames.Contains(invocation.Method.Name) )
            base.Intercept(invocation);
    }
}
}
6 голосов
/ 26 сентября 2008

+ 1 на резком. Я использовал для нескольких вещей (в том числе некоторые попытки добавления предварительных условий и постусловий в код C #) и не знаю, как бы я сделал это без него ...

5 голосов
/ 26 сентября 2008

Это зависит от того, как долго вы будете разрабатывать и поддерживать проект. Конечно, IL-ткачество - хорошая технология, но что произойдет, если формат метаданных IL и / или сборки снова изменится (как это произошло между 1.1 и 2.0), и эти изменения сделают инструмент несовместимым с новым форматом.

Если вы зависите от инструмента, он не позволит вам обновить вашу технологию, пока инструмент не поддержит ее. Без каких-либо гарантий по этому поводу (или даже того, что развитие будет продолжаться, хотя это кажется вероятным), тогда я бы очень осторожно использовал его в долгосрочном проекте.

Краткосрочные, без проблем.

3 голосов
/ 19 сентября 2008

Использовали это, чтобы сделать именно это. Работает отлично! Я очень рекомендую это!

...