Postharp AOP Метод Interception Аспект не работает
Я пытался добавить атрибут на основе разрешений, который будет использоваться существующим приложением 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 ответ
Оказывается, Post Sharp был отключен в этом проекте!!! Я установил расширение Post Sharp, затем пошел в раздел Post Sharp и обнаружил, что оно отключено, после включения оно работало нормально