Nie można załadować pliku lub zestawu DotNetOpenAuth.Core

Jakiś czas temu zrobiłem porządki z paczkami nugeta używanymi w demo projekcie dla Ilaro.Admin.
W projekcie miałem m.in. bardzo dużo nugetów DotNetOpenAuth.* , które usunąłem.

Na początku wszystko wydawało się ok. Dzisiaj zrobiłem clean na projekcie i okazało się, że jakaś biblioteka ma referencje do  DotNetOpenAuth.Core .
Winowajcą okazała się biblioteka  Microsoft.Web.WebPages.OAuth , która wystarczyło usunąć.

Niewykluczone, że lepszym pomysłem byłoby utworzenie nowego pustego projektu; mądry Robert po szkodzie.

T4 template

Co to jest T4 template

W internecie z łatwością można znaleźć opisy czym jest T4, pochodzące od mądrzejszych ludzi niż ja, więc tylko pokrótce przedstawię temat.

T4 template jest to kod, który generuje plik z kodem (lub też z jakikolwiek tekstem), który będzie dołączony do solucji.
Pisząc template posługujemy się blokami tekstu pomieszanymi z logiką.
Ten kod wygeneruje nam klasę, która w nazwie będzie miała numer dzisiejszego dnia.

Świetnym przykładem wykorzystania T4 jest T4MVC, która dla projektu ASP.NET MVC generuje klasy ze strukturą kontrolerów, widoków i area, tak by w kodzie nie posługiwać się magic stringami.

T4 w Ilaro.Admin

Pisząc poprzedni post zauważyłem, że mam klasę, która mogłaby być zastąpiona przez T4. W klasie Template mam zapisane listę widoków z folderów DisplayTemplates, EditorTemplates i FilterTemplates.

Czyli musiałem pozyskać listę plików z tych folderów. Na początek ustawiłem by template był host specific, co pozwala się dostać do zmiennej this.Host typu ITextTemplatingEngineHost.

Ze zmiennej Host pozyskałem informacje o tym w jakim folderze znajduje się template. Mając tą informacje mogłem utworzyć ścieżkę do folderu Shared z widokami w area IlaroAdmin.

Mając tą ścieżkę, pobrałem wszystkie foldery kończące się słowem „Templates”, tak by w przyszłości jeśli dojdą inne typy templates żeby były od razu dodane do tej klasy.
Następnie dla każdego folderu pobrałem wszystkie pliki kończące się na „Partial.cshtml”. W folderach templates, mój schemat nazewnictwa jest własnie taki by pliki kończyły się słowem „Partial”. Dodatkowo musiałem filtrować je ze względu na typ ponieważ każdy widok jest kompilowany, czyli tworzy się plik o tej samej nazwie tylko z rozszerzeniem „.cs”.

Dodatkowo zrobiłem przekształcenia na nazwach folderów i plików tak by ostateczne nazwy klas i zmiennych wyglądały lepiej. Z nazw folderów wyciąłem słowo „Templates”, a z nazw plików słowo „Partial” i rozszerzenie.
Mając już zbudowaną kolekcje widoków użyłem ją w ten sposób:

co wygenerowało mi taki kod:

Pełny kod mojego template można znaleźć tutaj: Templates.tt.

Na początku myślałem, że mój template nie będzie bardzo przydatne, że jest to tylko pretekst żeby zrobić coś „innego”. Okazało się, że w klasie Templates miałem już kilka nieistniejących już nazw plików, więc już na samym początku Templates.tt okazało się użyteczne.

Widoki w Ilaro.Admin

Ilaro.Admin oprócz logiki oczywiście też posiada widoki, a żeby je przechować to trzeba je skompilować. Niestety ASP MVC nie ma takiej możliwości out of the box, więc wspomogłem się świetnym narzędziem RazorGenerator.

W skrócie, żeby go użyć wystarczy zainstalować paczkę nuget i ustawić dla widoku, który ma być skompilowany Custom Tool na RazorGenerator.

Mając już skompilowany widok musimy go jeszcze użyć. Ilaro.Admin rejestrujemy view engine, który potrafi korzystać z takich widoków.
W przypadku gdy natrafia w tej samej lokalizacji i na skompilowany i normalny widok, priorytet ma ten normalny.
Co oznacza, że jeśli w swoim projekcie dodamy area o nazwie IlaroAdmin i dodamy widok o takiej samej nazwie co już się znajduje w Ilaro, będzie on użyty zamiast oryginalnego widoku.
Dzięki temu można na przykład zmienić layout panelu administracyjnego tak by odpowiadał on bardziej naszym potrzebą.

Continue…

Masowa rejestracja encji | Ilaro.Admin

