Alles beginnt mit einem guten Anwendungsdesign. Wenn das Design Ihrer Anwendung korrekt ist, gibt es viel weniger Grund für Sie, mit solchen AOP-ähnlichen Funktionen zu interagieren, die Ihr UI-Framework darstellt (dies gilt auch für WCF).
Wenn Sie beispielsweise alle Geschäftslogik hinter einer generischen Schnittstelle verbergen und Befehlsnachrichten an diese übergeben (wie in this article gezeigt), werden Ihre Controller zu dünnen Wrappern, die oft nicht viel mehr als einen solchen Geschäftsbefehl ausführen. In diesem Fall können Sie die Autorisierungs- und Ausnahmefilterung implementieren, indem Sie diese Geschäftsvorgänge umbrechen, sodass der Benutzeroberflächencode sauber und frei von Attributen bleibt. Diese übergreifenden Anliegen rund um den Geschäftsbetrieb abzudecken, kann mit beiden Interception oder plain old decorators erfolgen. Dies gibt Ihnen viel mehr Flexibilität und hält Ihr Design SOLID (die eine Menge weniger offensichtliche langfristige Vorteile hat).
Obwohl Code Webwerkzeuge wie PostSharp seinen Nutzen haben, sollten Sie vorsichtig mit ihnen sein. Sie injizieren Code in Ihre Assembly mit einem Post-Compile-Prozess. Dies macht es sehr schmerzhaft, diese Klassen zu testen, ohne diese Aspekte zu treffen. Sie können diese Klassen nicht einfach isoliert testen (was eine Voraussetzung für Komponententests ist). Wenn Sie Ihre Aspekte von einer statischen Variablen abhängig machen, werden sowohl Aspekte als auch Komponententests komplizierter. Statische Variablen erschweren die parallele Ausführung von Komponententests, und die Verwendung globaler Konstanten erfordert Tests, um die geänderte globale Einstellung korrekt zu reduzieren, um zu verhindern, dass andere Tests beeinflusst werden.
Obwohl Code-Weben-Werkzeuge zu einer Leistung führen, die oft größer ist als das Abfangen, gibt es keinen Leistungsgewinn im Vergleich zum Einsatz von Dekoratoren.
Wie wirkt sich die Kompilierzeit-Injektion auf die Komponententests aus? Sie werden nicht einmal Komponententest ohne zu kompilieren Sie wissen? – jfar
@jfar: Ihr Produktionscode wird zusammen mit den Aspekten während der Kompilierung gewebt. Aus diesem Grund können Sie Ihren Produktionscode nicht mehr isoliert testen. Wenn ein Komponententest einen Produktionscode aufruft, werden die Aspekte immer angewendet. In der Tat können Sie nicht Unit-Test, da per Definition ein Unit-Test isoliert ausgeführt wird. Was Sie haben werden, ist ein Integrationstest. Möchten Sie jetzt Ihren Downvote rückgängig machen? – Steven
Ihr Code wird IMMER vom Compiler zusammen gewebt, Produktion und Komponententest könnte möglicherweise verschiedene Versionen vom Compiler bekommen, also könnte jeder Code mit Decorators oder DI oder irgendetwas. Der Fehler in dieser Antwort ist, dass AOP oder PostSharp Unit-Tests nicht in irgendeiner eindeutigen oder bemerkenswerten Weise bewirkt. – jfar