Was ist die beste Implementierung für AOP in .Net? [geschlossen]

83

Es gibt viele AOP-Implementierungen in C #, VB.net. Dies sind einige der AOP-Implementierungen:

Was ist die beste Implementierung für AOP in .Net? Was soll ich verwenden?

ecleel
quelle
4
Es wäre hilfreich, wenn Sie Links zu allen AOPs bereitstellen würden, um dem Leser ein wenig Zeit bei Google zu sparen. Ich hoffe, dass diese Frage / Antwort eine großartige Zusammenfassung der verschiedenen AOP-Optionen in .NET
Ian Ringrose
9
52 Personen stimmten dafür, dass dies eine konstruktive Frage ist. 5 stimmten, es ist nicht konstruktiv. Wer hat entschieden? Zumindest sollte der Moderator die Frage ändern oder neu formulieren, aber es ist besser, die Meinung der meisten Menschen zu berücksichtigen.
Zurück
2
@Revious Stimme voll und ganz zu!
Legenden
1
Es ist erstaunlich, dass SO und Leute solche Fragen als OT ablehnen. Solch eine nützliche Frage und Technologie, um zu diskutieren und der Community zu helfen, wird einfach abgelehnt und geschlossen, aber eine Menge altmodischer Leute im Stil der 80er Jahre, die in der Vergangenheit stecken geblieben sind. Also, die Welt hat sich verändert. Es ist völlig verständlich, dass Sie bei der Beantwortung spezifischer Fragen helfen möchten, aber zumindest einen Link in Ihrem "geschlossenen" Tag angeben, an dem Sie solche Fragen stellen können. Das würde viel helfen und diese Art von Dummheit vermeiden.
Pixel

Antworten:

45

Ich denke, dass Castle Dynamic Proxy die Lösung der Wahl ist, wenn dynamisches Abfangen Ihre Anforderungen erfüllen kann. Dieses Framework wird intern von vielen anderen Frameworks verwendet, die AOP-Funktionen anbieten möchten. In der Regel bieten die meisten vorhandenen IoC-Container jetzt einige dynamische Abfangmechanismen (Spring.NET, Castle Windsor, StructureMap usw.). Wenn Sie bereits mit einem IoC-Container arbeiten, ist es möglicherweise einfacher, die darin enthaltenen Vorschläge zu überprüfen.

Wenn das dynamische Abfangen Ihre Anforderungen nicht erfüllen kann (Weben einer versiegelten Klasse, Abfangen nicht virtueller Anrufe usw.), möchten Sie auf jeden Fall statisches Weben. PostSharp ist die Referenz in dieser Domäne.

Beachten Sie, dass es auch Linfu gibt, mit dem beide AOP-Moden genutzt werden können.

Romain Verdier
quelle
3
+1 darauf, wenn Sie Laufzeit-AOP ausführen möchten. +1 auf PostSharp, wenn Sie Zeit nach der Kompilierung wünschen AOP
Krzysztof Kozmic
Irgendwelche Updates zu dieser Antwort? Oder ist das noch gültig? Ich habe mich besonders gefragt, wie Spring.Aop im Vergleich zu Castle und PostSharp
Evren Kuzucuoglu
1
Leider ist PostSharp ein kommerzielles Produkt
Pixel
Postsharp ist ein kommerzielles Produkt, nicht kostenlos. Bitte raten Sie etwas anderes zum statischen Weben.
Shivam Sachan
@ShivamSachan Nur weil etwas kostenlos ist, macht es nicht gut. Die meisten kostenlosen AOP in .net sind mit den letzten Updates vor 2-5 Jahren gestorben. PostSharp ist immer noch der Klassenbeste.
Offler
15

"Best" ist subjektiv.

Erstellen Sie zunächst eine Liste der von Ihnen benötigten Funktionen, Ihrer Architektur usw. Suchen Sie dann nach Optionen, die das tun, was Sie benötigen, ohne unnötige Komplexität einzuführen. Einige sind beispielsweise schnittstellenorientiert: Ist Ihr Code derzeit schnittstellenorientiert? Wenn nicht, ist PostSharp möglicherweise die bessere Wahl (in die ursprünglichen Klassen eingewebt). Aber natürlich kann PostSharp nicht zur Laufzeit konfiguriert werden ... Pferde für Kurse.

Marc Gravell
quelle
Sie könnten das, was Sie gesagt haben, wie folgt umformulieren: "Das Beste ist subjektiv, ich werde eine Liste der Pro und Contros für einige dieser Frameworks erstellen."
Zurück
11

