Historia zmian | Ilaro.Admin

Ilaro.Admin w prosty sposób umożliwia zapisywanie historii dokonywanych zmian rekordów.

By włączyć tą funkcje należy zarejestrować encje, która implementuje interfejs IEntityChange.

A następnie w bazie danych utworzyć tabele dla tej encji.

Obsługa tej encji przez Ilaro.Admin wygląda nieco odmiennie od pozostałych encji. Z tego względu nie będą działać wszystkie możliwości konfiguracji. W przyszłości stworze interfejs do konfigurowania tylko tej encji tak by było jasne co zostanie uwzględnione a co nie.

Podstawowe rzeczy takie jak ustawienie nazwy tabeli i kolumny oczywiście działają.

Continue…

Domyślne wartości | Ilaro.Admin

W poprzednim wpisie na temat usuwania rekordów wspomniałem o metodzie OnDelete, która ustawia wartości properties podczas usuwania.

Istnieją jeszcze dwie analogiczne metody, OnCreate i OnUpdate.
Każda z nich ustawia domyślne wartości podczas określonej akcji, OnCreate podczas tworzenia rekordu, OnUpdate podczas edycji rekordu i OnDelete podczas usuwania (soft delete).

Continue…

Usuwanie rekordów | Ilaro.Admin

Podczas usuwania rekordu zawsze jest wyświetlana strona do potwierdzenia.

W wersji v2 będę to chciał zmienić. Chciałbym dodać opcję potwierdzania w oknie modalnym (lub w podobny sposób) a także możliwość kompletnego usunięcia potrzeby usunięcia, w przypadku gdy usuwanie encji jest robione poprzez soft delete. Po usunięciu pojawiałaby się opcja umożliwiająca cofnięcie usuwania.

Klucze obce

Podstawowym problemem podczas usuwania rekordu są jego zależności.
Trzeba zadbać o to by przed usunięciem rekordu inne rekordy nie będą miały do niego referencji.
Można to zrobić na dwa sposoby, albo poprzez usunięcie rekordów z referencjami, albo odpięcie usuwanego rekordu od rekordów z referencjami.

Continue…

Refaktoryzacja inicjalizacji encji | Ilaro.Admin

Jak było?

Do tej pory inicjalizacja atrybutami była zaszyta w logice encji, co oczywiście nie powinno mieć miejsca. Niektóre rzeczy były inaczej inicjalizowane używając atrybutów a inaczej używając fluent konfiguracji.

Kolejną złą rzeczą było inicjalizowanie obiektu od razu po jego utworzeniu, co powodowało, że w metodzie Admin.Initialise()  musiałem wykonywać dodatkową konfiguracje, ponieważ niektóre rzeczy zależą od konfiguracji innych rzeczy.
Na przykład jeśli nie został określony template edycji to jest on określany automatycznie, co jednak zależy od kilku innych rzeczy, taki jak typ zmiennej, data type zmiennej (Html, Password, itd.), a także uwzględnia czy zmienna jest kluczem obcym.

Dodatkowym problemem byłoby to, ze jeśli chciałbym dodać nowy sposób inicjalizacji, na przykład czytanie z pliku xml lub json, to stopień komplikacji i zależności tym bardziej by wzrósł.

Continue…

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…