如何解决传递仅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);
解决方法
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 举报,一经查实,本站将立刻删除。