2013-02-21 9 views
8
  1. ASP.NET MVC schlägt vor, integrierte Autorisierung, Aktion, Ergebnis, Ausnahmefilter zu verwenden oder zu erweitern.
  2. Dritte Partei .Net IoC-Container (Unity, Ninject, Autofac) schlagen Interzeptoren vor
  3. Drittpartei-AOP-Tools (Postsharp) schlagen ihre Attribute vor.

Jetzt bin ich vermasselt. Vielleicht vermische ich sie alle. Ich möchte robusten Code und stabile Methodik bauen, was soll ich verwenden?AOP vs MVC FilterAttributes vs Interzeptoren

Antwort

6

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.

+0

Wie wirkt sich die Kompilierzeit-Injektion auf die Komponententests aus? Sie werden nicht einmal Komponententest ohne zu kompilieren Sie wissen? – jfar

+0

@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

+0

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

4

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

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

Aspekte haben sich in vielen Anwendungsfällen gegenüber der herkömmlichen objektorientierten Programmierung bewährt. Es ist nicht wahr, dass jedes einzelne Problem durch herkömmliche 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 Anwendern werden.

AOP ist kein Hindernis für Komponententests, aber es gibt wenig geteilte 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 Geschäftscode zusammen mit wesentlichen Aspekten getestet werden, nicht wesentliche Aspekte müssen jedoch 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 während des Tests auf false gesetzt haben).

+1

Können Sie auf einen Artikel Bezug nehmen, in dem die wesentlichen und nicht wesentlichen Aspekte näher erläutert werden? – Steven

+1

@Steven Ich habe keinen einzigen Artikel im Sinn. Das Konzept des nicht-essentiellen Aspekts wird in der wissenschaftlichen Literatur tatsächlich als "harmloser Rat" bezeichnet. Dies bedeutet, dass der Aspekt rein orthogonal zu seinem Ziel (dem Basiscode) ist und entfernt werden kann, ohne sein Ergebnis zu beeinflussen. Beispielsweise sind Protokollierung und Leistungsüberwachung zwar harmlos, die Transaktionsverarbeitung oder INotifyPropertyChanged jedoch nicht. –

+0

Schauen Sie sich [Folie 12 in dieser Präsentation] an (http://www.dantasfiles.com/daniel/research/Harmless%20Advice%20 (FOOL)% 20Slides.pdf) –