Jestem uczestnikiem Castle, przyczyniając się do Dynamic Proxy, więc mogę być stronniczy, ale generalnie uważam, że Dynamic proxy Castle jest znacznie lepszym rozwiązaniem. Mówię tutaj o LinFu DynamicProxy v1.0, ponieważ to jest to, co znam. LinFu.Proxy 2 bazuje na Mono.Cecil i jest przepisywany od zera.
- Zamek obejmuje szerszy zakres scenariuszy.
- Zamek ma (dużo) większą bazę użytkowników i jest sprawdzony w wielu zastosowaniach komercyjnych OSS i
- Zamek jest faktycznie wykonujący lepiej (link)
- zamek czystsze, łatwiejsze w użyciu API na przykład wywołując metodę docelową do zamku DynamicProxy wygląda następująco:
invocation.Proceed();
dla LinFu, wygląda to tak (rzeczywista nazwa metody/nieruchomość może zmieniać się jak piszę z pamięci)
//invocation.TargetMethod is MethodInfo, so you're using reflection
invocation.TargetMethod.Invoke(invocation.Target,invocation.Parameters);
- Zamek posiada aktywną grupę użytkowników, gdzie można szybko uzyskać odpowiedzi na swoje pytania.
Problem z wydajnością, o którym wspomina druga odpowiedź, nie jest problemem DynamicProxy, ale jest wynikiem błędu w implementacji BCL przez Microsoft (w Mono nie ma takiego problemu BTW). Dzieje się tak tylko wtedy, gdy masz wiele (ponad 200) typów proxy w pojedynczym ModuleScope.
Rozwiązanie jest trywialne - nie generuj wielu typów proxy (zwykle nie musisz) lub użyj wielu ModuleScopes/ProxyGenerators (na przykład Rhino.Mocks używa tego podejścia)
Osobiście nie rozwijam się na Mono, więc nie mam doświadczenia z pierwszej ręki, jednak są biblioteki korzystające z Castle DP na Mono, i nie dostaliśmy żadnych komplikacji, więc myślę, że to działa po prostu w porządku.
Od mojego benchmarku kilka miesięcy temu nie było nowego wydania Castle DP (nowa wersja jest przeznaczona na koniec roku). LiFu ma wersję 2.0, ale nie jestem pewien, czy jest to tylko trunk, czy wydany. Nie wiem o Spring or Unity.
@ Krzysztof - Dziękuję za link do testów wydajności, które uruchomiłeś. Widzę, że testy były około 6 miesięcy temu. Czy próbowałeś ponownie uruchomić testy z najnowszymi wersjami każdej struktury? Nie jestem pewien, czy od tego czasu pojawiły się nowe wersje. Ponadto, zapomniałem o jednej rzeczy w moim pytaniu i zredagowałem ją. Czy mógłbyś edytować swoją odpowiedź, aby uwzględnić testy dowolnego doświadczenia w Mono? –
Przeprowadziłem testy Dynamic Proxy (trunk) w wersji 2.1. O ile czasy intercepcji się nie zmieniły (i działa ** bardzo szybko), generacja typu proxy jest teraz wielokrotnie szybsza –
@ KrzysztofKoźmic, Jaka byłaby Twoja obecna rekomendacja, między Castle a Lin Fu? – smartcaveman