使用 PostSharp 包装方法调用

Wrapping method call with PostSharp

有什么方法可以用 PostSharp 包装方法调用吗?我必须添加代码 around/outside 一个特定的调用。

OnMethodBound 添加代码 inside 指定的方法和 MethodInterception 方面将调用重定向到方面,但我必须添加代码外呼。

示例: 没有方面:

...
call();
...

纵横比:

beforePart();
call();
afterPart();

目前,PostSharp 围绕调用站点编织方面的唯一场景是当您将该方面应用于引用程序集中的方法时。

在项目中应用方面时,可以在 AttributeTargetAssemblies 属性.

中设置外部程序集的名称
[Log(AttributeTargetAssemblies = "SomeLibrary", ...)]

当然,PostSharp 不会修改现有的外部程序集,而是会围绕对引用程序集的调用编织项目程序集中的方面。

目前不支持将方面应用于来自同一程序集的方法调用。在大多数情况下,这不是必需的,或者应该有一个合理的解决方法。

如果您提供有关同步方法的更多详细信息以及无法使用方法拦截的原因,也许我们能够解决此问题。

更新。

可能的解决方法是使用方面引入同步锁。您可以从线程模式库中编写自定义 OnMethodBoundaryAspect or use SynchronizedAttribute

然后你可以使用Aspect Dependency or Aspect Priority来确保在线程方面之前引入测量方面。这样,行为将与在调用站点周围引入测量方面时的行为相同。

[Serializable]
[AspectTypeDependency(AspectDependencyAction.Order,
                      AspectDependencyPosition.Before,
                      typeof(SynchronizedAttribute))]
public class MeasureTimeAttribute : OnMethodBoundaryAspect
{
    // ...
}

我有类似的要求,我为使用外部库 Dapper 进行的所有数据库调用编写了一个日志记录方面。我创建了一个方面:

[MulticastAttributeUsage(MulticastTargets.Method)]
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public sealed class SqlLogger : MethodInterceptionAspect
{
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        // logging code goes here

        base.OnInvoke(args);
    }
}

然后我在汇编级别注册了它:

[assembly: SqlLogger(AttributeTargetAssemblies = "Dapper", AttributePriority = 1)]