420 likes | 599 Views
Jakub Binkowski. ASP.NET Dynamic Data. Jakub Binkowski Visual C# MVP Webstruments.pl / webEFS. Cel prezentacji. Pokazać: co to jest Dynamic Data, jak zacząć pracę z DD, jak dostosować DD do własnych potrzeb, jak rozszerzać DD, architekturę DD,
E N D
Jakub Binkowski ASP.NET Dynamic Data Jakub Binkowski Visual C# MVP Webstruments.pl / webEFS
Cel prezentacji Pokazać: • co to jest Dynamic Data, • jak zacząć pracę z DD, • jak dostosować DD do własnych potrzeb, • jak rozszerzać DD, • architekturę DD, • miejsce DD w poważnej inżynierii oprogramowania.
Podstawowe zastosowania Czym jest ASP.NET Dynamic Data? Pierwsza dynamiczna aplikacja.
Scaffolding ASP.NET Dynamic Data tworzy rusztowanie (ang. scaffolding) dla aplikacji.
ASP.NET Dynamic Data • Generuje UI w ASP.NET na podstawie źródła danych • Wsparcie dla operacji CRUD • Pełne wsparcie dla technologii: • LINQ to SQL • Entity Framework • Interfejs generowany jest dynamicznie • Automatyczna walidacja na podstawie danych o polach
Możliwości dostosowywania • Zmiana zachowania: • Ograniczanie widoczności do tabel i kolumn • Rozszerzanie metadanych kolumn • Zmiana UI (strony i kontrolki): • Modyfikacja szablonów • Specyficzne szablony dla różnych tabel • Specyficzne szablony w zależności od konfiguracji • Własne strony
Dostosowywanie DD:Zmiana zachowania Rozszerzanie metadanych
Jak dodawać metadane do modelu? • [Atrybuty] dopisywane do klas i pól encji Ale encje L2S i EF są generowane… • Encje L2S i EF są partial - rozszerzalność • Atrybut [MetadataType] – podpięcie zewnętrznej klasy z metadanymi
Ograniczanie dostępności • [ScaffoldTable]Generowanie UI dla tabel: • widoczne wszystkie, oprócz wybranych • widoczne tylko wybrane • [ScaffoldColumn]Można wskazać, dla których pól będzie generowany UI • [Editable]Ograniczenie edytowalności niektórych pól • ang. scaffolding - rusztowanie
[Display] [Display(ShortName="Nazwa", Order=1, Name="Nazwa produktu", Description="Jak się produkt nazywa?", GroupName="Opis produktu", Prompt="Podaj nazwę...", AutoGenerateField=true, AutoGenerateFilter=false)] publicstring Name;
DisplayFormat [DisplayFormat( DataFormatString="{0:C}", ApplyFormatInEditMode=false, ConvertEmptyStringToNull=true, HtmlEncode=true, NullDisplayText="wycofanozesprzedaży")] publicdecimalStandardCost;
[DisplayColumn] Wyświetlana kolumna Kolumna, po której następuje sortowanie [DisplayColumn("Name", "ProductNumber")] partialclassProduct { }
[DataType] [DataType(DataType.MultilineText)] publicstring Comments; • Custom • DateTime • Date • Time • Duration • PhoneNumber • Currency • Text • Html • MultilineText • EmailAddress • Password • Url • ImageUrl
[EnumDataType] publicclassReview { [EnumDataType(typeof(Rating))] publicint Rating; } publicenumRating { Good = 5, Fine = 4, Average = 3, Bad = 2, Terrible = 1 }
Walidacja • Atrybuty walidacyjne: • [CustomValidation] • [Range] • [RegularExpression] • [Required] • [StringLength] • [EnumDataType] • własny atrybut
Struktura aplikacji • FieldTemplatesszablony prezentacji i edycji właściwości • EntityTemplatesszablony Show/Edit/Insert dla encji • PageTemplatesszablony stron • Filtersfiltry do przeszukiwania
FieldTemplatesKontrolki prezentacji/edycji pola • UI dla poszczególnych kolumn • W folderze FieldTemplates: • Nazwa.ascx - prezenter • Nazwa_Edit.ascx - edytor • Użycie szablonu: [UIHint("Rating")] publicint Rating;
EntityTemplatesKontrolki dla encji • UI dla poszczególnych tabel • W folderze EntityTemplates: • Tabela.ascx - prezentacja • Tabela_Edit.ascx - edycja • Tabela_Insert.ascx - dodawanie • Tabela – nazwa EntitySet’u a nie klasy (!) np. „ProductReviews”
PageTemplates i CustomPagesSzablony widoków • UI dla poszczególnych widoków • Domyślne szablony w PageTemplates: • Widok.aspx(List, Details, Insert, Edit, …) • Szczegółowe szablony dla tabel w:CustomPages/Tabela/*.aspxgdzie Tabela – nazwa EntitySet’u
FiltersWłasne filtry • UI dla przeszukiwania listy – filtrów • Folder Filters: • Nazwa.ascx • Użycie filtru: [Display(AutoGenerateFilter=true)] [FilterUIHint("Text")] publicstringName;
Architektura Dynamic Data Czyli jak to działa?
Jak to możliwe? • http://server/Products/List.aspx
1) Baza, model, metamodel Baza danych Model danych Metamodel DataModelProvider
2) Routing routes.Add(newDynamicDataRoute("{table}/{action}.aspx") { Constraints = newRouteValueDictionary( new { action = "List|Details|Edit|Insert" }), Model = DefaultModel });
Zadania Dynamic Data • Przechowywanie metadanych • Określenie tabeli i akcji(parametry z routingu) • Załadowanie odpowiedniej strony • Dynamic Data nie odpowiada za operacje na danych (pobieranie, modyfikacje, itp.)...A jeśli nie DD, to kto?
Zalety • Gotowa aplikacja w mniej niż minutę • Automatyczna aktualizacji UI po zmianach • Szerokie możliwości dostosowywania • Ciekawa architektura
Wady • Testowalność • Spłaszczenie architektury aplikacji • Pełne wsparcie tylko dla: • LINQ to SQL • Entity Framework
Czy w idealnej architekturze jest miejsce na Dynamic Data? • Nie. • Ale czy ktoś widział kiedyś idealną architekturę?
Zastosowania • Prototypowanie • Szybkie udostępnienie wersji 0.1 • Panel administracyjny
Cel prezentacji Czy udało mi się pokazać: • co to jest Dynamic Data, • jak zacząć pracę z DD, • jak dostosować DD do własnych potrzeb, • jak rozszerzać DD, • architekturę DD, • miejsce DD w poważnej inżynierii oprogramowania?