IoC - har man brug for et framework?

by Jesper juni 11, 2008 15:45

Arbejder man med MVP pattern i sine webapplikationer, har man en øget mulighed for at gøre sine WebForms testbare. Man kan teste sin kode i et isoleret miljø, og mocke sine afhængigheder, så man på den måde kan kontrollerer input til sit forventede output. Jeg har hidtil afkoblet de forskellige afhængigheder ved at bruge Constructor Injection, og det har fungeret fint, i både ny og eksisterende kode. I ny kode, er det jo let at lave en konstruktør, der tager alle afhængige objekter som parametre, og gøre den parametreløse konstruktør privat, og i eksisterende kode, at implementerer afhængighedskonstruktøren, og så kalde den fra den parametreløse konstruktør via "Poor mans Dependency Injection":

[code=csharp]public class MyObject { private IModel m_model; public MyObject() : this(new ConcreteModel()) { } public MyObject(IModel model) { m_model = model; } }[/code]

Den løsning, har den fordel, at man får gjort klassens afhængigheder klart i konstruktøren, og kommunikerer en slags kontrakt til klienten. Problemet med denne løsning, er bare at man overtræder indkapslings princippet i OOP. Det er pludselig klientens problem at instantierer en IModel før den kalder konstruktøren. Det er selvfølgelig en lille ting, og man kan jo gøre den afhængige konstruktør internal, så den kun kan ses af test-klasserne. Fint nok, men det stinker stadig...

Hvad så med at se lidt på hvordan MS, har løst problemet, i System.Web? Her bruges i vid udstrækning en Service Locator med en Singleton. Se f.eks. på Membership-klassen. Den bruges til at lokaliserer en MembershipProvider, som angivet i web.Config, og gør det muligt for os at bruge de forskellige funktionaliteter igennem et ensartet og fuldstændigt indkapslet. På den måde, er det jo også muligt at indsætte mock'ede objekter i sine unittests på projektniveau. Man kan altså skrive sine tests, uden at skulle instantierer afhængighederne inden kald til konstruktøren - det vil bringe test-kode endnu tættere på produktions-kode. Ud over test aspektet, så får man jo også en afkobling af afhængigheder, der gør at applikationen kan være noget letere at vedligeholde, og skalerer i fremtiden.

Det bringer mig frem til pointen i denne post: Har man behov for et framework, som StructureMap eller Windsor Container?
Ja det kommer vel an på hvor mange steder man bruger den form for afkobling. Er der kun tale om at man bruger et par DataProvidere, kan det virke lidt som overkill, men har man først fået mønstret lidt ind under hude, så kan man altså spare en del "blikenslager-kode" som jeg ser det.
IoC frameworks er et af de helt store buzz-words i dag, men har du erfaring med IoC frameworks på mindre web-applikationer? Hvis ja, så smid en kommentar, for jeg leder stadig med lys og lygte til det rigtige mix i de systemer jeg har fingrene i.

Tags:

Kommentarer

12-06-2008 13:23:38 #

Nis Wilson Nissen

Prøv at checke Unity ud:

Screencast:
www.pnpguidance.net/.../...ctionIoCScreencast.aspx

samt flere her:
http://www.pnpguidance.net/Screencasts.aspx

Unity på MSDN:
msdn.microsoft.com/en-us/library/cc468366.aspx

Cheers,
Nis

Nis Wilson Nissen Denmark

12-06-2008 19:07:17 #

Signe

Vi bruger StructureMap. Jeg kan faktisk ikke fatte at man kan forestille sig at vedligeholde, bare et lille site, uden IoC-framework. Alternativet er håndkodede factory-klasser, der læser i web.config. Hver eneste MVP-triade, skal i princippet havde to factories, og to sæt settings i web.config - Forestil dig et site med 10 sider (mega site???), det vil have 20 factories, og en settings sektion på 200 linier...uark!
Så min anbefaling, er at du skal komme i gang med det samme....og vælg så StructureMap Wink

Signe Denmark

13-06-2008 08:37:31 #

Jesper

Jeg har set diverse web-casts, og læst artikler om emnet, men jeg savner lidt feedback fra folk der virkelig bruger IoC-frameworks. Jeg har som sagt brugt modellen med web.config og en statisk locator-klasse. Det fungerer fint, men jeg er nok begyndt at føle lidt som Signe beskriver; Jeg kan forudse et kæmpe arbejde i at lave disse ensartede klasser hele tiden.
Nogen med erfaring, og som evt foretrækker et framework frem for et andet (argumenter - ikke religion).

Jesper Denmark

23-06-2008 00:07:31 #

Jakob Andersen

@Jesper: Du er ikke den første der tænker det prøv at læse her: kohari.org/.../

@Signe: Hvorfor vil du anbefale StructureMap fremfor andre IoC frameworks?

Jakob Andersen Denmark

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS