czwartek, 2 grudnia 2010
ASP.NET MVC na 30 spotkaniu PG.NET
Rejestracja na spotkanie jest bezpłatna: Rejestracja @ Codeguru.pl
niedziela, 24 października 2010
StructureMapControllerFactory w ASP.NET MVC
Standardowa implementacja fabryki kontrolerów StructureMapControllerFactory może spowodować serię wyjątków zgłaszanych podczas próby utworzenia konkretnego kontrolera dla bieżącego żądania Http. Dzieje się tak dlatego, że domyślna tablica routingu aplikacji nie wyklucza przetwarzania plików statycznych takich jak np. favicon.ico – jest on wykorzystywany w standardowym template dla aplikacji ASP.NET MVC 2. Efekt tego jest taki, że podczas implementacji aplikacji wygenerowanej z tego template otrzymujemy wyjątek:
System.ArgumentNullException was caught
Message=Value cannot be null.
Parameter name: key
Source=mscorlib
ParamName=key
StackTrace:
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.ContainsKey(TKey key)
at StructureMap.Util.Cache`2.get_Item(KEY key)
at StructureMap.BuildSession.CreateInstance(Type pluginType)
at StructureMap.Container.GetInstance(Type pluginType)
at StructureMap.ObjectFactory.GetInstance(Type pluginType)
at Komstar.Domains.Web.StructureMapControllerFactory.CreateController(RequestContext requestContext, String controllerName) in D:\…\…\Global.asax.cs:line 64
InnerException:
Aby rozwiązać ten problem należy dodać do routingu aplikacji następujący wpis:
routes.IgnoreRoute("{favicon}", new { favicon = @"(./)?favicon.ico(/.*)?" });Teraz powinno być cicho.
środa, 9 czerwca 2010
Visual Studio 2010 Pro Power Tools i problem z czarną skórką
Ukazała się pierwsza wersja świetnego dodatku do Visual Studio: Visual Studio 2010 Pro Power Tools. Nie chcę się powtarzać bo opis funkcjonalności można przeczytać np. tutaj. Jednak zauważyłem problem w przypadku czarnych schematów kolorów IDE, których jestem zwolennikiem. Największy problem jest z jednym z ciekawszych ficzerów, a mianowicie kolorowaniem parametrów metod w oknie podpowiedzi. U mnie sprawa wyglądała następująco:
Na szczęście udało mi się znaleźć rozwiązanie problemu. Należy wejść w: Tools->Options->Fonts and Colors->Signature Help Tooltip Background oraz odpowiednio ztuningować kolor tła i czcionek zgodnie z własnymi upodobaniami :-)
Hołp dis help ;-)
czwartek, 3 czerwca 2010
extendedProtectionPolicy spowoduje, że Twoja aplikacja przestanie działać, czyli WCF + Windows 7 = CRASH
Straciłem ostatnio ładnych kilka godzin namierzając problem, który skutkował kompletnym zamknięciem się aplikacji zaraz po jej starcie. Co ciekawe problem pojawiał się jedynie na komputerach produkcyjnych: u mnie działało :-)
Otóż jeśli tworzysz dowolnego klienta WCF i posiadasz system Windows 7 jest niemal pewne, że Twój klient nie uruchomi się na innych systemach operacyjnych! Dlaczego? Problem tkwi w elemencie extendedProtectionPolicy, który “potajemnie” dodawany jest do pliku App.config.
Więc jeśli Twoja aplikacja kończy działanie błedem zaraz po stworzeniu obiektu proxy dla klienta WCF i nie masz pojęcia o co chodzi, to rozwiązaniem jest usunięcie tego elementu z pliku App.config.
Mnie uratowała sesja z WinDbg, gdyż obiekt proxy miałem tworzony z kontenera StructureMap zaraz na początku w mojej aplikacji i nijak nie szło zdiagnozować problemu na komputerach produkcyjnych na których nie było żadnego środowiska programistycznego. Jednocześnie przekonałem się jak zaciemnić debugowanie może zastosowanie IoC.
sobota, 29 maja 2010
NDepend 3 wchodzi na scenę!
O wersji v2 NDependa pisałem we wcześniejszym poście, jednak na sporo więcej uwagi zasługuje najnowsza, trzecia wersja tego narzędzia.
Co nowego w NDepend?
Największą i dla mnie osobiście najbardziej przydatną nową funkcjonalnością jest pełna integracja z Visual Studio 2005/2008/2010 IDE. Jeszcze nigdy używanie NDependa nie było tak naturalne w procesie tworzenia oprogramowania. Integracja wprowadza zupełnie nowy sposób pracy z kodem, gdyż do tej pory (przynajmniej w moim przypadku), statyczna analiza kodu przez NDependa była najefektywniejsza w połączeniu z Continuous Integration (analiza przeprowadzana przez VisualNDepend była przeprowadzana wyrywkowo, jak mi się przypomniało). Integrację z Visual Studio uważam za doskonały pomysł i nie spodziewałem się, że może być ona tak pomocna!
Jak to wygląda w praktyce?
Zacznijmy od zainstalowania dodatku do VisualStudio, który pozwoli na integrację NDependa z VS. Po uruchomieniu VisualNDepend.exe klikamy na przycisk instalacji:
Po czym wybieramy do jakiego środowiska ma być wykonana integracja oraz jej typ.
Do wyboru mamy: pełną integrację oraz integrację light. Integracja light polega na tym, że z poziomu Visula Studio będziemy wykonywać polecenia np. CQL (Code Query Language), które zostaną przesłane i uruchomione w otwartej osobno instancji VisualNDependa. Moim zdaniem instalacja light sprawdza się najlepiej na komputerach z niewielkimi monitorami. Mnogość okien NDependa wymaga sporej powierzchni do pracy, a gdzieś jeszcze trzeba znaleźć miejsce na wyświetlenie kodu :-) Jeśli jednak dysponujemy nieco większym ekranem, a już najlepiej dwoma, trzema, czterema, (ma ktoś pięć???) monitorami, wtedy wersja Full będzie najlepszym wyborem.
Analizę czas zacząć
Do celów edukacyjnych przeanalizujmy zobaczmy NDependa trójkę w akcji. Jak mięso armatnie użyję biblioteki Sharpy. Sharpy to implementacja ASP.NET MVC ViewEngine podobna do Smarty dostępnego dla PHP. Jednak w tym momencie nie jest to istotne. Po załadowaniu źródeł należy podłączyć NDependa do otwartego pliku solution, co czynimy bezpośrednio z poziomu menu VisualStudio (przed samym załadowaniem należy wykonać Build projektu):
W tym momencie NDepend automatycznie przeskanuje projekty i zaproponuje je do analizy (przypominam, że wersji v2 trzeba było “ręcznie” utworzyć projekt) i to już pierwsze, ogromne udogodnienie:
Oczywiście nic nie stoi na przeszkodzie, aby dołączyć kolejne pliki, które nie znajdowały się w naszym solution. Upewniamy się, że checkbox “Run Analysis Now!” jest zaznaczony, po czym pozostaje kliknąć przycisk OK.
Po wykonaniu analizy NDepend generuje raport HTML, który pozwala na szybkie przejrzenie stanu w jakim znajduje sie kod, reszta szczegółów znajduje się już w IDE. Szybki przegląd uzyskamy za pomocą żółtego oka węża (a co!) znajdującego się w prawym, dolnym rogu IDE:
Po dwukliku na nim oczom naszym ukazuje się CQL Query Explorer:
NDepend Search
NDepend Search, to kolejny feature, który jest mega użyteczny. Mimo, że VS 2010 wprowadza możliwość “inteligentnego” wyszukiwania po nazwie metod, to NDepend Search (wywalasz z menu NDepend/NDepend Search) potrafi wyszukiwać po nazwie metody, typach, polu, assembly, przestrzeni nazw, a na dodatek pokazuje w oknie wyszukiwania złożoność danej metody / typu, a przy tym działa bardzo szybko!
Gdy jednak potrzebujemy bardziej rozbudowanego wyszukiwania pod względem złożoności wystarczy zaznaczyć po polu wyboru Serach by “Complexity”, a do dyspozycji będziemy mieli opcje służące do szybkiego odfiltrowania interesującej nas skali złożoności:
NDepend Class Browser + podgląd na żywo
Kolejnym przydatnym okienkiem jest NDepend Class Browser, który oprócz swojej podstawowej funkcjonalności jaką jest ułatwienie nawigowania po klasach i ich składowych, dodatkowo komunikuje się z pozostałymi oknami np. Dependency Matrix, Metrics itd, dzięki czemu po najechaniu na klasę w oknie Class Browser-a otrzymujemy informację np. o jej zależnościach w oknie Dependency Matrix:
Podsumowanie
Nowa wersja NDepend-a wnosi rzuca zupełnie inne światło na to narzędzie. Dzięki doskonałej integracji ze środowiskiem programistycznym pozwala na uruchomienie analizy w dowolnym wręcz momencie, a dodatkowe funkcjonalności takie jak chociażby wspomniany NDepend Search znacznie przyśpieszają codzienną pracę ze złożonym kodem. Sporo wody w Warcie upłynie zanim Visual Studio będzie wyposażone w taki kombajn.
Obsługa prawna Poznańśroda, 26 maja 2010
Użyteczny skrypt w Powershell
Jak za pomocą skryptu powłoki Powershell skompilować pliki solution znajdujące się w bieżącym folderze i jego podfolderach? Oto skrypcik, który do tego wykorzystuję:
foreach($file in get-childitem -filter *.sln -recurse)
{
echo Kompiluje $file.FullName
\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe /t:build /p:Platform="Any CPU" /v:q /nologo $file.FullName
}Czyli skrypt doskonale nadaję się do tzw. buildAll :-)
sobota, 15 maja 2010
Debugowanie ścieżek ASP.NET MVC: Routes Debugger step by step
Routing ASP.NET MVC może zrobić sporo zamieszania, jeśli w naszej aplikacji korzystamy z zaawansowanego sterowania pomiędzy kontrolerami i odpowiadającymi im widokami. Dla dużych aplikacji (w obecnej chwili pracuję nad taką, która posiada ponad 120 kontrolerów – i nie ma tu problemów z refaktoryzacją) odpowiednie pokierowanie przepływem żądań to całkiem skomplikowany problem.
Są dwie metody debugowania ścieżek:
- Metoda empiryczna, czyli zmieniamy tabelę ścieżek, klikamy F5, po czym zamykamy oczy.
- Za pomocą biblioteki RoutesDebug – i tą metodę opiszę za chwilę.
RoutesDebug, czyli
RoutesDebug to pojedyńcza bilblioteka dostępna za darmo, która po dołączeniu do naszej aplikacji MVC oraz odpowiednim skonfigurowaniu (co jest dziecinnie proste) stanie się domyślnym RouteHandlerem.
Czyli zaczynamy
1. Pobieramy bibliotekę RoutesDebug.dll
2. W Visual Studio dodajemy referencję do niej w naszej aplikacji ASP.NET MVC
3. Czas na rejestrację naszego nowego RouteHandlera. Przechodzimy do pliku Global.asax.cs i dodajemy jedną (!) linijkę:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
//Powstań RoutesDebugerze:
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}To wszystko. Teraz po uruchomieniu aplikacji powinniśmy ujrzeć stronę na, której prezentowana jest tablica ścieżek w naszej aplikacji.
Tak naprawdę to jest to nasza konsola testowa :-) Ok, dla przykładu stworzyłem bardzo prostą aplikacyjkę, która zawiera następujące rejestracje scieżek:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(null, "Articles/{id}",
new { controller = "Articles", action = "Show" },
new { id = @"\d{1,9}" }
);
routes.MapRoute(null, "Articles/Show/{id}",
new { controller = "Articles", action = "Show" },
new { id = @"\d{1,9}" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}Do kontrolera Articles będziemy dopuszczać jedynie ścieżki które spełniają następujące wymagania:
- Zawierają numer artykułu, który za pomocą prostego wyrażenia regularnego testowany jest, czy jest liczbą
- Jeśli nie podamy nazwy metody, to przyjmujemy, że chodzi o metodę Show
Natomiast w konsoli testowej widzimy, że dla wywołania ścieżki: http://localhost/Articles/Show/1 pasujące są wpisy w tablicy:
- Articles/Show{id}
- {controller}/{action}/{id}
gdzie jako parametr przekazujemy nasz ID, czyli tutaj liczbę 1, kontroler to ArticlesController, a akcja to Show. Ale w naszym przykładzie zarejestrowałem także scieżkę, w której podanie nazwy akcji jest opcjonalne, przetestujmy więc ją:
http://localhost/Articles/1234
czyli ścieżka także została rozpoznana, a pusta nazwa akcji została automatycznie uzupełniona przez wywołanie akcji Show, zgodnie z tym co podaliśmy w naszej tablicy routingu. Pozostał ostatni test, czyli test na niepoprawne dane, wpisujemy http://localhsot/Articles/darek –> to nie jest liczba :-)
ścieżki nie zostały dopasowane, czyli wszystko działa.