Jaka jest najlepsza implementacja AOP w .Net? [Zamknięte]

83

Jest dużo implementacji AOP w C #, VB.net. oto niektóre z wdrożeń AOP:

Jaka jest najlepsza implementacja AOP w .Net? Czego powinienem użyć?

ecleel
źródło
4
Byłoby pomocne, gdybyś podał linki do wszystkich AOP, aby zaoszczędzić czytelnikowi trochę czasu z Google. Mam nadzieję, że to pytanie / odpowiedź będzie doskonałym podsumowaniem różnych opcji AOP w .NET
Ian RINGROSE
10
Głosowały 52 osoby. To konstruktywne pytanie. 5 głosowało, że to nie jest konstruktywne. Kto zdecydował? Przynajmniej moderator powinien zmienić lub przeformułować pytanie, ale lepiej rozważyć opinię większości ludzi.
Revious
2
@Revious Całkowicie się zgadzam!
Legends
1
To niesamowite, że SO i ludzie negatywnie oceniają takie pytania jako OT. Takie przydatne pytanie i technologia do omawiania i pomagania społeczności zostaje po prostu odrzucona i zamknięta, ale grupa staroświeckich ludzi w stylu lat 80-tych utknęła w przeszłości. WIĘC, świat się zmienił. Jest całkowicie zrozumiałe, że chcesz pomóc w odpowiedzi na konkretne pytania, ale przynajmniej podać link w swoim „zamkniętym” tagu, gdzie można publikować takie pytania. To by bardzo pomogło i pozwoliło uniknąć tego rodzaju głupoty.
pixel

Odpowiedzi:

45

Myślę, że Castle Dynamic Proxy jest rozwiązaniem z wyboru, jeśli dynamiczne przechwytywanie może obsłużyć Twoje potrzeby. Ta struktura jest używana wewnętrznie przez wiele innych platform, które chcą oferować możliwości AOP. Zazwyczaj większość istniejących kontenerów IoC zapewnia teraz pewne dynamiczne mechanizmy przechwytywania (Spring.NET, Castle Windsor, StructureMap itp.). Jeśli już pracujesz z kontenerem IoC, może łatwiej byłoby przyjrzeć się temu, co on proponuje.

Jeśli dynamiczne przechwytywanie nie może zaspokoić twoich potrzeb (tkanie zapieczętowanej klasy, przechwytywanie połączenia niewirtualnego itp.), Z pewnością chcesz tkać statyczne. PostSharp to odniesienie w tej domenie.

Zauważ, że istnieje również Linfu , które można wykorzystać do wykorzystania obu modów AOP.

Romain Verdier
źródło
3
+1 w tym, jeśli chcesz zrobić AOP w czasie wykonywania. +1 na PostSharp, jeśli chcesz mieć czas po kompilacji AOP
Krzysztof Kozmic
Jakieś aktualizacje tej odpowiedzi? Czy jest to nadal aktualne? Szczególnie zastanawiałem się, jak Spring.Aop wypada w porównaniu z Castle i PostSharp
Evren Kuzucuoglu.
1
niestety, PostSharp to produkt komercyjny
piksel
Postsharp to produkt komercyjny, a nie darmowy. Proszę doradzić cokolwiek innego dla tkania statycznego.
Shivam Sachan
@ShivamSachan Tylko dlatego, że coś jest darmowe, nie czyni tego dobrym. Większość bezpłatnych AOP w .net zmarła wraz z ostatnimi aktualizacjami 2-5 lat temu, PostSharp nadal jest najlepszy w swojej klasie.
Offler
15

„Najlepsze” jest subiektywne.

Najpierw przygotuj listę potrzebnych funkcji, swoją architekturę itp. Następnie poszukaj opcji, które zrobią to, czego potrzebujesz, bez wprowadzania niepotrzebnej złożoności. Na przykład kilka z nich jest zorientowanych na interfejs: czy Twój kod jest obecnie zorientowany na interfejs? Jeśli nie, PostSharp może być lepszym wyborem (wpleciony w oryginalne klasy). Ale oczywiście PostSharp nie może być konfigurowany w czasie wykonywania ... konie do kursów.

Marc Gravell
źródło
możesz przeformułować to, co powiedziałeś w następujący sposób: „Najlepsze jest subiektywne, sporządzę listę za i przeciw dla niektórych z tych ram”.
Revious
11

