Avatar billede dj_uncas Nybegynder
03. juni 2005 - 00:11 Der 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!
Avatar billede burningice Nybegynder
03. juni 2005 - 00:47 #1
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.
Avatar billede nheilbuth Nybegynder
03. juni 2005 - 09:37 #2
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.
Avatar billede arne_v Ekspert
03. juni 2005 - 19:55 #3
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å.

Og undskyld mixet af danske og engelske termer.
Avatar billede dj_uncas Nybegynder
05. juni 2005 - 10:36 #4
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
Avatar billede arne_v Ekspert
05. juni 2005 - 10:51 #5
En OR mapper er noget som kan mappe mellem objekter og rækker i tabeller i relations
databaser.

De findes i mange afskygninger.

Men lad mig give et stiliseret eksempel.

Vi har en klasse:

public class T1
{
    public int f1;
    public string f2;
}

så har vi en tabel i database:

t1
--
f1 integer pk
f2 varchar(50)

så laver vi en mapning:

<arnesmapper>
  <class name="t1" table="t1">
      <field name="f1" column="f1"/>
      <field name="f2" column="f2"/>
  </class>
</arnemapper>

Så kan man bruge:

T1 o = arnemapperinstans.Load(123);
o.f2 = "ABC";
arnemapperinstans.Save(o);

Der findes en million varianter, men ideen må fremgå af ovenstående.
Avatar billede arne_v Ekspert
05. juni 2005 - 10:53 #6
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
Avatar billede arne_v Ekspert
05. juni 2005 - 10:54 #7
data fra database til objekter kan gøres med:

* data adapter og data set

* data reader og array/ArrayList af objekter

* O/R mapper og array/ArrayList af objekter

og sikkert mange flere
Avatar billede dj_uncas Nybegynder
05. juni 2005 - 21:10 #8
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!
Avatar billede arne_v Ekspert
05. juni 2005 - 21:12 #9
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
Avatar billede arne_v Ekspert
05. juni 2005 - 21:12 #10
og svar
Avatar billede dj_uncas Nybegynder
05. juni 2005 - 22:44 #11
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?
Avatar billede arne_v Ekspert
05. juni 2005 - 22:58 #12
der er knas i Ekspertens email system så de får ikke email om at der
er aktivitet så det kan godt vare lidt inden de kigger forbi
Avatar billede arne_v Ekspert
05. juni 2005 - 23:22 #13
iøvrigt synes jeg ikke nødvendigvis at .aspx.cs hører hjemme i presentation layer

i nogen tilfælde kan man argumentere for at det er business logic layer

eller hvis man skifter til en 4 layer model (presentation, controller,
business logic, data access) så kan man kalde det for controller
layer

den sidste synsvinkel er jeg blevet meget glad for på det sidste
Avatar billede dj_uncas Nybegynder
06. juni 2005 - 13:11 #14
hvad vil du da have i dit presentation layer hvis det ikke skal være .aspx.cs sider?
Avatar billede arne_v Ekspert
06. juni 2005 - 13:16 #15
.aspx
Avatar billede dj_uncas Nybegynder
06. juni 2005 - 15:56 #16
hmm, ok.

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!

Hvad vil du/i foreslå?
Avatar billede dj_uncas Nybegynder
25. juni 2005 - 02:25 #17
Nå, nu gider jeg ikke vente mere.. Her er dine points arne_v
Avatar billede burningice Nybegynder
25. juni 2005 - 11:09 #18
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;
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester