LambdaEqualityComparer

28 lipca 2010 07:30 w kategorii: pro
Szkoda, że w C# nie ma znanych z Javy anonimowych klas. Nie mylić z anonimowymi typami, które nie pozwalają na implementację metod! W internecie jest wiele skarg i próśb próbujących wymusić na Microsofcie dodania tego, jakże wygodnego, ficzera do naszego języka. Powstaje jednak pytanie: gdzie tak naprawdę byśmy owych klas używali? Jedna odpowiedź szczególnie regularnie przewija się przez praktycznie każdy wątek o tej tematyce: do zaimplementowania inline interfejsu I... [More]

Zastrzeżenie: może poniższe wypociny to wcale nie Model-View-Presenter a Model-View-Controller, może MVC: Passive View a może MVC: Supervising Controller a może  MVP: Ostatnia Krew. Szczerze: I don't give a damn. (no... nie do końca; polecam artykuły Fowlera w sekcji Presentation Patterns jako bardzo ciekawą lekturę, ale zbytnie rozwodzenie się nad włożeniem danej implementacji do prawidłowej szufladki uważam za lekki przerost formy nad treścią) Niniejszy post zakłada, że Czytelnik jest za... [More]

Zwykle aplikacja potrzebuje spójnego UI - czyli kontrolek wyglądających i zachowujących się wg. ustalonego schematu. W programowaniu web mamy style css, asp.net ma mechanizm Control Adapters, WPF z tego co wiem także pozwala dość mocno ustandaryzować ten aspekt. W Windows Forms komercyjne pakiety kontrolek, jak np. Telerik, udostępniają możliwość swego rodzaju stylowania wyglądu kontrolek danego typu. Ale co z "gołym" WinForms? Przykład bardzo banalny: chciałbym, aby każdy ComboBox by... [More]

Automapper i mapowanie z czasu UTC

