Краткий ответ, для простоты и легкости использования, вы действительно не ошибетесь с PostSharp.
Более длинный ответ: на мой взгляд, вам следует выбирать между двумя структурами в зависимости от того, чего вы пытаетесь достичь.
Если вам нужны аспекты, которые должны изменяться в зависимости от контекста, рассмотрите Spring.NET (или любую платформу AOP, которая внедряет код во время выполнения на основе конфигурации). Это позволяет вам настраивать поведение ваших объектов в зависимости от того, что вы делаете. Например, через вашу конфигурацию вы можете использовать один тип регистрации в консольном приложении, а другой - в веб-приложении.Обратите внимание, что Spring также является контейнером DI (и некоторыми другими вещами) - он выходит далеко за рамки АОП, и его определенно стоит изучить, как его использовать.
С другой стороны, если вам нужно поведение, которое должно всегда действовать, независимо от контекста, то PostSharp (ткачество времени компиляции) - ваш лучший выбор. Это фактически то же самое, как если бы вы включали код в каждый метод, к которому применяете аспект.
Я рекомендую начать с PostSharp.
Для простых сценариев аспекта я бы передал тело метода в виде блока универсальному методу, который обрабатывает аспект, то есть реализуя шаблон проектирования «дыра посередине» .
Пример:
public class Class
{
public void MethodWithoutAspect()
{
var dummy = new string('a', 10);
Console.WriteLine(dummy);
}
public void MethodWithAspect()
{
Aspect.LogException(() =>
{
var dummy = new string('a', 10);
Console.WriteLine(dummy);
});
}
}
public static class Aspect
{
public static void LogException(Action block)
{
try
{
block();
}
catch (Exception e)
{
Log(e);
throw;
}
}
private static void Log(Exception e)
{
throw new NotImplementedException();
}
}
Я использую PostSharp уже довольно долгое время и должен сказать, что мне нравится простота использования и простота реализации.
Я также должен добавить, что лично я, когда использую фреймворк, всегда стараюсь придерживаться фреймворка с одной ответственностью, если только фреймворк не содержит много компонентов, которые мне нужны, или не дополняет ядро.