Avatar billede simsen Mester
31. januar 2012 - 11:32 Der er 11 kommentarer og
1 løsning

ImplService spørgsmål

Hej,

Jeg har et projekt (privat), som jeg påtænker at gå i gang med. Jeg har i den forbindelse overvejet at lave det både til web og som en client/server løsning.

Nu har jeg så nogle spekulationer i den retning.

Normalt ville jeg lave følgende klasser:
DALStoredprocedure klasse (her mine storedprocedures ligger)
DAL klasse (her jeg laver Get/Set/Ins/Del) kald/metoder til databasen.
ImplService klasse (her jeg laver selve metoder med manipulation af ting jeg henter fra DAL klassen)
InterfaceService klassen (her oprettes selve metodenavne med in- og output parametre)

Klasserne DALStoredprocedure, DAL og InterfaceService er ens (såvidt jeg umiddelbart ser det) uanset om jeg laver det til Web eller som en client/server løsning.

Men så kommer vi til ImplService klassen.

Hvis jeg laver den til web, ville jeg lave den som følgende:
namespace ImplService
{
    public class Appendixes : IAppendixService
    {
        //Metoder her
    }
}

Når det er en Client/servcer løsning gør jeg som følgende:
namespace ImplService
{
    public class Appendixes : MarshalByRefObject, IAppendixService
    {
        //Metoder her
    }
}

Altså der er en forskel i kaldet mht. MarshalByRefObject

Betyder det så, at jeg skal lave to ImplService og dermed også to forskellige Interface Services. Eller hvordan løser jeg det, så de kan bruge det samme?
Avatar billede arne_v Ekspert
31. januar 2012 - 19:26 #1
Jeg kan umiddelbart se 3 oplagte designs:

1)

IFoobarService
FoobarService : MarshalByRefObject, IFoobarService

web app laver remoting kald til service

fat client desktop app laver remoting kald til FoobarService

2)

IFoobarService
FoobarService : IFoobarService
RemoteFoobarService : MarshalByRefObject, IFoobarService

web app laver local kald til FoobarService

fat client desktop app laver remoting kald til RemoteFoobarService

RemoteFoobarService laver local kald til FoobarService

3)

IFoobarService
FoobarService : MarshalByRefObject, IFoobarService

web app laver local kald til FoobarService

fat client desktop app laver remoting kald til FoobarService
Avatar billede arne_v Ekspert
31. januar 2012 - 19:31 #2
Jeg er ikke saa glad for #3. Det er lidt noget roderi. Men med en kommentar i toppen af koden som forklarer situationen kan den maaske godt bruges.

#2 giver lidt ekstra arbejde p.g.a. alle passthrough metoderne som skal skrives. Til gengaeld er modellen god hvis du skal tilfoeje andre transporter saasom .asmx web service, WCF web service, plain socket etc..

#1 har den store fordel at web app og desktop apps kan dele cache i service laget, hvilket tillader meget mere agressiv caching og deraf foelgende bedre performance. Til gengaeld er der saa ogsaa lidt mere kompleksitet i web app.
Avatar billede janus_007 Nybegynder
31. januar 2012 - 22:18 #3
Jeg ville lave det som WCF :) og med en ORM, evt. Linq To Sql.

Må jeg spørge hvad du tænker IAppendix skal bruges til?, hvis du skal bruge interfaces skal der være en årsag til implementeringen.

Jeg ville også undgå DAL og blot benytte mig af ORM'en istedet :)

Just my 2 cent :)
Avatar billede arne_v Ekspert
01. februar 2012 - 03:52 #4
WCF med TCP transport er den afloeseren for remoting. Men config filerne kan godt vaere lidt stride.

Interfaces er helt standard hvis man vil decouple fra implementationen.

DAL er helt standard hvis man vil decouple fra persisterings teknologi og/eller persistering targt.
Avatar billede simsen Mester
01. februar 2012 - 09:01 #5
Arne
Sikkert dumt spørgsmål - men har ikke hørt om IFoobarService - er det en webservice? Og ikke mindst - kender du nogle tutorials i opbygningen af IFoobarService?

Janus
Jeg kan ikke svare så "nørdsk" som Arne, men det jeg har læst mig frem til, er at det er pænest at adskille tingene, så hvis såfremt, jeg senere skulle finde på at lave anden "klient" i et projekt, så er det nemmere at implementere, hvis jeg har adskilt tingene med et interface. Og ja, jeg kan også se det smarte i det. For et års tid siden lavede jeg et webprojekt, som er helt standalone. Dette projekt, har jeg da overvejet at lave også som en winprojekt. Men kan jo nu se, at jeg skal igennem rigtig meget én gang til, fordi jeg ikke har adskilt tingene.