Najlepszym sposobem programowania zorientowanego aspektowo w .NET jest użycie dobrze znanych technik projektowania. Na przykład, stosując zasady SOLID , możesz osiągnąć elastyczność i modułowość, których potrzebujesz, aby umożliwić dodawanie problemów związanych z przekrojami. Jeśli masz odpowiedni projekt, będziesz w stanie zastosować większość przekrojowych problemów bez żadnych ram. Myślenie, że OOP nie nadaje się do robienia AOP jest błędem.

Oto kilka wskazówek:

  • Nie polegaj na konkretnych instancjach, ale polegaj na abstrakcjach.
  • Nie mieszaj przekrojowych zagadnień i logiki biznesowej w tej samej klasie.
  • Dodawanie zagadnień przekrojowych poprzez opakowywanie klas logiką biznesową w klasy, które implementują te obawy ( dekoratory ).
  • Znajdź w projekcie typowe artefakty i modeluj je jednakowo, najlepiej przy użyciu tego samego typu abstrakcji. Spójrz na to i to na przykład.

Gdy masz już odpowiednie abstrakcje, dodanie nowych przekrojowych problemów do systemu jest po prostu kwestią napisania nowej klasy dekoratora i owinięcia jej wokół odpowiednich implementacji. Jeśli abstrakcje są ogólne, możesz owinąć pojedynczy dekorator wokół dużej grupy klas (o to właśnie chodzi w AOP).

Chociaż techniki takie jak dynamiczne serwery proxy i tkanie kodu mogą ułatwić pracę ze źle zaprojektowaną aplikacją, tak naprawdę nie ma alternatywy dla dobrego projektu. Wcześniej czy później zostaniesz poparzony. Nie oznacza to jednak, że nie należy używać dynamicznego generowania proxy i tkania kodu. Ale bez odpowiedniego projektu aplikacji nawet te techniki będą tylko marginalnie pomocne.

Steven
źródło
AOP to kolejny poziom abstrakcji. W rzeczywistości to ograniczenie dziedziczenia i składu prowadzi do AOP. Czy widziałeś blok wyjątków Entlib? Aspect jest o wiele czystszy niż wywoływanie tego przeklętego bloku przy każdym wywołaniu bazy danych, tylko po to, aby spróbować-catch-log-throw.
Sleeper Smith
2
Jeśli zawijasz każde wywołanie do bazy danych blokiem wyjątków, i tak robisz to źle. Wraca do dobrego projektu. Zawsze.
Steven
Więc zamiast łapać wyjątki db, jaki jest właściwy sposób?
OutOFTouch
2
@OutOFTouch: spójrz na odpowiedź na to pytanie SO .
Steven,
2
@SleeperSmith: chociaż nie jestem pewien, co oznacza „AOP to następny poziom abstrakcji”, myślę, że nie można utrzymywać dużych systemów w utrzymaniu bez użycia AOP. Wierzę w stosowanie AOP. Jednak AOP jest paradygmatem; nie narzędzie. Zgadzam się z ograniczeniem dziedziczenia, ale to nie ograniczenie składu prowadzi do AOP. To brak odpowiedniego projektu prowadzi do używania tkania kodu i narzędzi dynamicznego proxy. Stosuję zagadnienia przekrojowe z wykorzystaniem dekoratorów. To jest mój ulubiony sposób stosowania AOP.
Steven
5

Nie wiem co najlepsze, jest dużo frameworków i za mało godzin w ciągu dnia, aby je wszystkie wypróbować.

Użyłem PostSharp i byłem mile zaskoczony, jak łatwo jest zacząć z nim.

Przyjrzałem się również AOP z Castle Windsor i Spring.Net, podejście jest inne (czas wykonania vs czas kompilacji). Mieszanie AOP i IoC wydaje się mieć sens. Kiedy nie używasz żadnego z tych frameworków, to dużo więcej pracy, aby rozpocząć, ale nie pozwól, aby Cię to powstrzymało.

Do nowych projektów prawdopodobnie używałbym teraz Castle Windsor, ale to głównie dlatego, że chciałbym również używać IoC. Gdybym musiał szybko zaimplementować AOP w istniejącej bazie kodu, użyłbym PostSharp.

Mendelt
źródło