Der beste Weg zur aspektorientierten Programmierung in .NET ist die Verwendung bekannter Designtechniken. Durch die Anwendung der SOLID-Prinzipien können Sie beispielsweise die Flexibilität und Modularität erreichen, die Sie benötigen, um Querschnittsthemen hinzuzufügen. Wenn Sie das richtige Design haben, können Sie sogar die meisten Querschnittsthemen ohne Rahmen anwenden. Es ist ein Trugschluss zu glauben, dass OOP nicht für AOP geeignet ist.

Hier sind einige Hinweise:

  • Hängen Sie nicht von konkreten Instanzen ab, sondern von Abstraktionen.
  • Mischen Sie keine Querschnittsthemen und Geschäftslogik in derselben Klasse.
  • Hinzufügen von Querschnittsthemen durch Umschließen von Klassen mit Geschäftslogik in Klassen, die diese Bedenken implementieren ( Dekorateure ).
  • Finden Sie häufig vorkommende Artefakte in Ihrem Design und modellieren Sie sie gleichermaßen, vorzugsweise mit derselben Art von Abstraktionen. Schauen Sie sich dies und das zum Beispiel an.

Wenn Sie die richtigen Abstraktionen eingerichtet haben, müssen Sie dem System nur neue Querschnittsthemen hinzufügen, indem Sie eine neue Dekorationsklasse schreiben und sie um die richtigen Implementierungen wickeln. Wenn Abstraktionen generisch sind, können Sie einen einzelnen Dekorateur um eine große Gruppe von Klassen wickeln (genau darum geht es bei AOP).

Obwohl Techniken wie dynamische Proxys und das Weben von Code das Arbeiten mit einer schlecht gestalteten Anwendung erleichtern könnten, gibt es für gutes Design wirklich keine Alternative. Früher oder später werden Sie sich verbrennen. Dies bedeutet jedoch nicht, dass die dynamische Proxy-Generierung und das Weben von Code nicht verwendet werden sollten. Aber ohne ein richtiges Anwendungsdesign sind selbst diese Techniken nur unwesentlich hilfreich.

Steven
quelle
AOP ist die nächste Abstraktionsebene. Tatsächlich ist es die Einschränkung der Vererbung und Zusammensetzung, die zu AOP führt. Haben Sie den Entlib-Ausnahmeblock gesehen? Aspect ist viel sauberer als das Aufrufen dieses verdammten Blocks für jeden einzelnen Aufruf der Datenbank, nur um zu versuchen, das Protokoll zu fangen.
Sleeper Smith
2
Wenn Sie jeden Aufruf Ihrer Datenbank mit einem Ausnahmeblock abschließen, machen Sie es trotzdem falsch. Es kommt auf gutes Design zurück. Immer.
Steven
Also, anstatt DB-Ausnahmen zu fangen, was ist der richtige Weg?
OutOFTouch
2
@OutOFTouch: Sehen Sie sich die Antwort auf diese SO-Frage an .
Steven
2
@SleeperSmith: Obwohl ich nicht sicher bin, was "AOP ist die nächste Abstraktionsebene" bedeutet, denke ich, dass Sie große Systeme ohne die Verwendung von AOP nicht wartbar halten können. Ich glaube an die Anwendung von AOP. AOP ist jedoch ein Paradigma; kein Werkzeug. Ich stimme der Einschränkung der Vererbung zu, aber es ist keine Einschränkung der Zusammensetzung, die zu AOP führt. Es ist das Fehlen eines geeigneten Designs, das zur Verwendung von Code-Web- und dynamischen Proxy-Tools führt. Ich wende Querschnittsthemen mit Dekorateuren an. Dies ist meine bevorzugte Methode zur Anwendung von AOP.
Steven
5

Ich weiß nicht, was am besten ist, es gibt viele Frameworks und nicht genug Stunden am Tag, um sie alle auszuprobieren.

Ich habe PostSharp verwendet und war angenehm überrascht, wie einfach es ist, damit zu beginnen.

Ich habe mich auch mit Castle Windsor und Spring.Net mit AOP befasst. Der Ansatz ist unterschiedlich (Laufzeit vs. Kompilierungszeit). Das Mischen von AOP und IoC scheint sinnvoll zu sein. Wenn Sie noch keines dieser Frameworks verwenden, ist es viel mehr Arbeit, um loszulegen, aber lassen Sie sich davon nicht aufhalten.

Für neue Projekte würde ich jetzt wahrscheinlich Castle Windsor verwenden, aber das liegt hauptsächlich daran, dass ich auch IoC verwenden möchte. Wenn ich AOP schnell in eine vorhandene Codebasis implementieren müsste, würde ich PostSharp verwenden.

Mendelt
quelle