2009-03-11 20 views
71

Istnieje wiele implementacji AOP w C#, VB.net. to niektóre z AOP implementacjach:Jakie jest najlepsze wdrożenie AOP w .Net?

Jakie jest najlepsze wdrożenie AOP w .Net? Co powinienem użyć?

+4

Byłoby pomocne, gdybyś zawierał linki do całego AOP, aby oszczędzić czytelnikowi trochę czasu w Google. Mam nadzieję, że to pytanie/odpowiedzi staną się wspaniałym podsumowaniem różnych opcji AOP w .NET –

+9

52 osoby głosowały za konstruktywnym pytaniem. 5 głosowało, że nie jest konstruktywne. Kto zdecydował? Przynajmniej moderator powinien zmienić lub przeformułować pytanie, ale lepiej rozważyć większość opinii ludzi. – Revious

+2

@Revious Całkowicie się zgadzam! – Legends

Odpowiedz

38

Myślę, że Castle Dynamic Proxy jest rozwiązaniem z wyboru, jeśli przechwytywanie dynamiczne może zaspokoić Twoje potrzeby. Ta struktura jest używana wewnętrznie przez wiele innych frameworków, które chcą oferować możliwości AOP. Zazwyczaj większość istniejących kontenerów IoC zapewnia obecnie mechanizmy dynamicznego przechwytywania (Spring.NET, Castle Windsor, StructureMap itd.). Jeśli już pracujesz z kontenerem IoC, być może łatwiej będzie spojrzeć na to, co proponuje.

Jeśli przechwycenie dynamiczne nie może zaspokoić twoich potrzeb (tkanie zamkniętej klasy, przechwytywanie nie-wirtualnego połączenia itd.), To na pewno chcesz statycznego tkania. PostSharp jest odniesieniem w tej domenie.

Należy pamiętać, że istnieje również Linfu, który może być użyty do wykorzystania obu metod AOP.

+2

+1 do tego, jeśli chcesz wykonać AOP w czasie wykonywania. +1 na PostSharp, jeśli chcesz czas po kompilacji AOP –

+0

Dowolna aktualizacja tej odpowiedzi? Czy jest to nadal ważne? Szczególnie zastanawiałem się, jak Spring.Aop porównuje się do Castle i PostSharp –

+1

Niestety, PostSharp jest komercyjnym produktem – pixel

12

"Najlepszy" jest subiektywny.

Najpierw przygotuj listę potrzebnych funkcji, architekturę itp. Następnie szukaj opcji, które wykonają to, czego potrzebujesz, bez wprowadzania niepotrzebnej złożoności. Na przykład kilka interfejsów jest zorientowanych na interfejsy: czy Twój kod jest obecnie zorientowany na interfejs? Jeśli nie, PostSharp może być lepszym wyborem (wplecionym w oryginalne klasy). Oczywiście PostSharp nie może być skonfigurowany w czasie wykonywania ... koni na kursy.

+0

możesz przeformułować to, co powiedziałeś w następujący sposób: "Najlepsze jest subiektywne, sporządzę listę pro i contros dla niektórych z tych ram". – Revious

4

Nie wiem, najlepiej, jest wiele frameworków i zbyt mało godzin w ciągu dnia, aby wypróbować je wszystkie.

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

Zajrzałem także do AOP z Castle Windsor i Spring.Net, podejście jest inne (czas wykonania w porównaniu do czasu kompilacji). Mieszanie AOP i IoC wydaje się mieć sens. Jeśli nie używasz żadnej z tych frameworków, to na początek trzeba dużo pracy, ale nie pozwól, aby to cię powstrzymało.

W przypadku nowych projektów prawdopodobnie użyłbym już Castle Windsor, ale to głównie dlatego, że chciałbym również użyć IoC. Gdybym musiał szybko wdrożyć AOP do istniejącej bazy kodu, użyłbym PostSharp.

11

Najlepszym sposobem na programowanie aspektowe w .NET jest użycie dobrze znanych technik projektowania. Na przykład, dzięki zastosowaniu modelu SOLID principles, możesz uzyskać elastyczność i modułowość, które są potrzebne, aby umożliwić dodanie zagadnień przekrojowych. Jeśli masz odpowiedni projekt, będziesz w stanie zastosować najbardziej przekrojowe zagadnienia bez żadnych ram. Błędem jest sądzić, że OOP nie nadaje się do robienia AOP.

Oto kilka wskazówek:

  • nie zależą od konkretnych przypadków, ale zależą od abstrakcji.
  • Nie mieszaj zagadnień przekrojowych i logiki biznesowej w tej samej klasie.
  • Dodanie zagadnień przekrojowych przez zawijanie klas za pomocą logiki biznesowej w klasach implementujących te obawy (decorators).
  • Znajdź wspólne artefakty w swoim projekcie i modeluj je jednakowo, najlepiej używając tego samego typu abstrakcji. Spójrz na przykład na this i this.

Gdy masz odpowiednie abstrakcje, dodanie do systemu nowych zagadnień przekrojowych jest tylko kwestią napisania nowej klasy dekoratorów i zawinięcia jej wokół właściwych implementacji. Jeśli abstrakcje są ogólne, możesz zawijać jednego dekoratora wokół dużej grupy klas (o to właśnie chodzi w AOP).

Chociaż techniki takie jak dynamiczne proxy i tkanie kodu mogą ułatwić pracę ze źle zaprojektowaną aplikacją, nie ma naprawdę alternatywy dla dobrego projektu. Wcześniej czy później zostaniesz spalony. 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ą po prostu mało przydatne.

+0

AOP to kolejny poziom abstrakcji. W rzeczywistości to ograniczenie dziedziczenia i kompozycji prowadzi do AOP. Czy widziałeś blokowanie wyjątków Entlib? Aspekt jest o wiele czystszy, niż wywoływanie tego przeklętego bloku dla każdego pojedynczego wywołania w bazie danych, aby tylko spróbować złapać log-throw. –

+2

Jeśli zawiniesz każde wywołanie do bazy danych z blokiem wyjątków, i tak zrobisz to źle. Wraca do dobrego projektu. Zawsze. – Steven

+0

A więc zamiast przechwytywać wyjątki db, jaka jest właściwa droga? – OutOFTouch

Powiązane problemy