PostSharp: OnMethodBoundaryAspect не вызывается - PullRequest
0 голосов
/ 13 сентября 2009

Я использую PostSharp для применения CompoundAspect к классу ActiveRecord (из CastleProject). Код выглядит так:

public override void ProvideAspects(object targetElement, LaosReflectionAspectCollection collection)
{
    Type targetType = (Type)targetElement;
    RevertibleSubAspect revertible = new RevertibleSubAspect();
    revertible.Cascade = this.Cascade;
    collection.AddAspect(targetType, revertible);

    //This isn't working
    MethodInfo saveMethod = targetType.GetMethod("Save");
    collection.AddAspect(saveMethod, new CommitOnSaveSubAspect());

    foreach (PropertyInfo property in targetType.GetProperties())
    {
        if((this.Only != null && this.Only.IndexOf(property.Name) == -1) ||
           (this.Except != null && this.Except.IndexOf(property.Name) > -1))
        {
            continue;
        }

        if (property.DeclaringType == targetType && property.CanWrite)
        {
            MethodInfo method = property.GetSetMethod();
            if (method != null && !method.IsStatic)
            {
                collection.AddAspect(method, new TrackInitialPropertyValuesSubAspect());
            }
        }
    }
}

Все работает отлично, кроме CommitOnSaveSubAspect, который является OnMethodBoundaryAspect. Метод OnSuccess никогда не вызывается при вызове метода Save. Я уже пытался переместить код в OnEntry и OnExit, но здесь такая же ситуация.

Класс CommitOnSaveSubAspect выглядит следующим образом:

[Serializable]
class CommitOnSaveSubAspect : OnMethodBoundaryAspect
{
    public override void OnSuccess(MethodExecutionEventArgs eventArgs)
    {
        ((IRevertible)eventArgs.Instance).Commit();
    }
}

Применяю ли я аспект неправильно?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2009

Хороший способ отладки аспекта - посмотреть на получившуюся сборку с помощью Reflector. Методы улучшены, как вы ожидаете?

Вы также можете отладить метод ProvideAspect, поместив в него точку останова и запустив msbuild со следующей командной строкой:

msbuild /p:PostSharpAttachDebugger=true
0 голосов
/ 13 сентября 2009

Был ли PostSharp определен глобально при его установке?В противном случае вам придется отредактировать файлы проекта, чтобы PostSharp правильно впрыскивался в ваши сборки.

См. http://doc.postsharp.org/1.0/Default.aspx##PostSharp.HxS/UserGuide/Platform/EnablingPostSharp.html.

...