使用PostSharp进行包装方法调用

时间:2015-03-02 12:03:36

标签: c# postsharp

有没有办法用PostSharp包装方法调用?我必须在特定呼叫周围/外部添加代码。

OnMethodBound在指定的方法中添加代码 MethodInterception方面将调用重定向到方面,但我必须在调用之外添加代码。< / p>

示例: 没有方面:

...
call();
...

有方面:

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

2 个答案:

答案 0 :(得分:0)

目前,PostSharp在调用站点周围编织方面的唯一方案是将该方面应用于引用的程序集中的方法。

在项目中应用方面时,可以在AttributeTargetAssemblies属性中设置外部装配的名称。

[Log(AttributeTargetAssemblies = "SomeLibrary", ...)]
当然,PostSharp不会修改现有的外部程序集,而是围绕对引用程序集的调用在项目程序集中编织方面。

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

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

<强>更新

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

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

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

答案 1 :(得分:0)

我有类似的要求,我为使用外部库(即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)]