Avatar billede pfp Nybegynder
26. januar 2007 - 15:44 Der er 18 kommentarer og
1 løsning

Seperate lag

Hej,

Jeg vil gerne prøve at få bedre fat i lagdeling. Tre lag: Presentation, Business og Data.

Ideen er vel at afhængigheden er lineær? Altså at hvert lag kun kalder ned i modellen.

Presentation kalder Business (modellen) og modellen kalder datalaget.

Jeg har for forsøgets skyld prøvet at opdele dette med 3 seperate projekter i Visual Studio. 1 Windows applikation (Presentation) + 2 ClassLibries (Business + Data).

Det går meget godt indtil jeg løber i problemer omkring datalaget.

Business projektet har en reference til datalaget, så denne kan anvende de mappers der er tilgængelig i datalaget.

Men for at mine DataMappers kan returnere objekter til mit Business lag [eksempel GetUser(int userId)], skal datalaget jo også kende min Business assembly..

Men det giver hvad Visual Studio kalder circular dependency.

Er løsningen at jeg fra mit datalager lader være med at returnere Business entiteter og istedet lader DAL smide IDataReaders retur til Business laget, for derefter at lade den selv have ansvaret for at oversætte disse "bulk" data til business entiter?

Jeg håber meget at der er et par stykker som vil give sit besyv med for at kaste en smule lys over min forvirring :)

Tak.

/pfp
Avatar billede arne_v Ekspert
26. januar 2007 - 15:53 #1
PL->BLL->DAL er rigtigt (selvom jeg plejer at foretraekke at beskrive det som PL->CL->BLL->DAL)

du har helt ret i "en vejs" betragtningen

men jeg forstaar ikke hvorfor dit DAL skal kende dit BLL for at returnere
data til det

de metoder i DAL som BLL kalder returnerer data typisk enten et enkelt
objekt af en klasse defineret i DAL eller en collection af saadanne objekter

hvis du vil returner de samme typer fra BLL til PL kan du overveje at putte
de data klasser i en seperat assembly
Avatar billede pfp Nybegynder
26. januar 2007 - 16:01 #2
"men jeg forstaar ikke hvorfor dit DAL skal kende dit BLL for at returnere
data til det"

Følgende korte eksempel for at illustrere hvad jeg mener. Betragt metoden GetUser i DAL:

public IUser GetUser(int userId)
{
  IUser u = new User();
  // fyld data i u her...

  return u;
}

Ovenstående lader sig kun gøre hvis DAL kender min Business.dll - og det er jo vel ikke ønskværdigt.

Mit konkrete spørgsmål er nok derfor, om jeg i stedet for ovenstående bør have følgende GetUser implementation i DAL:

public IDataReader GetUser(int userId)
{
  // hent resultset ind i readeren
  IDataReader reader = cmd.ExecuteReader();
  return reader;
}

Og så herefter lader en "translator" i Business assemblyen behandle denne datareader som den vil?

Giver det mening?
Avatar billede arne_v Ekspert
26. januar 2007 - 16:02 #3
det forstaar jeg ikke

IUser skal vaere defineret i dit DAL (eller i en helt udenforstaaende assembly)

den metode skal ikke kende dit BLL
Avatar billede pfp Nybegynder
26. januar 2007 - 16:05 #4
IUser ligger i et assembly for sig selv..
Avatar billede arne_v Ekspert
26. januar 2007 - 16:07 #5
Hvis IUser ligger i et seperat assembly, saa kan jeg ikke se hvad GetUser metoden
skal bruge fra BLL !
Avatar billede arne_v Ekspert
26. januar 2007 - 16:07 #6
det er set mange gange at returnere IDataReader eller lignende fra DAL

men vi er en del som ikke synes at der er paent

det knytter ligesom DAL til databaser

masske skulle data gemmes i en XML fil

maaske skulle data hentes med en web service

interfacet til DAL boer ikke knyttes til en bestemt opbevarinsg teknologi

heller ikke selv om databaser vel daekker 99.9%
Avatar billede pfp Nybegynder
26. januar 2007 - 16:10 #7
Jeg kan godt se din pointe.

Men hvad skal jeg så returnere fra DAL..hvis ikke jeg kan returnere DataReader, DataSet eller loadede Business entiteter?
Avatar billede arne_v Ekspert
26. januar 2007 - 16:30 #8
jeg kan se flere veje frem, bl.a.:

1) du putter klassen der implementerer IUser i DAL assembly
2) du aendrer IUser til en faktisk User klasse og har fortsat den i den seperate assembly
Avatar billede pfp Nybegynder
26. januar 2007 - 17:01 #9
Ret mig hvis jeg tager fejl..

1) Dermed ligger al min forretningslogik i DAL?
2) Er jeg ikke sikker på jeg forstår. Hvis du mener jeg returnerer en faktisk instans af User (som er i sep. assembly) fra DAL, så får jeg vel en afhængighed hvor DAL kalder "opad"?
Avatar billede pfp Nybegynder
26. januar 2007 - 17:01 #10
Dit forslag nr. 1 fjerner vel helt behovet for et seperat Business projekt?
Avatar billede arne_v Ekspert
26. januar 2007 - 17:43 #11
Den User klasse jeg snakker om indeholder kun data ingen logik.

Private fields, en constructor uden args, en constructor med alle args,
public properties for alle fields og maaske en ToString, Equals og GetHashCode.

Skal BLL have en User klasse med noget business logic i saa laver den sin
egen klasse evt. med en constructor som kan tage en data User klasse som
argument.
Avatar billede arne_v Ekspert
26. januar 2007 - 17:48 #12
med hensyn til nummer 2 er modellen at du faar en sidlaens afhaengighed

PL
BLL    Util
DAL

Det er ike helt saa paent, men det muliggoer at PL-BLL og BLL-DAL interfacene
kan bruge de samme data klasser.

Specielt med meget "tynde" BLL kan det spare noget kode.
Avatar billede arne_v Ekspert
26. januar 2007 - 19:33 #13
vaer ioevrigt opmarksom paa at der er alternative approaches

det er dem som svaerger til DataSet gerne type safe DataSet

der er dem som foretraekker at putte deres business logic i stored procedures i databasen
Avatar billede pfp Nybegynder
26. januar 2007 - 19:46 #14
Tak Arne.

Det var meget opklarende.

Mht. til den model jeg egentlig selv foretrækker. 4 assemblies:

- Interfaces
- Presentation
- Business
- Data

PL -> BLL -> DAL og ved returnering fra DAL sendes IDataReader.

Hvis jeg accepterer fastlåsningen på database som kilde, hvad er kommentarerne så til denne model?
Avatar billede pfp Nybegynder
26. januar 2007 - 19:47 #15
(og dermed lade EntityTranslators i BLL afgøre hvordan IDataReaders behandles...)
Avatar billede arne_v Ekspert
26. januar 2007 - 19:59 #16
det er set mange gange foer

dit DAL kommer nok til at ligne DAAB lidt, men MS er vel ogsaa et godt forbillede
Avatar billede pfp Nybegynder
26. januar 2007 - 20:01 #17
Okay :)

Så bliver det sådan i første omgang. Det er jo rart nok lige at få bekræftet at det ikke er helt helt ude i skoven, selvom der naturligvis altid er forskellige holdninger til den slags.

Jeg siger mange tak for dine forskellige vinkler på mine spørgsmål.
Avatar billede pfp Nybegynder
29. januar 2007 - 17:08 #18
Ligger du et svar?
Avatar billede arne_v Ekspert
29. januar 2007 - 23:48 #19
kommer her
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