AOP vs MVC FilterAttributes vs Interzeptoren [geschlossen]

8
  1. ASP.NET MVC schlägt vor, integrierte Autorisierungs-, Aktions-, Ergebnis- und Ausnahmefilter zu verwenden oder zu erweitern.
  2. Dritte .Net-IoC-Container (Unity, Ninject, Autofac) schlagen Interzeptoren vor
  3. AOP-Tools der dritten Partei (Postsharp) schlagen ihre Attribute vor.

Jetzt bin ich durcheinander. Vielleicht vermische ich sie alle. Ich möchte robusten Code und stabile Methodik aufbauen, was soll ich verwenden?

    
Nuri YILMAZ 21.02.2013, 17:42
quelle

2 Antworten

6

Alles beginnt mit einem guten Anwendungsdesign. Wenn das Design Ihrer Anwendung korrekt ist, wird es viel weniger Grund für Sie, mit denen AOP wie Funktionen, die Ihr UI-Framework macht die Interaktion (dies auch für WCF hält).

Wenn Sie beispielsweise alle Geschäftslogik hinter einer generischen Schnittstelle verstecken und Befehlsnachrichten an sie übergeben (wie in dieser Artikel ), wird Ihr Controller dünne Wrapper werden, die nicht viel öfter tun, als solches Geschäft Befehle ausführen. In diesem Fall können Sie Genehmigung und Ausnahme-Filterung implementieren, indem diese Geschäftstätigkeit wickelt, den UI-Code sauber und frei von Attributen zu verlassen. diese Querschnittsthemen rund um Geschäftstätigkeit Wrapping kann sowohl mit Abfangen oder plain old Dekorateure erfolgen. Dies gibt Ihnen viel mehr Flexibilität und hält Ihr Design SOLID (die viel weniger offensichtlich lange hat Laufzeitvorteile).

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 aufzuheben, 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 zur Verwendung von Dekoratoren.

    
Steven 22.02.2013 03:09
quelle
4

Sie haben drei Technologien genannt, die alle dasselbe tun wollen: Fügen Sie einer bestehenden Codebasis Funktionalitäten hinzu, ohne sie zu verändern.

ASP.NET MVC und DI begrenzen beide auf , wo Sie Aspekte haben können (benannte Filter oder Interceptors), weil die Technologie nur in der Lage ist, die Verhaltensweisen an einigen Stellen hinzuzufügen, da sie Ihre nicht bearbeiten können Code. Nur Compiler-basierte Technologien wie PostSharp sind in der Lage, Aspekte überall hinzuzufügen. Alle drei sind jedoch Implementierungen von AOP-Konzepten.

Aspekte haben in vielen Anwendungsfällen Vorteile gegenüber der herkömmlichen objektorientierten Programmierung. Es ist nicht wahr, dass jedes einzelne Problem durch herkömmliches OOP mit besserem Design bei den gleichen Kosten gelöst werden kann. Richtig ist jedoch, dass AOP kein Mainstream ist und dass Kosten und Risiken mit der Verwendung einer nicht-Mainstream-Technologie verbunden sind (AOP wurde in den 90er Jahren und OOP in den 60er Jahren geboren). Wie bei jeder Innovation haben unterschiedliche Akteure eine unterschiedliche Sensibilität zwischen Risiken und Nutzen und können daher zu frühen oder späten Adoptern werden.

AOP ist kein Hindernis für Komponententests, aber es gibt wenig gemeinsame Erfahrung zu diesem Thema. Im Allgemeinen müssen Aspekte als separate Code-Einheiten getestet werden. Es gibt wesentliche und nicht wesentliche Aspekte. In der Regel muss Business Code zusammen mit wesentlichen Aspekten getestet werden, aber nicht wesentliche Aspekte müssen deaktiviert werden. Sie können Aspekte entweder statisch zum Zeitpunkt der Erstellung (nur einige Aspekte aus der Build-Konfiguration ausschließen) oder zur Laufzeit deaktivieren (den Aspekt von einer statischen Variable abhängig machen, die Sie beim Testen auf false gesetzt haben).

    
Gael Fraiteur 26.02.2013 09:26
quelle