¿Cómo puedo aplicar el aspecto postsharp a un proyecto de sitio web?
Yo uso un postsharp.config
archivo simple :
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.postsharp.org/1.0/configuration">
<Multicast xmlns:my="clr-namespace:ExceptionAutoSerializer.Aspects;assembly:ExceptionAutoSerializer">
<my:MethodBoundaryAspect AttributeTargetTypes="MyTopLevelNamespace.*" />
<my:MethodBoundaryAspect AttributeTargetMembers="*ctor*" AttributeExclude="true"/>
<my:MethodBoundaryAspect AttributeTargetMembers="get_*" AttributeExclude="true"/>
<my:MethodBoundaryAspect AttributeTargetMembers="set_*" AttributeExclude="true"/>
</Multicast>
</Project>
Todo mi proyecto en mi solución está bajo el espacio de nombres MyTopLevelNamespace
. Y cada proyecto de la solución tiene el aspecto aplicado correctamente, excepto el proyecto de mi sitio web. No estoy familiarizado con la solución ya que acabo de ingresar al equipo de desarrollo.
Todo lo que sé es que me gustaría aplicar un aspecto a las clases dentro de este proyecto y que postsharp parece ignorar ese proyecto en particular. El archivo de configuración se encuentra en la src/
carpeta y debe aplicarse a todos los proyectos.
Me aseguré de que los tipos a los que estoy aplicando mi aspecto estén bajo el espacio de nombres especificado en el archivo de configuración y que no coincida con ninguno de los patrones de exclusión.
¿Proporcioné suficiente información? No estoy seguro de que se deba a que el proyecto sea un proyecto de sitio web, pero no puedo ver nada más.
Editar : me aseguré de agregar el paquete nuget al proyecto. También intenté agregar manualmente el aspecto con un atributo a un método específico de este proyecto y el aspecto no se activa.
Edit2 : este es el método que utilizo para probar:
[MethodBoundaryAspect]
public bool Foo(string bar1, string bar2)
{
// at runtime test contains indeed one attribute MethodBoundaryAspect
var test = this.GetType().GetMethod("ValidateUser").GetCustomAttributes(false);
//here the exception is caught higher up but the "onException" of my attribute doesn't trigger
throw new Exception("test exception");
}
y mi aspecto posfilado:
namespace ExceptionAutoSerializer.Aspects
{
[Serializable]
public class MethodBoundaryAspect : OnMethodBoundaryAspect
{
//[...]
public override void OnEntry(MethodExecutionArgs args)
{
//[...]
}
public override void OnSuccess(MethodExecutionArgs args)
{
//[...]
}
public override void OnException(MethodExecutionArgs args)
{
//[...]
}
}
}
Respuestas
Según una vieja respuesta de un desarrollador de PostSharp Technologies:
PostSharp está (actualmente) integrado a través de MSBuild (como también lo menciona John Saunders), que no es utilizado por proyectos de sitios web.
Si bien en su núcleo PostSharp es una herramienta de línea de comandos, obtiene tanta información de MSBuild que es bastante difícil hacer que funcione por separado (y no se aconseja, documenta ni admite en primer lugar). Daniel Balas
No encontré ninguna actualización sobre ese tema para la versión anterior a 4.3. Para 4.3 y versiones anteriores de acuerdo con la respuesta anterior y esta documentación (p. 45), el proyecto de sitio web no es compatible.
Editar : al preguntar al autor citado anteriormente sobre la validez actual de su respuesta, respondieron esto en un comentario:
@Amon Para sitios web sin proyectos (que IIRC no se pueden crear desde la interfaz de usuario en VS 2017 y versiones posteriores), sigue siendo cierto. Sin embargo, todos los proyectos web que tienen csproj / vbproj (.NET o .NET Core) funcionan como se esperaba (esto tampoco cambió desde entonces). - Daniel Balas