Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

N-lags design/Otto Knudsen 1 N-lags Design Definition Motivation.

Lignende præsentationer


Præsentationer af emnet: "N-lags design/Otto Knudsen 1 N-lags Design Definition Motivation."— Præsentationens transcript:

1 N-lags design/Otto Knudsen 1 N-lags Design Definition Motivation

2 N-lags design/Otto Knudsen 2 N-lags Design Datadrevne applikationer har typisk N > 1 lag Præsentations-, Forretnings-, Datatilgangs-, og Data-laget BusinessData AccessData StorePresentation data access DB object business "To support all security, business rules, and data processing (validation, manipulation & storage) for our particular business." [Rocky Lhotka] “Not to manage or store data, but to provide an interface between business logic & data store.” [Rocky Lhotka]

3 N-lags design/Otto Knudsen 3 Motivation Hvorfor N-lags design? Mange gode grunde fx: objektorienteret løsning opdeling i logiske enheder softwareudvikling i teams genbrug af forretningslogik og data på tværs af præsentationer data access DB object business Desktop App Web App

4 N-lags design/Otto Knudsen 4 Eksempel Lad os redesigne StudentInfo applikationen … Forretningslaget omhandler de studerende Datatilgangslaget omhandler databasen Students

5 N-lags design/Otto Knudsen 5 Præsentationslaget Præsentationslaget kommunikeret kun med forretningslaget: protected void Page_Load(object sender, EventArgs e) { object obj = this.Context.Items["ID"]; // Kom brugeren direkte? if (obj == null) this.Response.Redirect("Login.aspx", true /*afslut nu*/); // Hvis alt er ok... BusinessTier.Students students; BusinessTier.Student s; id = System.Convert.ToInt64(obj); students = new BusinessTier.Students(); s = students.GetStudent(id); this.tbxName.Text = string.Format("{0}, {1}", s.LastName, s.FirstName); this.tbxEmail.Text = s.Email; this.tbxGPA.Text = s.GPA.ToString("0.00"); } protected void Page_Load(object sender, EventArgs e) { object obj = this.Context.Items["ID"]; // Kom brugeren direkte? if (obj == null) this.Response.Redirect("Login.aspx", true /*afslut nu*/); // Hvis alt er ok... BusinessTier.Students students; BusinessTier.Student s; id = System.Convert.ToInt64(obj); students = new BusinessTier.Students(); s = students.GetStudent(id); this.tbxName.Text = string.Format("{0}, {1}", s.LastName, s.FirstName); this.tbxEmail.Text = s.Email; this.tbxGPA.Text = s.GPA.ToString("0.00"); }

6 N-lags design/Otto Knudsen 6 Forretningslaget Erklærer en Student -klasse til at repræsentere en student Erklærer en Students -klasse til at repræsentere en samling af studerende kommunikerer med datatilgangslaget vha. SQL namespace BusinessTier { public class Students { private DataAccessTier.DataAccess data; public Students() {... } public Student GetStudent(long id) { string sql = string.Format("Select * From Students Where SID={0};", id); DataSet ds = data.Select(sql); return new Student(...); } namespace BusinessTier { public class Students { private DataAccessTier.DataAccess data; public Students() {... } public Student GetStudent(long id) { string sql = string.Format("Select * From Students Where SID={0};", id); DataSet ds = data.Select(sql); return new Student(...); } namespace BusinessTier { public class Student {. } namespace BusinessTier { public class Student {. }

7 N-lags design/Otto Knudsen 7 Datatilgangslaget En generisk og genbrugbar klasse til eksekvering af SQL stiller metoder til rådighed til Select - og Action - forespørgsler namespace DataAccessTier { public class DataAccess {. public System.Data.DataSet Select(string sql) { // Udfører en sql-sætning og returnerer et DataSet } public int Action(string sql) { // Udfører en sql-sætning og returnerer antallet af berørte poster }. } namespace DataAccessTier { public class DataAccess {. public System.Data.DataSet Select(string sql) { // Udfører en sql-sætning og returnerer et DataSet } public int Action(string sql) { // Udfører en sql-sætning og returnerer antallet af berørte poster }. }

8 N-lags design/Otto Knudsen 8 N-lags Design Der findes rigtig mange forskellinge måder at designe N-lags applikationer på anvendelse af SQL til at forbinde lagene med er fleksibelt men risikofyldt mange foretrækker at anvende "stored procedures" ved datatilgang og så videre …

9 N-lags design/Otto Knudsen 9 Assemblies Logisk vs. fysisk design Arbejde med assemblies

10 N-lags design/Otto Knudsen 10 Logisk vs. fysisk design Lagdelingen udgør det logiske design Assemblies udgør det fysiske design data access DB object business App.dll Business.DLL Data.DLL komponenter eller "assemblies"

11 N-lags design/Otto Knudsen 11 Motivation Hvorfor oprette fysisk adskilte assemblies? assemblies kan skrives i forskellige sprog assemblies kan deles af flere programmer assemblies kan flyttes til andre maskiner assemblies kan let erstattes/opdateres.NET selv udgøres af en mængde assemblies, fx ASP.NET. App.dll Business.DLL Data.DLL DB

12 N-lags design/Otto Knudsen 12 Eksempel StudentInfo webapplikationen består af tre assemblies …

13 N-lags design/Otto Knudsen 13 Oprettelse af Assemblies Ethvert projekt i en Visual Studio solution udgør én assembly class library =>.dll File menu > Add > New Project … Bemærk: for at kunne bruge en assembly, skal der refereres til den! Project menu > Add Reference… brug.NET-fanen til kompileret kode brug Project-fanen til andre projekter

14 N-lags design/Otto Knudsen 14 Arbejde med flere projekter Lav først en tom solution File > New Project > Other Project Types > Visual Studio Solutions Opret en webapplikation: File > Add > New Web Site … placeres i den tomme solution, som just er oprettet Opret klassebibliotek: File > Add > New Project > Class Library… placeres også i den nyligt oprettede solution Tilføj projektreferencer …

15 N-lags design/Otto Knudsen 15 ADO.NET Resumé af databasetilgang i.NET

16 N-lags design/Otto Knudsen 16 Forespørgsler i VS 2005 VS kan åbne databaser og lade dig forespørge i dem For at teste SQL-forespøgsler, granske metadata, osv. Tools menu > Connect to Database… Vælg Datakilde m.v. — tryk OK Du kan nu arbejde via Server Explorer-vinduet og Data-menuen …

17 N-lags design/Otto Knudsen 17 Eksempel — Programmering med ADO.NET Indlæs alle kunderne fra databasen og vis dem i en ListBox … List customers; customers = new List ();.. // Indlæs Customers-tabellen og opret tilhørende objekter …. foreach (Customer c in customers) this.lstCustomers.Items.Add(c); List customers; customers = new List ();.. // Indlæs Customers-tabellen og opret tilhørende objekter …. foreach (Customer c in customers) this.lstCustomers.Items.Add(c); DB

18 N-lags design/Otto Knudsen 18 Databasetilgang - mønster Tre trin: opret og konfigurér objekter forbered og udfør SQL gennemløb data

19 N-lags design/Otto Knudsen 19 Overblik over objekter Datatilgang kræver flere forskellige objekter: Connection – objekt, som repræsenterer forbindelsen Command – objekt, som repræsenterer SQL-forespørgslen DataAdapter – objekt, som udtrækker data fra databasen til et DataSet DataSet – objekt, som er en beholder til tabeldata Name Price Stock Ants $ 0.495000 Birds $ 4.49500 Cats $29. 95100 Dogs $79. 9520 DB Command Connection DataAdapter "Table" DataSet DB engine

20 N-lags design/Otto Knudsen 20 (1) Opret og konfigurér objekter ADO.NET Factory klasse skjuler provider-specifikke detaljer Eksempel: opsætning af en Microsoft Access 2000 database ("Sales.mdb") using System.Data; using System.Data.Common; string provider; DbProviderFactory dbFactory; DbConnection dbConn; // Repræsenterer databasen DbCommand dbCmd; // Kommandoobjekt DbDataAdapter dbAdapter; // Indlæser data og gemmer i et DataSet DataSet ds; // Beholder til tabeldata provider = "System.Data.OleDb"; dbFactory = DbProviderFactories.GetFactory(provider); dbConn = dbFactory.CreateConnection(); dbCmd = dbFactory.CreateCommand(); dbAdapter = dbFactory.CreateDataAdapter(); ds = new DataSet(); dbCmd.Connection = dbConn; // Associér forbindelse og kommando dbAdapter.SelectCommand = dbCmd; // Associér adapter og kommando using System.Data; using System.Data.Common; string provider; DbProviderFactory dbFactory; DbConnection dbConn; // Repræsenterer databasen DbCommand dbCmd; // Kommandoobjekt DbDataAdapter dbAdapter; // Indlæser data og gemmer i et DataSet DataSet ds; // Beholder til tabeldata provider = "System.Data.OleDb"; dbFactory = DbProviderFactories.GetFactory(provider); dbConn = dbFactory.CreateConnection(); dbCmd = dbFactory.CreateCommand(); dbAdapter = dbFactory.CreateDataAdapter(); ds = new DataSet(); dbCmd.Connection = dbConn; // Associér forbindelse og kommando dbAdapter.SelectCommand = dbCmd; // Associér adapter og kommando

21 N-lags design/Otto Knudsen 21 (2) Forbered og udfør SQL Opret de SQL-sætninger, som skal udføres Åbn forbindelse til databasen, udfør SQL og luk forbindelsen igen! forbindelses-info er også provider-specifikt Sørg for at placere "Sales.mdb"-databasen i samme mappe som.exe-filen string sql, connection; sql = "Select * From Customers Order By LastName Asc, FirstName Asc;"; connection = string.Format("Provider={0};Data Source={1}", "Microsoft.Jet.OLEDB.4.0", "|DataDirectory|Sales.mdb"); dbConn.ConnectionString = connection; // Angiv database dbCmd.CommandText = sql; // Angiv SQL-forespørgsel dbConn.Open(); // Åbn, udfør, luk! dbAdapter.Fill(ds); dbConn.Close(); string sql, connection; sql = "Select * From Customers Order By LastName Asc, FirstName Asc;"; connection = string.Format("Provider={0};Data Source={1}", "Microsoft.Jet.OLEDB.4.0", "|DataDirectory|Sales.mdb"); dbConn.ConnectionString = connection; // Angiv database dbCmd.CommandText = sql; // Angiv SQL-forespørgsel dbConn.Open(); // Åbn, udfør, luk! dbAdapter.Fill(ds); dbConn.Close();

22 N-lags design/Otto Knudsen 22 (3) Gennemløb data Kopi af data findes nu i DataSet Gennemløb data Eksempel: Lav kunde-objekter og vis dem i en ListBox this.customers = new List (); foreach (DataRow row in ds.Tables["Table"].Rows) { Customer c; c = new Customer( System.Convert.ToInt64(row["CID"]), row["FirstName"].ToString(), row["LastName"].ToString(), System.Convert.ToDecimal(row["CreditLimit"]), System.Convert.ToDecimal(row["AcctBalance"]) ); this.customers.Add(c); } foreach (Customer c in customers) this.lstCustomers.Items.Add(c); this.customers = new List (); foreach (DataRow row in ds.Tables["Table"].Rows) { Customer c; c = new Customer( System.Convert.ToInt64(row["CID"]), row["FirstName"].ToString(), row["LastName"].ToString(), System.Convert.ToDecimal(row["CreditLimit"]), System.Convert.ToDecimal(row["AcctBalance"]) ); this.customers.Add(c); } foreach (Customer c in customers) this.lstCustomers.Items.Add(c);

23 N-lags design/Otto Knudsen 23 God programmeringsskik Sørg for at lukke forbindelsen Rapportér fejl. dbFactory = DbProviderFactories.GetFactory(provider); try { using (dbConn = dbFactory.CreateConnection()) { dbCmd = dbFactory.CreateCommand(); dbAdapter = dbFactory.CreateDataAdapter();. dbConn.Open(); dbAdapter.Fill(ds); } // Databasen lukkes automatisk } catch(Exception ex) { System.Diagnostics.Debug.WriteLine("Fejl: " + ex.Message); System.Diagnostics.Debug.WriteLine("Stack: " + ex.StackTrace); throw; }. dbFactory = DbProviderFactories.GetFactory(provider); try { using (dbConn = dbFactory.CreateConnection()) { dbCmd = dbFactory.CreateCommand(); dbAdapter = dbFactory.CreateDataAdapter();. dbConn.Open(); dbAdapter.Fill(ds); } // Databasen lukkes automatisk } catch(Exception ex) { System.Diagnostics.Debug.WriteLine("Fejl: " + ex.Message); System.Diagnostics.Debug.WriteLine("Stack: " + ex.StackTrace); throw; }

24 N-lags design/Otto Knudsen 24 Tilgang til andre typer databaser? Gode nyheder — ændr provider- og connection-oplysningerne! Eksempel: udtræk af kunde fra Microsoft SQL Server. provider = "System.Data.SqlClient";. connection = string.Format("Server={0};Database={1};{2}", ".", // "." = lokal server, ellers ip-adresse/alias "Sales", "Integrated Security=SSPI"); // eller "uid=?;pwd=?". provider = "System.Data.SqlClient";. connection = string.Format("Server={0};Database={1};{2}", ".", // "." = lokal server, ellers ip-adresse/alias "Sales", "Integrated Security=SSPI"); // eller "uid=?;pwd=?".

25 N-lags design/Otto Knudsen 25 Hvad så? Øvelse #6

26 N-lags design/Otto Knudsen 26 …


Download ppt "N-lags design/Otto Knudsen 1 N-lags Design Definition Motivation."

Lignende præsentationer


Annoncer fra Google