Archive for the 'Programowanie' Category

Niesforny statyczny konstruktor w C#

Wpis bardziej ‘ku pamięci’, ale może komuś zaoszczędzić kłopotów ;-)

Załóżmy, że mamy taki oto kod:

    class First
    {
        static First()
        {
            Console.WriteLine("First static constructor");
        }

        public static void DoSth()
        {
            Console.WriteLine("Let's do sth");
        }
    }

    class Second : First
    {
        static Second()
        {
            Console.WriteLine("Second static constructor");
        }
    }

Jeśli wywołamy metodę First.DoSth() w outpucie otrzymamy:

First static constructor
Let's do sth

Jeśli jednak spróbujemy z Second.DoSth() otrzymamy… to samo?! A gdzie wykonanie statycznego konstruktora klasy Second? Wszak w dokumentacji MSDN możemy przeczytać:

A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.

I… to się zgadza! Podejrzyjmy Reflectorem jak kompilator zbudował aplikację:

W związku z tym, iż metoda DoSth() jest w klasie First, kompilator ‘olewa’ nasze wywołanie przez klasę Second, przez co statyczny konstruktor tej drugiej się nie wykona. Jest to o tyle niebezpieczne (co sam w swoim kodzie ‘przetestowałem’), że jeśli metoda DoSth() jest w jakikolwiek sposób zależna od wyniku statycznego konstruktora (a wcześniej nic i nikt nie odwoływał się do Second), to możemy spędzić trochę czasu na szukaniu błędu…

BlipTags

Cóż, Blip mi się jakoś spodobał ;-) Niestety, brakowało mi jednej funkcjonalności – jakiegoś centralnego miejsca ułatwiającego poruszanie się po tagach. Fakt, jest BlipCast, ale nie miał on chmury tagów ;-) Stąd też mając chwilę czasu w kilka godzin (choć na przestrzeni tygodnia) powstał skrypt umożliwiający przeglądanie tagów. Pokazuje on chmurki tagów, ich powiązania między sobą, otagowane zdjęcia oraz użytkowników-top-tagerów.

BlipTags

Jak na razie mój BlipBot bada wiadomości z przed kilku tygodni, dlatego też nowe statusy zostaną przejrzane później.

Ale to brzydkie!

Tak, wiem o tym doskonale. Są to niestety strzępy layoutu zrobionego kiedyś przez Geta dla ‘portaluktóryjużistniećniebędzie’ ;-) Designer ze mnie żaden, tak więc jeśli znalazłaby się jakaś dobra dusza, która poświęci swój jakże cenny czas i zaprojektuje jakiś prosty layout to będę bardzo wdzięczny :-)

Błędy? Pomysły?

Skrypt jest pełen błędów, niedoróbek i uproszczeń. Jeśli taką zauważyłeś lub coś Cię drażni albo masz jakiś inny pomysł – napisz w komentarzu, bądź na GG/Blip.

Klient REST w WCF

Jak już się napisało, że kiedyś opiszę się tworzenie klienta RESTa w .Necie, to słowa trzeba dotrzymać. Postaram się jak najzwięźlej opisać w jak dość prosty sposób można otrzymać taką funkcjonalność. Przykładem będzie właśnie API dla Blipa, bowiem to przy nim “wypłynęło” kilka ciekawych zagadnień.
Continue reading ‘Klient REST w WCF’

WCF + Blip = WcfBlip

Wyszło jak zawsze – przypadkiem. Wśród napisanych blipowych bibliotek znalazła się jedna dla .neta. Niestety, nie jest już rozwijana w związku z czym spróbowałem napisać swoją. Po kilku godzinach surfowania w Sieci udało mi się zdobyć na tyle dużo wiedzy nt. WCF by to właśnie w tej technologi wykonać bibliotekę. I myślę, że udało się, choć nie cała funkcjonalność API Blipa się w niej znajduje.

Pliki
kod źródłowy (Visual Studio 2008)
UPDATE [01.01.2010]
projekt na GitHub

Wymagania
.Net Framework 3.5

Użycie

Generalnie wszystkie wywołania metod znajdują się we właściwości Api klasy Blip. Jest tak dlatego, że podczas pobierania owej właściwości tworzony jest kontekst z wymaganymi przez API nagłówkami HTTP. Jeśli aplikacja, która piszesz łączy się z innymi źródłami danych przez HTTP, warto dla bezpieczeństwa wywoływać metodę Blip.Dispose() lub używać klauzuli using(), by usunąć kontekst.

Parametry przekazywane do wywołań niestety mogą być tylko typu string (wymóg WCF UPDATE: cóż, w innym kontekście może i można, ale ja dostaje wyjątek) i nie są w żaden sposób sprawdzane.

using (WcfBlip.Blip blip = new WcfBlip.Blip(“uzytkownik”, “haslo”)) // logujemy się
{
Updates[] updates = blip.Api.GetUpdates(); // pobiera ostatnie statusy użytkownika
Updates[] updates2 = blip.Api.GetUpdates(“10″, “5″); // pobiera 10 ostatnich statusów zaczynając od 5
User user = blip.Api.GetUser(“jack”); // pobiera dane nt. użytkownika “jack”
}

Trochę więcej przykładów znajduje się WcfBlipTest

Choć według opisu API jest podział na update’y, statusy, prywatne wiadomości i uwagi, to zdecydowałem się na jedną klasę Update, która to posiada właściwość Type, po której to można rozpoznawać typ wiadomości.

Do poprawki

  • uzupełnić brakujące metody (upload obrazków, avatarów, backgroundów)
  • dodać komentarze do kodu
  • dodać do klas encji właściwości zwracające nazwy użytkowników (a nie jak teraz – tylko ich URL)
  • wprowadzić obsługę błędów (na razie nie ma żadnej)

Licencja
MIT

Wszelkie komentarze i uwagi mile widziane :-)

P.S. W najbliższym czasie postaram się napisać o tworzeniu klientów REST w .Necie za pomocą WCF.