Postharp AOP МетодInterception Аспект не работает - PullRequest
0 голосов
/ 25 апреля 2018

Я пытался добавить атрибут на основе разрешений, который будет использоваться существующим приложением Windows, созданным с WPF, над которым я должен работать.Идея состояла в том, чтобы перехватить вызовы методов Canexecute некоторых команд и вернуть false - что бы отключить кнопки - поэтому я сделал простой пример решения, в котором я добавил пакет Nuget Postsharp и переопределил метод OnInvoke следующим образом:

[Serializable]
public class PermissionBasedAttribute : MethodInterceptionAspect
{
    public string PermissionName { get; private set; }

    public PermissionBasedAttribute (string permissionName)
    {
        PermissionName = permissionName;
    }

    /// <summary>
    /// Upon invocation of the calling method, the PermissionName is checked.
    /// If no exception is thrown, the calling method proceeds as normal.
    /// If an exception is thrown, the virtual method MethodOnException is called.
    /// </summary>
    /// <seealso cref="MethodOnException(SecurityPermissionException)"/>
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        try
        {
             /*
             * some logic to check the eligibility of the user, in case of
                not authorised an exception should be thrown.
             */
            args.Proceed();
        }
        catch (SecurityPermissionException ex)
        {
            args.ReturnValue = false;
            // MethodOnException(ex);
        }
    }

    /// <summary>
    /// Method can be overridden in a derived attribute class.
    /// Allows the user to handle the exception in whichever way they see fit.
    /// </summary>
    /// <param name="ex">The exception of type SecurityPermissionException</param>
    public virtual void MethodOnException(SecurityPermissionException ex)
    {
        throw ex;
    }
}

в любом случае, в небольшом примере все отлично работает с разными подходами в простом примере, такими как использование devexpress или нет.но при добавлении в существующее приложение оно вообще не работает, если быть более точным: метод OnInvoke никогда не вызывается, а конструктор атрибута уже вызывается.

Я не уверен, что не так, но дополнительная информация заключается в том, что я обнаружил, что существующее решение уже использует Postsharp для регистрации аспектов.поэтому я использовал ту же версию, что и проект, который используется в проекте 4.2.26, выбрав эту версию из диспетчера пакетов Nuget.

Еще одна вещь, которую я пробовал, заключается в том, что я реализовал метод CompileTimeValidate ицеленаправленно добавлен код, который должен вызывать исключение при сборке.в примере Small -Working- он вызвал исключение при сборке.в то время как в существующем приложении, где оно еще не работало.после сборки он не вызывает никаких исключений !!!.

Обновление: я использую в следующем порядке:

[PermissionBasedAttribute("Permission1") ]
public bool CanShowView()
{
return true;
}

1 Ответ

0 голосов
/ 11 мая 2018

Оказывается, Post Sharp был отключен в этом проекте !!!Я установил расширение Post Sharp, затем пошел в раздел Post Sharp и обнаружил, что оно было отключено, после включения оно работало нормально

...