Zunächst möchte ich Max antworten: Aspekte sind in der Tat keine alternativ zu guten OOP-Mustern. Sie sind ein ergänzen . Jeder gute AOP-Entwurf beginnt mit einem guten OOP-Entwurf. Aber OOP-Muster zwingen Sie manchmal dazu, eine Menge Plumbing-Code manuell zu schreiben. In diesen Fällen können Aspekte verwendet werden, um automatisieren die Implementierung des OOP-Musters, pas um sie zu ersetzen.
Wenn Sie AOP intelligent einsetzen, ist Ihre Lösung leichter zu verstehen (der Geschäftscode wird nicht mit dem Wartungscode vermischt), zu testen (Sie können den Aspekt unabhängig vom Geschäftscode testen, d. h. Sie müssen nicht testen, ob eine Geschäftsmethode richtig funktioniert) und zu ändern (Sie müssen nur den Aspekt ändern, wenn Sie das Muster ändern wollen, anstatt jede Implementierung des Musters zu ändern). Wenn Sie nun AOP missbrauchen, wenn Sie es als Hacking-Tool verwenden, wenn Sie nicht vorher in Bezug auf OOP-Muster denken, dann wird Ihnen AOP mehr Kosten als Nutzen bringen. Wie jedes scharfe Werkzeug sollte auch AOP intelligent eingesetzt werden.
Zurück zur ursprünglichen Frage.
Wer sagt Ihnen, dass Sie Aspekte in AssemblyInfo.cs einfügen sollten? Sie könnten eine neue Datei namens GlobalAspects.cs erstellen und alle Aspekte auf Baugruppenebene dort ablegen. Sie haben Recht, dass AssemblyInfo.cs nur für Metadaten auf Baugruppenebene sein sollte.
Aber wie Sie mag ich keine Aspekte auf Montageebene. Ich denke, sie sollten vermieden werden. Das Hauptproblem mit Aspekten auf Baugruppenebene ist, dass sie auf Namenskonventionen beruhen, und das ist ein Übel. (Dieses Übel wird als punktuelle Fragilität in der akademischen AOSD-Gemeinschaft). Wenn Sie nämlich eine Klasse oder einen Namensraum umbenennen, ändern Sie die Menge der Methoden, für die der Aspekt gilt, und das kann schnell zu einem Albtraum werden. Aus diesem Grund verwende ich für mich selbst nie Aspekte, die auf Namenskonventionen basieren.
Wie sieht es mit der Lesbarkeit des Codes aus? Ich denke, lesbarer Code ist zu einem großen Teil kurzer Code. Wenn ich eine Geschäftsmethode namens CreateProduct habe, möchte ich wahrscheinlich nur den Code sehen, der das Produkt erstellt. Die meiste Zeit bin ich nicht an Code interessiert, der Transaktionen, Ausnahmen oder Tracing behandelt. Es reicht mir, wenn ich weiß, dass einige Aspekte das für mich erledigen.
Und woher weiß ich das? Mit PostSharp haben Sie die Visual Studio Extension. Für AspectJ gibt es das AspectJ-Plug-in für Eclipse (AJDT). Sie zeigen Ihnen innerhalb der IDE, welche Aspekte auf den Code angewendet werden, den Sie gerade sehen. Und wenn Sie wirklich Details sehen wollen (was aber selten der Fall ist), können Sie den Debugger verwenden, um in Aspekte einzugreifen, oder Reflector verwenden, um den erzeugten Code zu sehen.
Zusammenfassung:
- Ein gutes AOP-Design beginnt immer mit einem guten OOP-Design.
- Vermeiden Sie es, sich bei der Anwendung von Aspekten auf Namenskonventionen zu verlassen.
- Verwenden Sie die PostSharp-Erweiterung für Visual Studio oder AJDT, um Aspekte in Ihrem Code zu visualisieren.