Mht. Orm, så har jeg bestemt overvejet dette. Jeg kan se rigtig mange fordele. Men har så også her på arbejdet fået et projekt, hvor LLBLGen Pro bliver brugt......og den bliver det bare aldrig, jeg selv personligt kommer til at bruge. Jeg overvejer i stedet NHiberNate, hvor jeg (når jeg får tid) har kig på NHDesigner fra mindescapehg og VisualParadigm.
Avatar billede arne_v Ekspert
01. februar 2012 - 16:04 #6
Foobar er bare en place holder.

Erstat Foobar med Appendix.
Avatar billede arne_v Ekspert
01. februar 2012 - 16:05 #7
Entity Framework som kommer indbygget i .NET eller NHibernate var nok de mest oplagte ORM's idag.


Og jeg vil ikke lade DAL bortfalde p.g.a. ORM, men lade DAL blive lidt simplere.
Avatar billede janus_007 Nybegynder
01. februar 2012 - 21:04 #8
Hej Simsen

Det er altid en god idé at adskille tingene, men desværre kan det også medføre unødig kompleksitet og derved både forlænge projektet og endnu værre... hotfixes som udføres "out-of-layer" fordi man ikke lige orker eller måske kan programmere en bestemt funktionalitet i det pågældende layer, derudover kan der hurtigt opstå koderedundans og performanceissues.

At adskille tingene er ikke nødvendigvis at køre en stram n-layer som mange tror, men derimod at udvikle med en langt mere simplificeret tilgang, overholde unit-of-work og opbygge en god domain model.

Jeg vil naturligvis stadig beholde præsentation og service/ domainet, men...

Jeg vil modsat Arne, totalt undlade at fylde mit DAL / repository op med overflødige funktioner når der arbejdes med en ORM. Jeg ville i langt større grad benytte IQueryable og undlade alle de har "dumme" funktioner eks.vis GetPersonById(int id) {....} , men altså blot lade det være tilgængeligt i servicelaget.
Funktioner som eks.vis GetSomeFooFromDB(int x, string y) som i bund og grund bare skal hente noget udfra en tabel eller 2 vil jeg slet ikke placere noget sted, men bare udvikle den i domain modellen, ingen grund til noget koderendundans ned til at  et repository/ dal.

Mere komplicerede udtræk som måske GetLatestSaleByAreaGroupedByManager, ville jeg måske smide i et repository/ dal, men der skal virkelig være en god grund til det.

Studér begreber som YAGNI og DRY :)

Jeg ved godt min approach er lidt atypisk, men klog af skade.
Avatar billede arne_v Ekspert
02. februar 2012 - 01:52 #9
Der er ingen grund til at tro at skarp lag opdeling skulle give mere redundans. Tvaertimod - naar ting skal vaere et bstemt sted er det langt nemmere at genbruge. DRY er for lag opdeling.

Men YAGNI er naturligvis imod lag opdeling indtil man har brug for det.

Og jeg er helt enig i at "vi bruger altid 3 lag - Pl, BLL og DAL" er en alt for rigid model.

Der er ikke nogen grund til at tilfoeje kompleksitet, hvis man aldrig faar brug for de fordele man faar ved det.

Jeg er dog langtfra nogen YAGNI tilhaenger.

Det er der flere grunde til:
* det er normalt meget billigere at lave den forkromede struktur fra start af end at refaktorere senere
* det meste kode lever langt laengere end oprindeligt antaget - regn med at koden skal bruges i 10-25 aar - det er totalt umuligt at sige at man ikke faar brug for noget i loebet af saa lang en periode
* der er en stor sandsynlighed for at naar systemer vokser senere, saa er der ikke tid til at lav den rigtige refaktorering men at man maa hacke det indtil det er spagetti
Avatar billede janus_007 Nybegynder
02. februar 2012 - 22:45 #10
Hej Arne

Jeg tror nu nok også vi grundliggende er enige, det handler om at komme godt fra start med en fornuftig struktur som kan bære produktet i mange år frem og med mange nye featuretilføjelser.

Jeg er heller ikke 100% tilhænger af YAGNI, jeg nævnte den fordi enhver udvikler bør kende til konceptet og man kan spare sig for meget kompleksitet når man lige træder 2 skridt tilbage, især hvis man skulle være så uheldig at fortabe sig i "nice to have"-features :)
Avatar billede simsen Mester
03. februar 2012 - 08:43 #11
Tak for svar til jer begge. Jeg har fået en del input, jeg vil tænke videre over og vende frygtelig retur, når jeg skal starte med at implementere.

Smid et svar Arne, da jeg på nuværende tidspunkt tror, det bliver din metode 1 eller 2, jeg kommer til at bruge :-)
Avatar billede arne_v Ekspert
03. februar 2012 - 16:08 #12
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
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