Gdy mamy dużo modeli i chcielibyśmy podejrzeć dla każdego nich domyslny panel administracyjny dobrym pomysłem będzie użyć masowej rejestracji encji z danego assembly.

Tworząc API do rejestracji, wzorowałem się na API Autofaca.

Rejestracja encji w assembly:

API pozwala także na filtrowanie typów:

Dodałem kilka rozszerzeń, dla najprawdopodobniej najczęstszych przypadków użycia.

Continue…

Ilaro.Admin – plan

Co jeszcze w v1?

Większość pracy w pierwszej wersji projektu została już zrobiona.
Minimum które sobie założyłem do zrobienia w tej wersji:

  • Obsłużenie różnych opcji usuwania kaskadowego dla podrzędnych rekordów.
  • Masowa rejestracja encji.
    Np. wszystkie klasy w danym namespace, wszystkie klasy w danym assembly, wszystkie klasy dziedziczące po określonym typie
  • Nowa możliwość konfigurowania encji. Konfiguracja dla każdej encji w osobnej klasie, na wzór konfiguracji NHibernate. Będzie to świetnie współgrało z masową rejestracją.
  • Obsłużenie relacji wiele do wielu.
  • Refaktoring.
    • Lepsze tworzenie sql pokazujące hierarchie powiązań danego rekordu.
    • Klasa inicjalizująca jest statyczna, przydałoby się to zmienić.
  • Testy, testy, więcej testów – teraz jest ich dosyć mało.

Continue…

Baza danych w demo aplikacji

Ilaro.Admin jest już na takim etapie, że można już sobie coś poklikać, a żeby to ułatwić już jakiś czas temu stworzyłem demo aplikacje.

Demo używa bazy danych Northwind z małymi zmianami.

  • Dodana tabela EntityChanges do zapisywania każdej zmiany.
  • Zastąpienie kilku composite primary keys, pojedynczymi kluczami, z tego względu, że początkowo nie było to obsługiwane, a w tym momencie nie jest to jeszcze wystarczająco przetestowane.

Jako, że jest ono dostępne dla wszystkich kwestią czasu jest gdy coś się zepsuje, albo przez błąd w aplikacji, albo ktoś walnie się ku temu przyczyni, np. usuwając wszystkie rekordy.
Czyli potrzebujemy przywracania bazy danych do domyślnego stanu.

Co do tego potrzebujemy?

  • Mechanizm, który co określony czas będzie wywoływał akcje resetu.
  • Akcje resetu sama w sobie.
  • Użytkownik korzystający podczas z aplikacji podczas resetu, musi być świadomy co się dzieje.

Od razu muszę nadmienić, że to zadanie było trochę utrudnione przez to, że aplikacja jest postawiona na współdzielonym hostingu.

Continue…

Ilaro.Admin – o projekcie

Kilka lat temu miałem okazje uczestniczyć w jednodniowych warsztatach Django, czyli webowego frameworka MVC dla Pythona.
Do gustu przypadła mi przede wszystkim możliwość wygenerowania panelu administracyjnego na podstawie zdefiniowanych modeli bazodanowych.

Podobne rozwiązania istnieją już chyba w każdej z najpopularniejszych technologii webowych oprócz .NET, więc postanowiłem zakasać rękawy i wypełnić tą lukę tworząc Ilaro.Admin dla ASP.NET MVC.

Repozytorium na Githubie: https://github.com/rgonek/Ilaro.Admin.
Obecny stan projektu w akcji: http://admin.ilaro.net.

Podstawowa inicjalizacja

Żeby zacząć korzystać z Ilaro.Admin należy dodać referencje do swojego projektu (najlepiej poprzez nugeta) a później w kodzie już tylko trzy proste kroki, które swe miejsce mają w Global.asax w metodzie Application_Start.

  1. Najpierw rejestrujemy wszystkie encje które mają pojawić się w panelu administracyjnym.
  2. Następnie inicjalizujemy Ilaro.Admin.
  3. Na końcu upewniammy się czy rejestracja areas jest wywoływana (przy tworzeniu projektu ASP.NET MVC jest to domyślnie dodawane).

Oczywiście jeśli chcemy możemy dokładniej określić co i w jaki sposób ma zostać wyświetlone.

Continue…

Hello World

Założenie bloga chodziło mi po głowie już od jakiegoś czasu, ale jak to czasami bywa, od idei do realizacji droga daleka. Świetną mobilizacją okazała się inicjatywa „Daj się poznać„, a więc daje się poznać :). Cześć jestem Robert :P.

W najbliższej przyszłości będę opisywał głównie swoje zmagania z projektem open source Ilaro.Admin, aczkolwiek mam nadzieje, że nie skończy się tylko na tym.