11 marca 2010 06:59 w kategorii: pro
Niedawno popisałem troszkę o czasie UTC i dlaczego tylko taka reprezentacja czasu powinna znajdować drogę do bazy danych. A teraz... w jaki sposób przygotować datę do podróży w drugą stronę, czyli do użytkownika. Z Automapperem jest to zadanie doprawdy banalne, wystarczy odpowiedni Type Converter: 1: public class UtcToLocalTimeConverter : TypeConverter<DateTime, DateTime> 2: { 3: protected override DateTime ConvertCore(DateTime source) 4: { 5: string targetTime... [More]

Często WCF, mimo swoich możliwości w zakresie "interoperability", wcale nie musi być kompatybilny z komponentami zewnętrznymi. Nasz serwer, nasz klient, a WCF między nimi. I... tu zwykle zaczynają się problemy... (jak to pisał nie-ś.p. † Kurt Vonnegut, gówno wpada w szprychy:) ). WCF jest tak rozbudowaną i skomplikowaną technologią, że odpowiednie dobranie zawartych w niej klocków do stworzenia budowli, której potrzebujemy, jest niekiedy żmudnym, trudnym i bardzo czasochłonnym zajęcie... [More]

Jakiś czas temu z dużego projektu nad którym obecnie pracuję zostały całkowicie usunięte i zaorane biblioteki Enterprise Library. I życie stało się prostsze. Wykorzystywaliśmy je jedynie do logowania i obsługi wyjątków i JAKOŚ trzeba było te funkcjonalności w systemie zachować. O ile w przypadku logowania wybór jest dość naturalny (wypasiony log4net), o tyle z wyjątkami nie było już tak "oczywiście". Na szczęście dzięki własnej fasadzie na EHAB, o której pisałem kilka miesięcy temu, n... [More]

Ostatnio natknąłem się na coś, co... blew my mind (wydymało mi umysł?). Bardzo krótko wspomniał o tym Bartek Pampuch na ostatnim MTS i utkwiło mi w pamięci, ale dopiero kilka dni temu niechcący przyjrzałem się "owemu czemuś" bliżej. Owo cuś to biblioteka Reactive Extensions (Rx) implementująca założenia programowania reaktywnego by Microsoft. Nie będę zagłębiał się w teorię czy omawianie szczegółów, ponieważ sam dopiero zacząłem skrobać powierzchnię tej megazajebistej koncepcji i post... [More]

Własna implementacja WCF Proxy

3 grudnia 2009 06:27 w kategorii: pro
Tagi: ,
Podczas korzystania z WCF najprostszą drogą do wywołania metody udostępnianej przez jakąś usługę jest pozwolenie Visual Studio na wygenerowanie odpowiedniego proxy, stworzenie jego instancji... i już - mamy metody usługi do dyspozycji. Bez wysiłku, bez kodu... bez sensu? O tym, dlaczego takie podejście NIE jest wyborem słusznym, rozpisywać się nie będę. Zainteresowanych argumentami "przeciw" odsyłam do fajnego artykułu autorstwa Miguela Castro na Code-Magazine: "WCF the Manual Wa... [More]

Jakiś czas temu opublikowałem garść porad dla naprawdę zaczynających z NHibernate - od zera. Była to raczej wysokopoziomowa teoria pomieszana z linkami. Tym razem zajrzymy w kod i pokażę w jaki sposób można zacząć tworzyć i testować aplikację z NHibernate jeszcze przed zaplanowaniem struktury bazy danych czy nawet przed wyborem docelowego serwera baz danych. Paczka do ściągnięcia w dziale Samples. Każdy może sobie ściągnąć kod (jest go raczej minimalna ilość), podłubać i wyrobić własne zdani... [More]

Zbyt wiele razy spotkałem się z takim kodem: 1: private void Form1_Load(object sender, EventArgs e) 2: { 3: btnAddUser.Visible = Thread.CurrentPrincipal.IsInRole("can add user"); 4: btnShowPosts.Visible = Thread.CurrentPrincipal.IsInRole("can show posts"); 5: //... 6: //... 7: //... 8: //... 9: 10: } Naprawdę, pisanie takiego kodu w czasach, gdy programowanie obiektowe nie jest "nowością" (czyli od dobrych kilku... [More]

Application Events

7 września 2009 06:42 w kategorii: pro
Znany pewnie większości z Was Udi Dahan przedstawił koncepcję Domain Events, która zainspirowała mnie do implementacji rozwiązania opartego na podobnych założeniach. Ayende Rahien z kolei jakiś czas temu zachwycił się kawałkiem kodu z projektu Mass Transit... i po zastanowieniu się nad jego bardzo fajną konstrukcją postanowiłem przy okazji skorzystać z czegoś podobnego. Do tego dorzucimy mikro-fluent interface (bardziej dla zabawy niż prawdziwego pożytku) i zobaczymy czy w efekcie uzyskamy coś w... [More]

Pisząc testy jednostkowe często musimy brać skądś testowe wartości, których wykorzystanie będziemy następnie weryfikować. Przy okazji ostatniego posta mieliśmy takie linijki: 1: string userName = "testUserName"; 2: string password = "testPassword"; Łatwo jednak sobie wyobrazić ile takich miejsc może pojawić się w skali całego projektu. Tysiące! I czy będzie się komuś chciało nadawać każdej zmiennej sensowną wartość? Wątpię. Z pewnością bardzo szybko da się za... [More]

Ileż to razy zmuszeni jesteśmy pisać kod temu podobny: 1: list.ValueMember = "Id"; 2: list.DisplayMember = "Name"; Na CodeGuru niejednokrotnie pytano o jakiś sposób na rozwiązanie tego problemu. Podawanie stringów jest ZŁE, niewygodne i bardzo podatne na błędy wszelakie. Zmiana nazwy właściwości rozwala UI, refactoring bez dodatkowych narzędzi jak Resharper potrafi napsuć sporo krwi (a i z pomocą R# wcale przyjemny nie jest)... Syf, kiła i mogiła. Postano... [More]

Rozdzielanie repozytoriów SVN

4 stycznia 2009 14:49 w kategorii: pro
Może się komuś przypadkiem zdarzyć, jako i mi się zdarzyło, że na początku swojej przygody z Subversion pomyśli: "Jedno repozytorium dla wszystkich projektów - dobry pomysł!" (one repo to hold them all!) Może się też zdarzyć, że po kilku miesiącach, gdy liczba projektów urośnie do setki, a rozmiar repozytorium do kilkuset MB, że nasunie się myśl nieco inna: "Osobne repozytorium dla każdego projektu - dam się za to pokroić!" I wreszcie: "Jak cofnąć czas i zmienić tą debilną decyzję sprzed ki... [More]

ToBeDone Każdy prowadzący technicznego bloga wcześniej czy później napotyka problem: jak przedstawić swój kod na stronie? Do wyboru mamy teoretycznie wiele możliwości. Jest popularny formatter Manoli, jest Actipro CodeHighlighter, o jeszcze innym rozwiązaniu pisał ostatnio Jacek Ciereszko. Gdy jednak rozpoczynalem swoją przygodę z blogowaniem ponad pół roku temu, nie mogłem znaleźć rozwiązania satysfakcjonującego mnie w 100%. Czego oczekiwałem? Pełnej kontroli nad otrzymanym kodem, łatwości dos... [More]

Czas na drugi odcinek serialu pod tytułem "Wymyślże jakiś problem i zaproponuj jego rozwiązanie". Poprzedni post zgromadził pod sobą interesujące wg mnie komentarze, jak będzie tym razem? Postaram się także zastosować do zawartych tamże sugestii co do formy przedstawienia swojego pomysłu. Przedstawienie problemu Dzisiaj zajmę się kwestią "dorabiania GUI" do już istniejących aplikacji konsolowych. "A po cóż owo cuś czynić?", zakrzyknąć ktoś może w niezmiernym zdziwieniu. A więc po pierwsze: bo ... [More]

Klasa System.IO.FileSystemWatcher jest momentami wprost niezastąpiona. Nie będę opisywał tutaj jej cech, ale zajmę się jednym problemem. Zdarzenie Created daje nam znać o tym, że nowy plik pojawił się w obserwowanym katalogu. Co się jednak może stać, gdy beztrosko zaczniemy się owym plikiem zajmować? Prawdopodobne jest, że otrzymamy wyjątek. Powód takiego zachowania jest taki, że zdarzenie Created informauje nas o momencie UTWORZENIA pliku, a nie jego GOTOWOŚCI DO OBRÓBKI. W przypadku większych ... [More]

[Sample] Komunikacja TCP/IP

13 kwietnia 2008 17:18 w kategorii: pro
Tagi: ,
Wstęp Zdecydowałem się uruchomić kolejną "ścieżkę" na tym blogu. Polega ona na implementacji pewnego problemu i zaprezentowaniu tutaj rozwiązania w całości, jako solution Visual Studio. Jest to mój pierwszy taki post, jednak w przyszłości planuję dalej "podążać za białym królikiem" aż do jego nory ozdobionej kratką #.Uważam, że przeglądanie cudzego kodu to najlepszy sposób na poznanie możliwości języka, naukę pewnych praktyk programistycznych oraz weryfikację własnych przyzwyczajeń, dlatego też... [More]