Я рассматриваю возможность использования инфраструктуры Postsharp для облегчения бремени регистрации методов приложения. В основном это позволяет мне украшать методы с атрибутом logging и во время компиляции вводит код регистрации, необходимый в il. Мне нравится это решение, так как оно удерживает шум от окружающей среды временного кода. Любые мысли, переживания или лучшие альтернативы?PostSharp - il weaving - мысли
ответ
Я использую регистрацию с помощью АОП с использованием 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);
}
}
}
Привет, хорошо, если бы вы могли дать быструю демонстрацию - работает ли она с атрибутами по методам. – redsquare 2008-09-18 11:12:46
Я не заинтересован в использовании атрибута для работы с кросс-конкреторными коннекторами, таких как ведение журнала, проверка и т. Д. Я использую внешнюю DSL на основе Boo для настройки контейнера IoC, и я назначаю там ведение журнала. Это означает, что я могу добавлять/удалять протоколирование без чередования C# – 2008-09-18 11:17:09
Использовали его, чтобы сделать именно это. Прекрасно работает! Я бы очень рекомендовал это!
+1 на postsharp. Использовали для нескольких вещей (включая некоторые попытки добавления предварительных условий и постусловий к C# -коду) и не знаю, как бы я сделал это без него ...
Это зависит от того, как долго вы будете развивать и поддерживать проект. Конечно, IL ткачество - хорошая технология, но что произойдет, если формат метаданных IL и/или сборки снова изменится (как это было между 1.1 и 2.0), и эти изменения делают инструмент несовместимым с новым форматом.
Если вы зависите от инструмента, это не позволяет вам модернизировать вашу технологию, пока инструмент не поддержит ее. Без каких-либо гарантий относительно этого (или даже эта разработка будет продолжаться, хотя это кажется вероятным), тогда я бы очень настороженно относился к ее использованию в долгосрочном проекте.
Короткий срок, никаких проблем.
Я думал то же самое. Хотелось бы услышать, что думают люди. – 2008-09-18 11:07:30
Да, я прослушивал меня несколько недель - но я думаю, что накладные расходы во время компиляции стоит того, что не хватает кода ведения журнала, будьте здоровы, если кто-нибудь его использует. – redsquare 2008-09-18 11:09:14