Avatar billede havmaage Juniormester
19. oktober 2015 - 21:09 Der er 10 kommentarer og
1 løsning

c# 3 præsentation, Forretning, data lag design

Hejsa
Jeg har et spørgsmål omkring Applikationsdesign. Jeg ville gerne kode mit program i 3 lag.

Presentationslaget# gui, bruger input

Forretningslaget # forretningsflow, beregninger m.m

Datalaget#
Database access skriv/læs 

men hvordan binder jeg det sammen på en professionel måde.

Jeg har kodet en prototype af et program.
men jeg kalder sådan set alle mine klasser fra knappens kode

private void button1_Click(object sender, EventArgs e)

        {
            addHandlers();
            int maxDistance;
            int zoomLevel;
            int policenr;
            List<PoliceData> test = new List<PoliceData>();
            List<SkadeData> skader = new List<SkadeData>();
            DbFactory poli = new DbFactory();
            test.Clear();
            skader.Clear();
            policenr = Convert.ToInt32(txtPoliceNr.Text);
            test = poli.getPoliceData(policenr);
            skader = poli.getSkadeData();
            lblCity.Text = test[0].Bynavn;
            if (String.IsNullOrEmpty(txtInputDist.Text)) {
                    maxDistance = 1000;
            }else {
                maxDistance = Convert.ToInt32(txtInputDist.Text);
            }

            if (String.IsNullOrEmpty(txtInputZoom.Text)) {
                zoomLevel = 8;   
            }else {
                zoomLevel = Convert.ToInt32(txtInputZoom.Text);
            }
            List<MarkersClass> listMarkers = new List<MarkersClass>();
           
            listMarkers.Add(new MarkersClass { Color = "green", Label = "P", Lat = test[0].Lattitude, Long = test[0].Longitude, IsPolice = true });

            foreach(var skade in skader)

            {
             
                listMarkers.Add(new MarkersClass { Color = "red", Label = "S", Lat = skade.Lattitude, Long = skade.Longitude, IsPolice = false });
   
            }
           
         
            if (Dirty == false)
            {
                VamosMapClass map = new VamosMapClass(listMarkers);
                Dirty = true;

                map.zoomlevel = zoomLevel;
                webBrowser1.Navigate(map.CreateApiCall(maxDistance));
            }
         


Jeg ville gerne kunne splitte det op gerne med Interfaces som "holder" kontrakten mellem lagende

Så mit spørgsmål er følgende:

Jeg har en formklasse med en knap
denne knap
åbner et kald til en database der returnere en list<data> som
er grundlag for noget beregning og returnere herefter en text til en label på min form.

Hvis man skulle designe dette med Interfaces hvordan kunne dette så se ud.

Ved det er meget at spørge om, men tror bare lige jeg skal se et lille eksempel i praksis (uden at klasserne behøves at være Implementeret før jeg kan komme videre.

jeg anvender ORM NhiberNate til håndtering af data og har seperate klasser de ligger bare i en stor bunke.
Avatar billede arne_v Ekspert
19. oktober 2015 - 21:17 #1
Jeg lavede et eksempel til et andet spm. for mange aar siden:

http://www.eksperten.dk/spm/774299

maaske kan det inspirere lidt.
Avatar billede havmaage Juniormester
19. oktober 2015 - 21:54 #2
har lige studeret det lidt, det ligner noget moneny transfer.

Som jeg ser det
Præsentationslaget
user kontroller (winform)
her modtages input til initalisering af applikationen
dvs. bruger input < hvad med input fra f.eks App.config filen>
herfra kalder man metoder i BLL laget med disse data


BLL er(forretningslaget)
Her valideres input og der sendes Exceptions retur til brugeren hvis data er invalide.
Her sendes Querys til DAL (Datalaget)
Her Modtages data fra DAL
Her udføres der beregninger og flow
Her sendes data til Præsentationslaget

DAL
Håndtere DB Sessions
Udfører læsninger og Returnere data
Udfører Skrivninger

### Kan man sige at der mellem præsentationslaget og BLL laget er en høj binding og at der mellem BLL og DAL er en lav binding
Eller er det helt forkert.
Det er bare fordi DAL ser ud til at være mere sin helt egen og kan 2leve uden de andre lag" man kunne også skifte db uden at skulle ændre i andet en NhiberNate konfigurationen.
Avatar billede arne_v Ekspert
20. oktober 2015 - 02:27 #3
Pointen i mit eksempel er at et lag kun udstiller:
* data klasser
* interface
* factory
som public mens resten er ikke-public.

Det sikrer den lave kobling.
Avatar billede Syska Mester
20. oktober 2015 - 09:59 #4
Kig på MVP eller MVVM til Apps.

Udover det, så ville jeg nok også kigge på WPF og ikke WinForms.
Avatar billede havmaage Juniormester
22. oktober 2015 - 18:56 #5
hejsa
Det er ikke fordi jeg ikke er aktiv på spørgsmålet, skal bare lige studere det hele lidt nøjere.
Jeg har et helt konkret spørgs.

Jeg skal have valideret noget bruger input samt nogle min og max væerdier.
Jeg over vejer at oprette en hjælpe klasse som så skulle være statisk.
static class helper {
}

Spørgsmålet er om hvor i koden det ville være bedst at anvende den i forhold til god arkitetur.
Skulle jeg validere allerede i præsentationslaget eller skal det valideres i Businesslaget. Umiddelbart er min egen intuition at det bør være i præsentatonslaget.

Men en hjælpe klasse kan jo også indeholde metoder der bruges i de andre lag ?.
Avatar billede arne_v Ekspert
22. oktober 2015 - 19:17 #6
Jeg mener at syntax validering skal ske i PL mens semantisk validering skal ske i BLL.

Lad os sige at der skal indtastes et fra tidspunkt, et til tidspunkt og et beloeb.

PL checker at der er intastet to valide datoer og enten et heltal eller ettal med to decimaler.

BLL checker om til er senere end fra og om beloebet kan er passende.
Avatar billede arne_v Ekspert
22. oktober 2015 - 19:20 #7
Med hensyn til kode for test vil jeg vaelge en af:
- privat metode i klassen med helt specifikke test
- en utility klasse med statiske metoder med generelle test og kald af dem med argumentet som goer testet specifik
Avatar billede arne_v Ekspert
22. oktober 2015 - 19:21 #8
Utility klasser kan du godt holde udenfor de gaengse lag, men i de fleste tilfaelde tror jeg dog at en utility klasse hoerer hjemme i kun et lag.
Avatar billede havmaage Juniormester
22. oktober 2015 - 19:29 #9
Tusind tak for de gode kommentarer, det er virkelig noget jeg kan bruge.
Avatar billede havmaage Juniormester
27. oktober 2015 - 10:07 #10
Arne_v
Vil du lægge et svar så lukker jeg spg. Tak for deltagelsen, det gjorde en forskel.
Avatar billede arne_v Ekspert
27. oktober 2015 - 14:21 #11
svar
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

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