微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

传递仅PostSharp可以看到的类对象

如何解决传递仅PostSharp可以看到的类对象

我不确定这是否可行。

我有一个从客户端api到service api(在两个不同位置的两个独立项目)的方法调用,我想发布这些信息来进行拦截。呼叫来自客户端,服务中使用postharharp

service.GetLogin(username)

这里的关键是我需要传递一个授权对象,该对象将显示在postsharp onentry方法

 public class Authorization
    {
        public string client_id  { get; set; }
         public string client_secret { get; set; }
        public string access_token { get; set; }
        public string token_type { get; set; }
        public string expires_in { get; set; }
    }

var auth = new Authorization();
 auth.client_id = "xyz";
 auth.client_secret = "abc"

并在发布后

 [Serializable]
    public class LoggingAspect : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
           //I need the object to show up here
        }
    }

问题: 我不想在每个方法调用中都传递此对象,因为我有1000多个方法。有没有一种方法可以将该授权对象附加到每个呼叫上,以便postharharp可以看到它而无需执行此类操作

service.GetLogin(username,auth);
service.Foo(auth)
service.Bar(auth);
service.xyz(auth);
services.abc(auth);

您能想象仅将这个对象添加到1000多种方法中吗?

解决方法

PostSharp无法直接使用来自呼叫站点的数据,因为这将需要向该方法添加实际参数(或发出新的重载)。从理论上讲,使用低级SDK是可行的,但将难以维护且实现成本高昂。

实现此目标的最佳方法是使用AsyncLocal<T>,它允许您将数据存储在ExecutionContext中。

public class AuthorizationProvider
{
  private static AsyncLocal<Authorization> state = new AsyncLocal<Authorization>();

  public Authorization Current { get => state.Value; set => state.Value = value; }
}

授权有效的代码为:

Authorization authorization = ... ;

try
{
  AuthorizationProvider.Current = authorization;
  
  // your logic.
}
finally
{
  AuthorizationProvider.Current = null;
}

然后您可以从OnEntry中读取授权对象:

[Serializable]
public class LoggingAspect : OnMethodBoundaryAspect
{
  public override void OnEntry(MethodExecutionArgs args)
  {
    if (!(AuthorizationProvider.Current?.IsValid ?? false))
    {
      ...
    }
  }
}

您还可以将当前授权的设置/取消包装在IDisposable中,以便可以使用using语句。

在AsyncLocal中分配的值集存储在执行上下文中,并因此流经异步调用。存储在执行上下文中的值,可以在上面的finally块中删除该值后捕获并使用。 See more here.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。