03. juni 2005 - 00:11Der er
17 kommentarer og 1 løsning
Three tier application
Hej hej
Jeg har fået forklaret grundprincipperne i såkaldte three tier applications, og er begyndt at lege med det, i ASP.NET sammenhæng. Jeg er dog gået hen og blevet lidt forvirret, og har nogle spørgsmål om den tekniske del af det:
1. Hvor mange steder i koden skal man forbinde til db? Såvidt jeg har forstået det er det kun i DAL, men jeg synes tit man bliver nødt til også at have en lille forbindelse andre steder..!
2. Klasserne i Business logikken skal altså ikke have nogen db forbindelser i sig, men, hvis vi forestiller os et nyheds-objekt, hvordan får man så hevet nyhederne ud fra databasen, og lagt en instans af dette?
Hvis der er nogle der har links til artikler om emnet (gerne med eksempler) er de mere end velkomne!
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
1) hvis du syntes at du bliver nødt til at have en lille forbindelse andre steder, så har du design-fejl i din applikation.
2) Du bruger en OR-mapper. Det er et komponent der kan tage dine Businnes objecter og gemme dem i databasen, og igen, hente Business objecter ud fra databasen.
Hvis der skal være nogen mening med lagdelingen af din applikation bliver du nød til at overholde den til punkt og prikke. Selvom det nogen gange kan virke som ekstra arbejde. F.eks. bliver du nød til at have en metode i DAL som du kan kalde fra business logikken, og som så leverer data, for al data du skal hente ud fra datakilden. Det der gerne skulle være det smarte er at du skal kunne udskifte DAL uden at ændre i business logikken, altså hvis du skifter DAL ud til et der henter fra en anden type database, må business logikken ikke bliver berørt af det.
med risiko for at blive betragtet som en gnaven gammel mand vil jeg postulere at du har en 3 tier: browser web server database server hvor du i dit web server tier har 3 layers: præsentation forretnings logik data tilgang
Det er nærmest en definition på et layer at det kun kan kalde det næste layer og kun bliver kaldt fra det forrige layer.
Så derfor kalder du i dit presentation layer kode i dit business logic layer som kalder kode i dit data access layer som tilgår databasen.
Hvis din applikation er meget simpel således at der ikke er nogen business logic kan du jo overveje at droppe det layer.
Data access layer skal returnerer et eller andet objekt til business logic layer med data i. Hvilken slags objekt og hvordan data access layer henter data op fra databasen og over i objektet er der mange forskellige løsninger på.
Tak for uddybningen alle. Nu har jeg lige nogle følge spørgsmål:
burningice-> Hvad er en OR-mapper? Jeg har ledt efter det, men kan ikke umiddelbart finde noget om det.
nheilbuth-> Vil det rent teknisk sige, at man fx har en metode i sit DAL som returnere et dataset, og det skal den kunne gøre ligemeget hvad type db man bruger? Altså således at man ikke behøver skifte business logikken ud, hvis denne er beregnet til at arbejde med et dataset?
arne_v-> Har du nogen eksempler på de forskellige løsninger (en sproglig forklaring er også fint) Ps. det gør ikke noget
Det må være et absolut krav til et godt data access layer at der ikke skal ændres i business logic layer eller presentation layer hvis du skifter database - i nogle tilfælde vil du endda kunne skrive dit data access layer så det ikke skal ændres
ok, så har jeg været inde på noget af det rigtige i mine overvejelser, jeg synes bare det så lidt mærkeligt ud, især det med at kalde hive data ud fra en database (gennem datalaget vel at mærke) i selve klasserne i business logikken. Jeg har nemlig studeret et par ASP.NET sample apps for at se noget om "best practice" osv. i større applikationer, og her så jeg mange forskellige løsninger, men ingen have en business logik der brugte et datalag. Der var enten kun et datalag, eller ingen flere-lags struktur i dem, derfor forvirringen.
Nu tror jeg jeg er mere rustet til større opgaver, og vil derfor gerne give jer nogle point :)
Smider i et svar? I har i virkeligheden alle været lige hjælpsomme!
problemet med 3 lag er at det kun giver mening i realistiske eksempler - i hello world er der ikke meget behov for det - og de færreste artikler bøger indeholder 5000+ linier kode
nej det har du selvfølgelig ret i, men ASP.NET StarterKit Portal sample applikationen er da lidt stor. Der har de kun et datalag, og benytter det direkte i codebehind til .aspx siderne...
Vil i andre ikke også lige svare, så vi kan få lukket?
jeg har prøvet at arbejde lidt videre, og har nu fået et mere konkret problem:
jeg har en galleri-klasse til et billedgalleri, med en constructor der tager 0 argumenter. Derudover har jeg en der tager 1 argument (int id) som skal repræsentere den primære nøgle i galleri-tabellen i databasen, til når man fx vælger /galleri/?id=4. Hvad kan jeg så gøre mht. mit data layer, der sørger for at proppe noget data i de andre properties i klassen som fx overskrift, dato osv? Jeg tænkte på noget med en del der kan hente enkelte kolonner ud som strenge, men så skal jeg jo i princippet lave en metode til hver klasse i business laget!
jeg vil sige at din galleri-klasse er en del af dit data access layer, og den vil se nogenlunde sådan her ud:
public class ImageGallery { private string name; public string Name { get { return name; } }
public void ImageGallery(int id) { string sql = "SELECT name FROM tblImageGallery WHERE id = "+ id;
DataStore ds = new DataStore(); IDataReader reader = ds.ExecuteReader(sql); reader.Read();
this.name = reader.GetString(0);
reader.Close() } }
På den måde kan du i din Business Logik Layer f.eks. gøre følgende:
ImageGallery gallery = new ImageGallery(int.Parse(Request.Querystring("id")); lblName.Text = gallery.Name;
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.