2009-09-10 21 views
30

Chciałbym dodać logikę do biblioteki, nad którą pracuję, co wymagałoby dynamicznego serwera proxy. Chciałbym uzyskać porady od użytkowników, którzy korzystali z tych dwóch bibliotek w środowisku produkcyjnym. Czy jeden wykonuje drugi, czy są jakieś niedociągnięcia, które sprawiają, że musisz przełączyć się na drugą itd. Zasadniczo opowiedz mi o swoich doświadczeniach z biblioteką. Odpowiedzi pomogą mi zdecydować, którego użyć.Jakie są różnice między LinFu.DynamicProxy i Castle.DynamicProxy?

- Edit -


Zapomniałem wspomnieć, że biblioteka Zajmuję wesprze Mono, dlatego każdy może podzielić się wiedzą Państwo o dwóch bibliotek i ich poparcie dla Mono byłoby także świetne.

Odpowiedz

20

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.

+0

@ 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? –

+0

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 –

+0

@ KrzysztofKoźmic, Jaka byłaby Twoja obecna rekomendacja, między Castle a Lin Fu? – smartcaveman

10

Linfu to bardziej lekki generator proxy niż generator proxy Zamku.

Przy podejmowaniu decyzji, którego użyć, szczerze mówiąc, nie robi to wielkiej różnicy.

Według autora, Linfu znacznie przewyższy generator Zamku, ale w moich własnych obserwacjach rzeczywistego użytkowania różnica prędkości jest marginalna.

Powiedziawszy, że Linfu będzie przewyższał Castle, i nie jestem świadomy niczego, co Castle ma nad tym, więc zawsze używam Linfu.

+1

Co masz na myśli mówiąc "lekki"? –

+1

Przez lekkie mam na myśli mniej kodu, mniejszy montaż i (OK, prawdopodobnie w zależności od tego, jak go używasz) szybciej. – Cocowalla

+0

@Cocowalla - Czy używasz najnowszej wersji opartej na Mono.Cecil. Czy możesz dzielić się doświadczeniami z LinFu w Mono? –

Powiązane problemy