我试图添加一个基于权限的属性,以供我应该使用的使用 WPF 构建的现有 Windows 应用程序使用。这个想法是拦截对某些命令的 Canexecute 方法的调用并返回 false - 这将禁用按钮 - 所以我在一个解决方案上做了一个简单的例子,我添加了 Postsharp 的 Nuget 包并覆盖 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 方法,而 Attribute 的 Constructor 已经被调用。
我不确定出了什么问题,但另一个信息是我发现现有的解决方案已经在使用 Postsharp 进行日志记录。所以我使用了与项目使用的版本完全相同的版本,即 4.2.26,方法是从 Nuget 包管理器中选择此版本。
我尝试过的另一件事是我已经实现了 CompileTimeValidate 方法并有目的地添加了一个应该在构建时引发异常的代码。在 Small -Working- 示例中,它在构建时引发了异常。在尚未工作的现有应用程序中。在构建时它不会引发任何异常!!!。
更新:我正在使用如下:
[PermissionBasedAttribute("Permission1") ]
public bool CanShowView()
{
return true;
}