Comment puis-je appliquer l'aspect postsharp à un projet de site Web?
J'utilise un postsharp.config
fichier 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>
Tous mes projets dans ma solution sont sous l'espace de noms MyTopLevelNamespace
. Et chaque projet de la solution a l'aspect appliqué correctement, à l'exception de mon projet de site Web. Je ne connais pas la solution car je viens de rejoindre l'équipe de développement.
Tout ce que je sais, c'est que je voudrais appliquer un aspect aux classes dans ce projet et que postsharp semble ignorer ce projet particulier. Le fichier de configuration se trouve dans le src/
dossier et doit être appliqué à tous les projets.
Je me suis assuré que les types auxquels j'applique mon aspect se trouvent sous l'espace de noms spécifié dans le fichier de configuration et qu'ils ne correspondent à aucun des modèles d'exclusion.
Ai-je fourni suffisamment d'informations? Je ne suis pas sûr que cela soit dû au fait que le projet est un projet de site Web, mais je ne vois rien d'autre.
Edit : je me suis assuré d'avoir ajouté le package nuget au projet. J'ai également essayé d'ajouter manuellement l'aspect avec un attribut à une méthode spécifique de ce projet et l'aspect ne se déclenche pas.
Edit2 : c'est la méthode que j'utilise pour tester:
[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");
}
et mon aspect postsharp:
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)
{
//[...]
}
}
}
Réponses
Selon une vieille réponse d'un développeur chez PostSharp Technologies:
PostSharp est (actuellement) intégré via MSBuild (comme également mentionné par John Saunders), qui n'est pas utilisé par les projets de sites Web.
Bien que dans son cœur, PostSharp soit un outil de ligne de commande, il obtient tellement d'informations de MSBuild qu'il est assez difficile de le faire fonctionner séparément (et ni conseillé, ni documenté, ni pris en charge en premier lieu). Daniel Balas
Je n'ai trouvé aucune mise à jour à ce sujet pour la version antérieure à 4.3. Pour 4.3 et versions antérieures selon la réponse précédente et cette documentation (p. 45), le projet de site Web n'est pas pris en charge.
Edit : en interrogeant l'auteur précédemment cité sur la validité actuelle de leur réponse, ils ont répondu ceci en commentaire:
@Amon Pour les sites Web sans projet (que l'IIRC ne peut pas créer à partir de l'interface utilisateur dans VS 2017 et versions ultérieures), c'est toujours vrai. Cependant, tous les projets Web qui ont csproj / vbproj (.NET ou .NET Core) fonctionnent comme prévu (cela n'a pas non plus changé depuis). - Daniel Balas