2008-09-18 4 views
10

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

+0

Я думал то же самое. Хотелось бы услышать, что думают люди. – 2008-09-18 11:07:30

+0

Да, я прослушивал меня несколько недель - но я думаю, что накладные расходы во время компиляции стоит того, что не хватает кода ведения журнала, будьте здоровы, если кто-нибудь его использует. – redsquare 2008-09-18 11:09:14

ответ

7

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

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

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

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

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; 
     } 
    } 
} 
} 

Полный Logging Implemnetation

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); 
    } 
} 
} 
+0

Привет, хорошо, если бы вы могли дать быструю демонстрацию - работает ли она с атрибутами по методам. – redsquare 2008-09-18 11:12:46

+0

Я не заинтересован в использовании атрибута для работы с кросс-конкреторными коннекторами, таких как ведение журнала, проверка и т. Д. Я использую внешнюю DSL на основе Boo для настройки контейнера IoC, и я назначаю там ведение журнала. Это означает, что я могу добавлять/удалять протоколирование без чередования C# – 2008-09-18 11:17:09

3

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

6

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

5

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

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

Короткий срок, никаких проблем.

 Смежные вопросы

  • Нет связанных вопросов^_^