|
|
ASP.NET QuickStart Príručka
Viazanie na objekty
Predchádzajúca sekcia ukázala viazanie ovládacích prvkov na SqlDataSource, ktorý podporuje
vlastnosti na špecifikáciu reťazca pripojenia (connection string), SQL príkazov alebo uložených procedúr
použitých na dopytovanie a modifikáciu databázy. Kým spomínaný prístup je vhodný pre väčšinu osobných
stránok malého rozsahu, ukladanie SQL príkazov priamo na prezentačné stránky aplikácie môže vyústiť v problémy pri
údržbe aplikácii podnikového rozsahu. Väčší rozsah obvykle vyžaduje „zapúzdrený“ dátový
model použitím podvrstvy prístupu k dátam v rámci aplikačnej vrstvy, alebo použitím business komponentov.
Na šťastie, model ASP.NET-ových ovládacích prvkov podporuje prístup s použitím prvku ObjectDataSource.
Objektový model prvku ObjectDataSource je podobný ako pri prvku SqlDataSource. Namiesto vlastnosti
ConnectionString, ObjectDataSource vystavuje vlastnosť TypeName, ktorá určuje
typ objektu (meno triedy) ktorú inštancovať pri vykonávaní dátových operácií. Podobne ako pri SqlDataSource,
prvok ObjectDataSource podporuje vlastnosti ako SelectMethod, UpdateMethod, InsertMethod a DeleteMethod pre stanovenie
metód asociovaného údajového typu, ktoré sa budú volať pri vykonávaní dátových operácií. Sekcie opisuje techniky pre budovanie vrstvy prístupu k dátam
a pri tvorbe komponentov aplikačnej vrstvy a ich vystavovaní cez prvok ObjectDataSource.
Viazanie na vrstvu prístupu k údajom
Vrstva prístupu k údajom obaľuje kód ADO.NET na dopytovanie a modifikáciu databázy s použitím príkazov SQL.
Zvyčajne abstrahuje od detailov vytvárania spojenia v ADO.NET a tvorby príkazov, ktoré sú prístupné cez metódy , ktoré môžu byť volané
s vhodnými parametrami. Typický komponent vrstvy prístupu k dátam môže byť vyjadrený nasledovne:
public class MyDataLayer {
public DataView GetRecords();
public DataView GetRecordsByCategory(String categoryName);
public DataView GetRecordByID(int recordID);
public int UpdateRecord(int recordID, String recordData);
public int DeleteRecord(int recordID);
public int InsertRecord(int recordID, String recordData);
}
Prvok ObjectDataSource môže byť asociovaný s týmto typom nasledujúcim spôsobom:
<asp:ObjectDataSource TypeName="MyDataLayer" SelectMethod="GetRecords" UpdateMethod="UpdateRecord"
DeleteMethod="DeleteRecord" InsertMethod="InsertRecord" runat="server"/>
ObjectDataSource vyžaduje špecifický návrhový vzor pre objekty s ktorými dokáže pracovať.
Obmedzenia spočívajú v bezstavovom prostredí, v ktorom sú Webové požiadavky spúšťané.
Pretože objekty sú typicky vytvárané pre každú žiadosť a sú následne likvidované, vyžaduje sa aj od dát, ktoré sú naviazané
cez objektový dátový zdroj, aby boli bezstavové.
Zvyčajne ObjectDataSource používa štandardný konštruktor (bezparametrický) na konštrukciu typu špecifikovaného vlastnosťou Typename, hoci je
možné inštancovať typ pre ObjectDataSource reagovaním na udalosť ObjectCreating , vytvoriť inštanciu dátového objektu
a priradiť ju vlastnosti ObjectInstance, ktorá je výstupným parametrom v rámci argumentov udalosti.
Objektová metóda asociovaná s vlastnosťou SelectMethod môže vrátiť akýkoľvek Object, zoznam IEnumerable, kolekciu alebo pole. V príklade vrstvy
prístupu k dátam, objekt DataView implementuje rozhranie IEnumerable. Ako sa dozviete v nasledujúcej sekcii, spomínané metódy môžu tiež vrátiť silno-typovanú kolekciu, alebo objekt.
GetProducts() -> ProductCollection
GetProductsDataSet() -> DataSet
GetProduct (int productId) -> Product
Metódy Update, Insert a Delete by mali brať individuálne dátové položky ako parametre, ale môžu voliteľne akceptovať
aj objekty agregovaných tried s verejnými vlastnosťami pre polia dátových záznamov.
UpdateProduct (int id, String name, double price, bool inStock)
UpdateProduct (Product p) // p.ID, p.Name, p.Price, p.InStock …
DeleteProduct (int id)
Podobne, ako v príklade na SqlDataSource, mená parametrov alebo vlastností dátových položiek odovzdaných metódam Update, Insert a Delete musia byť zhodné s menami dátových položiek vrátených metódou Select, aby fungovala automatická editácia, vymazávanie prípadne vkladanie.
Podobne ako v prvku SqlDataSource, parametre metód ObjectDataSource môžu byť asociované s dátovými objektmi parametrov priradených do kolekcií
SelectParameters, FilterParameters, UpdateParameters, DeleteParameters alebo InsertParameters.
Nasledujúci príklad ukazuje, ako prvok ObjectDataSource vystavuje dáta z komponentu vrstvy prístupu k dátam nazvaného AuthorsDB. Súbor v ktorom sa nachádza
zdroj komponentu je umiestnený v adresári App_Code, ktorý ASP.NET dynamicky kompiluje počas behu stránky.
VB Binding to a Data Access Layer
Viazanie na aplikačnú vrstvu
Dôležitý fakt, ktorý treba spomenúť o dátovej vrstve je, že metóda SelectMethod vracia výsledky spustenia dopytu ako DataView a preto vystavuje
schému podkladovej databázy prezentačnej vrstve. Je dôležité uvedomiť si, že vo vrstve prístupu k dátam neexistujú žiadne biznis-pravidlá (definujúce logiku aplikácie);
jednoducho sa spúšťajú dopyty a vracajú výsledky. Aby sa oddelila prezentácia od databázovej schémy a zaviedla aplikačná logika alebo validácia,
vrstva prístupu k dátam je obvykle obalená aplikačnou vrstvou (vrstvou biznis-pravidiel).
Vrstva biznis-pravidiel je podobná vrstve prístupu k dátam v tom, že vystavuje bezstavové metódy pre ObjectDataSource za účelom
dátového viazania ovládacích prvkov umiestnených na webových stránkach. Namiesto priameho vrátenia výsledkov ADO.NET operácií, zvyčajne
vracia silno-typované objekty, ktoré reprezentujú biznis entity používané aplikáciou.
Prístup oddeľuje prezentačnú vrstvu od schémy podkladového dátového zdroja, čím sa zjednodušuje
udržiavanie časti kódu stránky, ktorá pristupuje k dátam od časti, ktorá ich konzumuje.
S dobre navrhnutou strednou vrstvou môžete zmeniť podkladový dátový zdroj na úplne inú schému bez nutnosti aktualizovať jednotlivé stránky aplikácie.
Ukázaný je príklad na vrstvu biznis logiky:
public class MyBusinessLayer {
public RecordCollection GetRecords();
public RecordCollection GetRecordsByCategory(String categoryName);
public RecordCollection GetRecordByID(int recordID);
public String GetRecordName(int recordID);
public Object GetRecordData(int recordID);
public int UpdateRecord(Record r);
public int DeleteRecord(Record r);
public int InsertRecord(Record r);
public int UpdateRecordData(int ID, String Data);
public int UpdateRecordName(int ID, String Name);
}
public class Record {
public int ID { get; set; }
public String Name { get; set; }
public Object Data { get; set; }
}
Hlavný rozdiel medzi vrstvou biznis logiky a vrstvou prístupu k dátam je, že prvá poskytuje
silno-typovanú kolekciu RecordCollection záznamových objektov namiesto DataView. Tak isto umožňuje
použitie objektu Record ako parametra pri operáciách Update, Insert a Delete. Vlastnosť DataObjectTypeName dovoľuje nastaviť
objektový dátový zdroj, aby umožňoval odovzdávanie tohto typu namiesto individuálnych hodnôt polí.
Do implementácie metód na biznis-vrstve, môžete zahrnúť vlastnú logiku pre validáciu biznis pravidiel.
Môžete na príklad zaistiť, že len záznamy v kategórii "In Review" môžu byť editované alebo, že iba Administrátori môžu vkladať nové záznamy.
Môžete taktiež vložiť validačnú logiku, aby sta zaistili, že dátové typy a hodnoty poskytnuté ako argumenty sú korektné pred
samotným vkladaním, alebo modifikáciou dát v databáze. Všimnite si, že validačná logika v biznis-vrstve
nie je náhradou za validáciu vstupu v prezentačnej vrstve, ktorá pomáha smerovať používateľa pri
zadávaní správnych hodnôt pred potvrdením zmeny.
Príklad nižšie ukazuje jednoduchú biznis-vrstvu nazvanú AuthorsComponent. Vnútorne vrstva odovzdáva volania dátovej vrstve, aby
vykonala databázové operácie. Pre jednoduchosť vrstva nebude zahŕňať žiadne biznis-pravidlá, ani validáciu, hoci v reálnej aplikácii by ich obsahovala.
Všimnite si, že namiesto písanie vlastnej triedy kolekcie, ktorá má vracať silno-typované záznamy, príklad využíva výhody novej vlastnosti jazyka
v .Net Framework 2.0, ktorá má názov "Generics" (Generické-šablónové objekty), na vytvorenie kolekcie objektov Author. Použitie
silno-typovaných kolekcií umožňuje prvku ObjectDataSource odvodiť schému biznis-objektov už počas dizajnovania stránky (vo Visual Studiu a iných prostriedkoch).
VB Binding to a Business Logic Layer
Ilustrácia nižšie ukazuje interakciu medzi GridView, ObjectDataSOurce a biznis-vrstvou.
ObjectDataSource je konfigurovaný aby volal metódu GetContacts na type ContactsList, ktorá vracia
kolekciu objektov Contact. GridView prechádza cez všetky vlastnosti objektu Contact a viaže sa priamo na
vlastnosti (ID,Name) typu, aby vyrenderoval stĺpce. Všimnite si, že metóda SelectMethod môže vrátiť buď
IEnumerable objektov Contact, alebo môže vrátiť jediný objekt Contact. Prvok ObjectDataSource vždy
obaľuje výsledky metódy SelectMethod do IEnumerable, aj keď rozhranie samy neimplementujú.
Podobne ako SqlDataSource, prvok ObjectDataSource podporuje triedenie, keď metóda
SelectMethod vracia objekt DataSet, DataView alebo DataTable. Vnútorne využíva
ObjectDataSource vlastnosť DataView.Sort na vykonanie triedenia.
ObjectDataSource tiež podporuje vlastnú implementáciu triedenia v metóde SelectMethod,
čo je vhodné keď metóda nevracia DataSet, DataView alebo DataTable.
Vlastné triedenie sa nastaví pomocou vlastnosti SortParameterName na meno parametra metódy,
ktorý akceptuje SortExpression z dátového zdroja. Keď sa zavolá metóda SelectMethod, ObjectDataSource jej odovzdá výraz
, s pomocou ktorého môžete implementovať vlastnú logiku triedenia.
Predošlý príklad demonštruje vlastnú implementáciu triedenia v triede AuthorsComponent.
ObjectDataSource tak isto podporuje vlastné stránkovanie v implementácii SelectMethod.
Konfiguruje sa použitím vlastností StartRowIndexParameterName, MaximumRowsParameterName a SelectCountMethod a bližšie je rozobraný v sekcii Pokročilé Stránkovanie a Triedenie návodu.
Viazanie na Visual Studio DataSet
Budovanie vrstvy prístupu k dátam môže byť zdĺhavé, pretože sa často stáva, že ADO.NET kód na spúšťanie SQL príklazov alebo
uložených procedúr je ten istý, alebo podobný pre pre rôzne metódy vrstvy. Hoci môžete písať vašu vlastnú vrstvu prístupu k dátam,
použitím vlastného kódu ADO.NET a techník popísaných vyššie, Visual Studio poskytuje príjemnejšiu cestu
generovania vrstvy prístupu k dátam za vás, ktorá je založená na vstupoch z jednoduchého sprievodcu. Vrstva prístupu k dátam
je tvorená silno-typovanými objektami DataSet. DataSet zahŕňa typy TableAdapter, ktoré vystavujú metódy
pre vracanie silno-typovaných objekto DataTable. Metódy sú vhodné pre priame viazanie sa na ObjectDataSource, alebo na volanie z biznis-vrstvy.
Aby ste pridali DataSet do vášho projektu vo Visual Studiu, kliknite pravým tlačidlom myši v Solution Explorer a zvoľte voľbu
"Add New Item...", následne zvoľte typ projektovej položky "Dataset". Visual studio sa môže spýtať, či si želáte vložiť jeho kód
do adresára App_Code; vyberte "Yes" aby ste mohli pokračovať. Visual Studio pridá súbor DataSet.xsd do
adresára App_Code a otvorí DataSet dizajnér, v ktorom štandardne spustí sprievodcu vytváraním tabuľkových adaptérov.
Za pomoci sprievodcu môžete zvoliť SQL príkazy alebo uložené procedúry z vašej databázy, a následne pomenovať metódy asociované so
zvolenými dopytmi/príkazmi na poslednej stránke sprievodcu.
Tabuľkový adaptér môže vystaviť dva typy metód: Metódy vhodné na napĺňanie existujúceho DataSet-u (Fill metódy), a
metódy, ktoré vracajú už vyplnený objekt DataTable. Prvý typ je vhodnejší pre rich klienta (Kde sa DataSet udržiava v pamäti počas celej
doby behu aplikácie) a druhý typ je vhodnejší pre použitie v ObjectDataSource. Sprievodca vytváraním tabuľkových adaptérov
môže automaticky generovať metódy Update, Insert a Delete z SQL príkazov, ktoré poskytnete (vyžaduje sa, aby bol vybraný primárny kľúč). Po ukončení
sprievodcu, Visual Studio pridá novú dátovú tabuľku a nový typ TableAdapter do DataSet dizajnéra.
Tabuľkový adaptér reprezentuje schému pre jedinú množinu výsledkov operácií Select, Update, Insert alebo Delete.
Môžete pridať niekoľko TableAdaptérov do DataSet-u pravým kliknutím v DataSet dizajnéri.
Dajú sa tiež pridať dodatočné dopyty, ak vracajú tú istú schému (množinu dátových polí). Dopyt pridáte tak, že pravým
tlačidlom kliknete na TableAdapter v DataSet dizajnéri. Môžete mať na príklad jediný TableAdapter s metódami
GetAuthors() a GetAuthorsByID(int id), ale budete potrebovať nový TableAdapter na pridanie metódy
GetTitles(). Obrázok nižšie ukazuje DataSet dizajnér s niekoľkými pridanými tabuľkovými adaptérmi:
Keď dokončíte návrh DataSetu, uložte DataSet.xsd (čo spôsobí, že dizajnér na pozadí skompiluje
typy, aby boli prístupné pre vaše stránky). Teraz môžete vidieť, že typy sú prístupné pre kód stránky:
protected void Page_Load(object sender, EventArgs e)
{
DataSetTableAdapters.PhotosTableAdapter adapter = new DataSetTableAdapters.PhotosTableAdapter();
adapter.GetPhotosForAlbum(0);
}
Nepotrebujete volať spomínané metódy priamo z kódu. Môžete na ne naviazať priamo ObjectDataSource:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
TypeName="DataSetTableAdapters.PhotosTableAdapter"
SelectMethod="GetPhotosForAlbum">
<SelectParameters>
<asp:QueryStringParameter Name="albumID" QueryStringField="id" Type="Int32"/>
</SelectParameters>
</asp:ObjectDataSource>
Posledný príklad ukazuje ObjectDataSource naviazaný na metódy DataSet.TableAdapter. Tento konkrétny DataSet budeme používať
neskôr v nasledujúcich príkladoch návodu, aby sme ukázali, ako môžete použiť prvky ASP.NET na implementáciu jednoduchého foto-albumu.
Všimnite si, že DetailsView v príklade používa nový typ poľa nazývaný ImageField na zobrazenie fotiek. Zároveň si všimnite použitie ConvertNullToDBNull
na prvku ObjectDataSource, aby sa parametre s hodnotou null konvertovali na hodnotu DBNull predtým, ako sú odovzdané metódam tabuľkového adaptéra (vyžadované).
br />
VB Binding to a Visual Studio DataSet
|
|