我正在尝试使用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中的错误?
答案 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);
}
}
});