PostSharp:将建议应用于外部类型

时间:2016-12-19 15:49:08

标签: c# .net aop postsharp

我正在尝试使用PostSharp 4.3.24在外部/第三方程序集中的呼叫站点切入点上应用一些建议,但我遇到了一些问题。在最简单的示例中,我正在尝试记录有关应用程序执行的所有SQL的一些信息。我的方法是将OnMethodBoundaryAdvice应用于所有SQLCommand.Execute*方法(我们不使用BeginExecute*方法提供的遗留异步模式,因此我故意不包括它们)。我使用PostSharp解决方案配置文件(Multicast文件)的MySolution.pssln部分以及以下等效的程序集范围的多播属性应用程序尝试了这一点:

[assembly:Blah.Telemetry.Aspects.SqlCommandTelemetryAspect(
    AttributeTargetAssemblies = "System.Data", 
    AttributeTargetTypes = "System.Data.SqlClient.SqlCommand", 
    AttributeTargetMembers = "Execute*"
)]

我的Aspect声明目前看起来如此:

[MulticastAttributeUsage(AllowExternalAssemblies = true, Inheritance = MulticastInheritance.Multicast)]
[PSerializable]
public sealed class SqlCommandTelemetryAspect : OnMethodBoundaryAspect { /*...*/ }

我在MulticastAttributeUsage中尝试过各种目标类型,继承值等组合,但每次都会得到相同的混乱结果。

我遇到的问题是该建议仅适用于单个SqlCommand方法(ExecuteReader)。我还需要将它应用于所有其他Execute方法(例如ExecuteNonQuery)和所有重载。我还尝试定位DbCommand.Execute*,其中包含一些重载的抽象定义。当我直接taget ExecuteNonQuery(而不是使用通配符或正则表达式)时,我收到以下警告,暗示没有应用任何建议(并且反编译确认了这一点):

POSTSHARP : postsharp warning PS0131: The project 'Blah.Framework.dll' does not contain any aspect or other transformation[...]

我做错了什么,或者这可能是PostSharp中的错误?

1 个答案:

答案 0 :(得分:2)

相关错误已在PostSharp 4.3.26中修复。现在可以使用方面提供程序将OnMethodBoundary和MethodInterception方面应用于外部程序集中的抽象方法。

例如:

$.ajax({
  url: "/api/databaseCall/",
  success: function(data){

/* 
Build DropDown
the data variable will be a hash or array of returned db results
iterate over them and build UI
*/

    for(var i=0; i < data.results.length; i++){

      var row = '<option id=' + data.results[i].id + '>' + data.results[i].value + '</option>';
      $(".dropdown").append(row);
    } 

  }
});