Blog programisty o C/C++ i PHP

Programowanie w C/C++ i PHP. Blog pełen wskazówek, porad, analiz i opisów.

Spring.NET framework - moje pierwsze samodzielne kroki i doświadczenia i projekt dynamicznego proxy.

czerwiec 24th, 2010 in Programowanie w C#

Spring’a używam już od kilku miesięcy, jednak bardziej użytkowo i troszkę zautomatyzowanie. Aby stworzyć własny projekt C#.NET’owy z wykorzystaniem tego frameworka trzeba poczytać już troszkę więcej i zrozumieć kilka rzeczy. Kiedy już sobie ściągnąłem Spring’a ze strony http://www.springframework.net/, zabrałem się do czytania dość sporego PDF’a. I tak po stworzeniu kilku modułowego projektu testowego z przykładowymi prostymi klasami stworzyłem pliki konfiguracyjne Spring’a, po czym dokonałem zainstancjonowania głównego kontenera IoC w main’ie projektu.  No i świetnie wszystko zadziałało w dodatku z użyciem w pełni deklaratywnej konfiguracji frameworka. No ale nie tak wszystko mi się podobało. Mimo iż nie pobrałem z kontenera żadnego obiektu, to załadowały się wszystkie zbiory (ang. assemblies) do których należały klasy dodane w Springowych XML’ach. Byłem rozczarowany, gdyż wszystkie były singleton’ami (domyślnie) i miały dodatkowy atrybut “lazy-init”. W związku z tym oczekiwałem, że moduł załaduje się dopiero gdy poproszę o obiekt.

No i tak doszedłem do przekonania ze zamiast obiektów Springowi można byłoby zapodawać nie klasy właściwe lecz dynamiczne proxy do nich (ang. dynamic proxy) zaprogramowane tak, by odpowiednio zareagować, gdy określona klasa nie jest jeszcze dostępna. Szperałem po różnych zestawach bibliotecznych .NET’a i nie znalazłem zbyt fajnego rozwiązania. Są niby jakieś proxy, ale odnoszą się bardziej do remote’ingu i technologii COM/ActiveX.  Ręczne tworzenie klas proxy dla dowolnej klasy, jest zajęciem niezbyt przyjemnym w dodatku nie zawsze trywialnym, bo musimy także zawrzeć w proxy te składowe publiczne, które odziedziczyliśmy po innych klasach. Znalazłem jednak pewne rozwiązanie w postaci dynamicznego tworzenia klas i kompilacji w locie.

Najpierw stworzyłem sobie model bazowego dynamicznego proxy, a następnie wyprowadziłem przykładową klasę proxy dla konkretnej jednej klasy docelowej w innym zbiorze. Posłużyło mi to jako model wzorcowy podczas korzystania z CodeDom’u. Ostatecznie w katalogu z binariami w którym odpalana jest skompilowana aplikacja, utworzyłem dynamicznie DLL’kę zawierającą proxy do mojej klasy w innym zbiorze wynikowym, no i co ważne proxy rzeczywiście zadziałało tak jak oczekiwałem i biblioteka z klasą docelową załadowała się przy pierwszym odwołaniu się do którejkolwiek z metod publicznych.

Na razie nie wszystko jest skończone. Muszę dodać przekierowania dla publicznych własności, bo na razie są obsłużone tylko metody.  Wiążę z tym pomysłem jeszcze kilka ciekawych rozwiązań wspomagających (w tym optymalizację)  i rozwojowych. Jedno z nich skieruje prace rozwojowe na tory automatycznego zarządzania zużyciem pamięci przez warstwę usług w aplikacji.

Dla dla ciekawostki i porównania takie dynamiczne proxy w PHP, to po prostu banał na kilkanaście linijek ;-))))

Tags: , , , , ,

Leave a Reply